机器人框架库动态导入不保持全局
Robot Framework Library Dynamic Import Not Remaining Global
一些背景
我将 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 上下文中是否存在公共库并获取对它的引用,如有必要,首先导入该库。这意味着我在所有其他库中都有对公共库的引用,这意味着每当我在机器人设置中导入我的任何库时 table,我也可以访问公共库关键字。
问题是当运行按顺序测试多个 Robot 时,公共库似乎消失了。我在目录和 运行 "robot *.robot" 中有一些机器人脚本。在每次测试中,我 运行 来自公共库的关键字。我从不在设置 table 中导入公共库,因为它应该由其他库自动导入,如上所述。在第一个测试中,公共库存在并且其中的关键字可以正常工作。在以下所有测试中,我都遇到找不到关键字的错误。当我打印 BuiltIn().get_library_instance(all=True)
的结果时,我可以看到,虽然我的应用程序特定库仍在加载,但公共库不再存在。
问题
我所有的图书馆都有 ROBOT_LIBRARY_SCOPE = 'GLOBAL'
,包括公共图书馆。我的公共库是通过 BuiltIn 动态导入的,并且定义了一个全局范围,但是当 运行 在一个命令中进行后续测试时,它似乎超出了范围。即使动态导入的库具有全局库范围,是否存在超出范围的原因?
本质上,我希望这个公共库在我的机器人脚本中始终可用,并让我的每个自定义库都维护对公共库的引用。如果有更好的方法来完成此操作或使我目前正在做的事情有效,请告诉我!谢谢
一个解决方案可能是无条件地导入所有自定义库中的公共库。例如。在他们的构造函数中(__init__()
)调用这个:
BuiltIn().import_library("my_common_lib", True)
因此您将始终在范围内使用它的关键字。自然地,如果该公共库执行的步骤必须 运行 只有一次(例如,影响某些资源),则必须在其中容纳该步骤(使用单例模式或类似的东西)。
Edit:想想看,这也可能行不通,__init__()
只会被调用一次,因为库是全局范围的;因此,common one 的关键字将再次不会导入到套件的命名空间中。
输入 RF's listener interface :) : 在您的客户库中定义 class 方法 suite_start()
,并在其中移动 try-except 块。在每个使用此类库的套件开始时,都会执行该方法,并且常用关键字可用。
与上面两段相同的预防措施 - 确保重新导入公共库没有副作用。
另一个解决方案可能是将自定义库范围更改为 'TEST SUITE'
,因为您已经扣除了自己(并且不愿意这样做,基于评论:)。
因此自定义库将在套件中的每次导入时重新实例化,并且它们将在套件的命名空间中导入公共库。
一些背景
我将 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 上下文中是否存在公共库并获取对它的引用,如有必要,首先导入该库。这意味着我在所有其他库中都有对公共库的引用,这意味着每当我在机器人设置中导入我的任何库时 table,我也可以访问公共库关键字。
问题是当运行按顺序测试多个 Robot 时,公共库似乎消失了。我在目录和 运行 "robot *.robot" 中有一些机器人脚本。在每次测试中,我 运行 来自公共库的关键字。我从不在设置 table 中导入公共库,因为它应该由其他库自动导入,如上所述。在第一个测试中,公共库存在并且其中的关键字可以正常工作。在以下所有测试中,我都遇到找不到关键字的错误。当我打印 BuiltIn().get_library_instance(all=True)
的结果时,我可以看到,虽然我的应用程序特定库仍在加载,但公共库不再存在。
问题
我所有的图书馆都有 ROBOT_LIBRARY_SCOPE = 'GLOBAL'
,包括公共图书馆。我的公共库是通过 BuiltIn 动态导入的,并且定义了一个全局范围,但是当 运行 在一个命令中进行后续测试时,它似乎超出了范围。即使动态导入的库具有全局库范围,是否存在超出范围的原因?
本质上,我希望这个公共库在我的机器人脚本中始终可用,并让我的每个自定义库都维护对公共库的引用。如果有更好的方法来完成此操作或使我目前正在做的事情有效,请告诉我!谢谢
一个解决方案可能是无条件地导入所有自定义库中的公共库。例如。在他们的构造函数中(__init__()
)调用这个:
BuiltIn().import_library("my_common_lib", True)
因此您将始终在范围内使用它的关键字。自然地,如果该公共库执行的步骤必须 运行 只有一次(例如,影响某些资源),则必须在其中容纳该步骤(使用单例模式或类似的东西)。
Edit:想想看,这也可能行不通,__init__()
只会被调用一次,因为库是全局范围的;因此,common one 的关键字将再次不会导入到套件的命名空间中。
输入 RF's listener interface :) : 在您的客户库中定义 class 方法 suite_start()
,并在其中移动 try-except 块。在每个使用此类库的套件开始时,都会执行该方法,并且常用关键字可用。
与上面两段相同的预防措施 - 确保重新导入公共库没有副作用。
另一个解决方案可能是将自定义库范围更改为 'TEST SUITE'
,因为您已经扣除了自己(并且不愿意这样做,基于评论:)。
因此自定义库将在套件中的每次导入时重新实例化,并且它们将在套件的命名空间中导入公共库。