在 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 关于测试用例的寿命。