机器人框架库动态导入不是全局的

Syn*_*ync 4 python global-scope dynamic-library robotframework

一些背景

我正在使用Robot Framework with 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")
Run Code Online (Sandbox Code Playgroud)

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

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

问题

我的所有图书馆都有ROBOT_LIBRARY_SCOPE = 'GLOBAL',包括公共图书馆.我的公共库是通过BuiltIn动态导入的,并且定义了全局作用域,但是在一个命令中运行后续测试时似乎超出了作用域.是否有动态导入库的范围超出范围,即使它们具有全局库范围?

从本质上讲,我希望这个公共库始终可以在我的机器人脚本中使用,并让每个自定义库都保持对公共库的引用.如果有更好的方法来完成这个或某种方式来制作我目前正在做的工作,请告诉我!谢谢.

Tod*_*kov 5

解决方案可能是无条件地导入所有自定义库中的公共库.例如在他们的构造函数(__init__())中调用:

BuiltIn().import_library("my_common_lib", True)
Run Code Online (Sandbox Code Playgroud)

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

编辑:想到它,这也可能不起作用,__init__()因为库具有全局范围,所以只调用一次; 因此,常用的关键字将再次不会在套件的命名空间中导入.

输入RF的监听器接口 :):在您的客户库中定义类方法suite_start(),并在其中移动try-except块.在每个使用此类库的套件的开头,将执行该方法,并使用常用关键字 - 可用.
与上面两段相同的预防措施 - 确保重新导入公共库没有副作用.


另一个解决方案可能是将自定义库范围更改为'TEST SUITE',因为您已经自己扣除了(并且根据注释:)不愿意这样做.

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

  • 我认为听众界面是完美的解决方案.谢谢,好发现! (2认同)