4

一些背景

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

到目前为止,我完成此操作的方式一直是我其他库顶部的一些样板。具体来说,在我的其他库中,我有:

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”。在每个测试中,我从公共库中运行一个关键字。我从不在设置表中导入公共库,因为它应该由其他库自动导入,如上所述。在第一个测试中,公共库存在并且其中的关键字工作正常。在以下所有测试中,我得到一个关键字未找到错误。当我打印结果时,BuiltIn().get_library_instance(all=True)我可以看到,虽然我的应用程序特定库仍在加载,但公共库不再存在。

问题

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

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

4

1 回答 1

5

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

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

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

编辑:想一想,这也可能行不通,__init__()因为库是全局范围的,所以只会调用一次;因此,共同的关键字将再次不会被导入套件的命名空间。

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


另一种解决方案可能是将自定义库范围更改为'TEST SUITE',因为您已经扣除了自己(并且不愿意这样做,基于评论:)。

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

于 2018-10-05T04:39:47.040 回答