在 Robot Framework 中,您可以像使用库一样创建一个资源对象吗?

Posted

技术标签:

【中文标题】在 Robot Framework 中,您可以像使用库一样创建一个资源对象吗?【英文标题】:In Robot Framework, can you create one resource object as with libraries? 【发布时间】:2022-01-14 01:15:16 【问题描述】:

在机器人框架中,您可以从库中创建对象。直接从文档中,它看起来像这样。

*** Settings ***
Library    com.company.TestLib    WITH NAME    TestLib

我的问题是你能对资源文件做同样的事情吗?我一直在尝试创建一个 关键字 python 文件,其中包含存储测试开始时间和测试名称的实例变量。我使用测试名称和时间作为 Web 的 javascript 数据文件中的唯一 ID。我看到这两个值都恢复为默认的“空白”,并决定插入一些关于实例 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 类时创建的(如下)。输出中的每一行都添加了 ID,您可以看到它们是不同的。每一个似乎都是在资源文件中创建的一个全新的 python 类实例。

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 这真的是关于保存状态。在单个测试用例之间,我想保留属于整个测试的信息。特别是测试名称和它开始的时间,以便我可以查看操作之间的时间。我可以将所有内容存储在机器人框架测试中并将其作为参数传递给资源文件,但如果资源文件包含所有这些详细信息,则 SRP 会更好。 哦!我可能已经找到了答案。在回答这个问题时,我意识到我没有按照“状态”进行搜索。我现在找到了***.com/questions/34906072/…,这可能是一个解决方案。现在检查。 【参考方案1】:

好的。感谢@Dev 帮助澄清问题。这里的问题是我不会考虑的机器人框架的一个方面。这使我得到了与状态How to Preserve Object state in Robot Framework 相关的非常好的答案。经过一番调查,我成功地解决了我的问题,完整的解释如下。


来自射频文档http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-library-scope

“由于状态会影响关键字的实际行为,因此确保一个测试用例中的更改不会意外影响其他测试用例非常重要。这些依赖关系可能会产生难以调试的问题,例如,当添加新的测试用例并且它们不一致地使用库时。Robot Framework 尝试保持测试用例彼此独立:默认情况下,它会为每个测试用例创建新的测试库实例。"

换句话说,RF 应该为所有测试用例提供新状态是一项设计决策。我看到的行为是该设计决策的直接结果。

就我而言,我在整个任务中使用“测试用例”作为步骤,文档称为机器人流程自动化 (RPA) http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#rpa。所以在我的工作中,我想为 Python 类指定一个更永久的状态。为此,我将 ROBOT_LIBRARY_SCOPE 变量添加到类中。

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 库中,以根据测试用例调整该类的寿命。

【讨论】:

以上是关于在 Robot Framework 中,您可以像使用库一样创建一个资源对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

您如何在 Robot Framework 中编写具有多个标识符的动态元素?

在 Robot Framework 关键字中返回结果?

在 Robot Framework 中运行 Edge 无头模式

Robot Framework 中的静态变量

在 Robot Framework 中返回两个值

在 Robot Framework 中传递 *args