在 Robot Framework 中,您可以像库一样创建一个资源对象吗?
In Robot Framework, can you create one resource object as with libraries?
在机器人框架中,您可以从库中创建对象。直接从文档中看,它看起来像这样。
*** Settings ***
Library com.company.TestLib WITH NAME TestLib
我的问题是你能用资源文件做同样的事情吗?我一直在尝试创建一个
关键字 python 文件,其中包含存储测试开始时间和测试名称的实例变量。我在网络的 JavaScript 数据文件中使用测试名称和时间作为唯一 ID。我看到两个值都恢复为默认值 'blank' 并决定插入一些关于实例 ID 变量的打印语句。这就是结果。
var testRuns = {};
testRuns['Test Site 2 2021-12-09 02:09:19.849706']=[];***ID79
testRuns['blank'].push({Case: 'Just Proving the Point.txt', Step: 'Verify Menu HTML', Time: '18970 days, 7:09:19.889702', Status: 'PASS***ID0', Details: 'Actual: Content, Expected: Content'});***ID0
testRuns['blank'].push({Case: 'Find Content Menu.txt', Step: 'Verify Menu HTML', Time: '18970 days, 7:09:19.919697', Status: 'PASS***ID34', Details: 'Actual: Content, Expected: Content'});***ID34
随机生成的 ID 是在构建 python class(如下)时创建的。输出中的每一行都附加了 ID,您可以看到它们是不同的。每个似乎都是在资源文件中创建的 python class 的全新实例。
class kw_DataExtraction:
def __init__(self, primaryFile=defaultFile, secondaryFile=defaultSecondaryFile):
self.dataFile = primaryFile
self.otherFile = secondaryFile
self.currentTestName = "blank"
self.testCaseStart = datetime.fromtimestamp(0)
self.myID = random.randint(0,100)
所以,我尝试了类似下面的内容,它显然不是合法的语法。有没有办法只实例化一次资源并持续使用它?
Resource ./../OQE/DataExtraction.resource WITH NAME dEx
好的。感谢@Dev 帮助澄清问题。这里的问题是我不会考虑的机器人框架的一个方面。这使我得到了一个与状态 相关的非常好的答案。经过一些调查,我能够成功解决我的问题,完整的解释如下。
来自 RF 文档http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-library-scope
"因为状态会影响关键字的实际行为,所以确保一个测试用例中的更改不会意外影响其他测试用例很重要。这种依赖关系可能会产生难以调试的问题,因为例如,当添加新的测试用例并且它们不一致地使用库时。Robot Framework 试图保持测试用例彼此独立:默认情况下,它为每个测试用例创建新的测试库实例。"
换句话说,RF 应该为所有测试用例提供新鲜状态是一个设计决策。我看到的行为是该设计决策的直接结果。
就我而言,我使用“测试用例”作为整个任务中的步骤,文档称之为机器人流程自动化 (RPA) http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#rpa。所以在我的工作中,我想指定 Python class 具有更永久的状态。为此,我将 ROBOT_LIBRARY_SCOPE 变量添加到 class.
class kw_DataExtraction:
ROBOT_LIBRARY_SCOPE = 'SUITE'
有了这个,我重新运行了我的测试,输出在最后显示了相同的 ID 号,并且保留了正确的测试用例名称。谜底揭晓。
var testRuns = {};
testRuns['Test Site 2 2021-12-09 12:13:25.780586']=[];***ID56
testRuns['Test Site 2 2021-12-09 12:13:25.780586'].push({Case: 'Just Proving the Point.txt', Step: 'Verify Menu HTML', Time: '0:00:00.039995', Status: 'PASS***ID56', Details: 'Actual: Content, Expected: Content'});***ID56
testRuns['Test Site 2 2021-12-09 12:13:25.780586'].push({Case: 'Find Content Menu.txt', Step: 'Verify Menu HTML', Time: '0:00:00.070994', Status: 'PASS***ID56', Details: 'Actual: Content, Expected: Content'});***ID56
TL;DR;默认情况下,您不能只创建一个库对象。 RF 中的默认行为是为每个测试用例创建一个新实例。将 ROBOT_LIBRARY_SCOPE 添加到任何 Python 库以调整 class 关于测试用例的寿命。
在机器人框架中,您可以从库中创建对象。直接从文档中看,它看起来像这样。
*** Settings ***
Library com.company.TestLib WITH NAME TestLib
我的问题是你能用资源文件做同样的事情吗?我一直在尝试创建一个 关键字 python 文件,其中包含存储测试开始时间和测试名称的实例变量。我在网络的 JavaScript 数据文件中使用测试名称和时间作为唯一 ID。我看到两个值都恢复为默认值 'blank' 并决定插入一些关于实例 ID 变量的打印语句。这就是结果。
var testRuns = {};
testRuns['Test Site 2 2021-12-09 02:09:19.849706']=[];***ID79
testRuns['blank'].push({Case: 'Just Proving the Point.txt', Step: 'Verify Menu HTML', Time: '18970 days, 7:09:19.889702', Status: 'PASS***ID0', Details: 'Actual: Content, Expected: Content'});***ID0
testRuns['blank'].push({Case: 'Find Content Menu.txt', Step: 'Verify Menu HTML', Time: '18970 days, 7:09:19.919697', Status: 'PASS***ID34', Details: 'Actual: Content, Expected: Content'});***ID34
随机生成的 ID 是在构建 python class(如下)时创建的。输出中的每一行都附加了 ID,您可以看到它们是不同的。每个似乎都是在资源文件中创建的 python class 的全新实例。
class kw_DataExtraction:
def __init__(self, primaryFile=defaultFile, secondaryFile=defaultSecondaryFile):
self.dataFile = primaryFile
self.otherFile = secondaryFile
self.currentTestName = "blank"
self.testCaseStart = datetime.fromtimestamp(0)
self.myID = random.randint(0,100)
所以,我尝试了类似下面的内容,它显然不是合法的语法。有没有办法只实例化一次资源并持续使用它?
Resource ./../OQE/DataExtraction.resource WITH NAME dEx
好的。感谢@Dev 帮助澄清问题。这里的问题是我不会考虑的机器人框架的一个方面。这使我得到了一个与状态
来自 RF 文档http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-library-scope
"因为状态会影响关键字的实际行为,所以确保一个测试用例中的更改不会意外影响其他测试用例很重要。这种依赖关系可能会产生难以调试的问题,因为例如,当添加新的测试用例并且它们不一致地使用库时。Robot Framework 试图保持测试用例彼此独立:默认情况下,它为每个测试用例创建新的测试库实例。"
换句话说,RF 应该为所有测试用例提供新鲜状态是一个设计决策。我看到的行为是该设计决策的直接结果。
就我而言,我使用“测试用例”作为整个任务中的步骤,文档称之为机器人流程自动化 (RPA) http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#rpa。所以在我的工作中,我想指定 Python class 具有更永久的状态。为此,我将 ROBOT_LIBRARY_SCOPE 变量添加到 class.
class kw_DataExtraction:
ROBOT_LIBRARY_SCOPE = 'SUITE'
有了这个,我重新运行了我的测试,输出在最后显示了相同的 ID 号,并且保留了正确的测试用例名称。谜底揭晓。
var testRuns = {};
testRuns['Test Site 2 2021-12-09 12:13:25.780586']=[];***ID56
testRuns['Test Site 2 2021-12-09 12:13:25.780586'].push({Case: 'Just Proving the Point.txt', Step: 'Verify Menu HTML', Time: '0:00:00.039995', Status: 'PASS***ID56', Details: 'Actual: Content, Expected: Content'});***ID56
testRuns['Test Site 2 2021-12-09 12:13:25.780586'].push({Case: 'Find Content Menu.txt', Step: 'Verify Menu HTML', Time: '0:00:00.070994', Status: 'PASS***ID56', Details: 'Actual: Content, Expected: Content'});***ID56
TL;DR;默认情况下,您不能只创建一个库对象。 RF 中的默认行为是为每个测试用例创建一个新实例。将 ROBOT_LIBRARY_SCOPE 添加到任何 Python 库以调整 class 关于测试用例的寿命。