Robot Framework Library动态导入不保持全局

时间:2018-10-04 14:58:38

标签: python robotframework dynamic-library global-scope

一些背景

我正在将Robot Framework与Python结合使用,以创建用于自动化测试的小型框架。我有几个不同的图书馆。一对特定于应用程序,一对具有我希望始终可用的关键字。这个始终可用的库是我的公用库,我也需要可以从其他库中的函数对其进行访问。

到目前为止,我实现这一目标的方式一直是我其他库顶部的样板。具体来说,在我的其他库中,我有:

try:
    self.common_library = BuiltIn().get_library_instance("my_common_lib")
except RuntimeError:
    BuiltIn().import_library("my_common_lib", True)
    self.common_library = BuiltIn().get_library_instance("my_common_lib")

此代码检查当前Robot上下文中是否存在公共库,并获取对其的引用,如有必要,请首先导入该库。这意味着我在所有其他库中都有对公共库的引用,并且意味着每当我在“机器人设置”表中导入任何库时,我也都可以访问公共库关键字。

问题在于,当依次运行多个Robot测试时,公共库似乎消失了。我的目录中有一些Robot脚本,并运行“ robot * .robot”。在每个测试中,我从公共库运行一个关键字。我从未在设置表中导入公共库,因为它应该由其他库自动导入,如上所述。在第一个测试中,存在公共库,并且其中的关键字可以正常工作。在下面的所有测试中,我收到未找到关键字错误。当我打印BuiltIn().get_library_instance(all=True)的结果时,我可以看到,尽管我的应用程序特定的库仍在加载中,但公共库不再存在。

问题

我的所有库中都有ROBOT_LIBRARY_SCOPE = 'GLOBAL',包括公共库。我的公共库是通过BuiltIn动态导入的,并定义了全局范围,但是在一个命令中运行后续测试时,它似乎不在范围之内。即使动态导入的库具有全局库范围,是否也有理由将其排除在范围之外?

基本上,我希望该公共库在我的机器人脚本中始终可用,并让我的每个自定义库都维护对公共库的引用。如果有更好的方法可以完成此任务,或者有某种方法可以使我目前正在工作,请告诉我!谢谢。

1 个答案:

答案 0 :(得分:5)

一个解决方案可能是无条件地将公共库导入所有自定义库中。例如。在其构造函数(__init__()中)称为:

BuiltIn().import_library("my_common_lib", True)

因此,您将始终在范围内使用其关键字。自然地,如果该公共库执行的步骤必须仅运行一次(例如,会影响某些资源),则必须在其中容纳该步骤(使用单例模式或类似方式)。

编辑:想一想,这可能也行不通,__init__()将仅被调用一次,因为这些库具有全局范围;因此,普通人的关键字将不会再次导入套件的名称空间中。

输入RF's listener interface :):在自定义库中定义类方法suite_start(),然后在其中移动try-except块。在使用此类库的每个套件开始时,将执行该方法,并提供通用关键字。
与上述两段相同的预防措施-确保重新导入公共库没有副作用。


另一种解决方案可能是将自定义库的作用域更改为'TEST SUITE',因为您已经演练了自己(并且不愿意这样做,基于注释:)。

因此,将在套件中的每次导入时重新实例化自定义库,并且它们将在套件的名称空间中导入公共库。