RobotFramework 从不在 python 中发布全局 class 库

RobotFramework never release global class libraries in python

我在 python 中使用机器人框架。我正在实现一个与所有测试共享的全局库。为此,我使用 ROBOT_LIBRARY_SCOPE = 'GLOBAL'。我的问题是这个库甚至在程序结束时也从未发布过...

from robot.api import logger

class TestLibrary:
  ROBOT_LIBRARY_SCOPE = 'GLOBAL'

  def __init__ (self):
    logger.info ('Create library')

  def __del__ (self):
    logger.info ('Destroy library')

对我来说看起来像个错误,对吧?有人有在程序结束时释放此库的解决方法吗?

看来您的真正问题不在于 __del__,而是您需要 运行 在套件 运行 完成后编写一些代码。虽然看起来 __del__ 是正确的解决方案,但不一定如此。 Python 不保证 __del__ 在所有情况下都是 运行 所以把代码放在那里 必须 是不明智的 运行。

注意:这不是机器人框架的错误,这只是 python 的工作方式。机器人很可能会适当地删除库对象,但如果垃圾收集器在机器人退出之前没有机会 运行,__del__ 就不会 运行。

来自 __del__ 上的 python 文档:

It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.

运行 测试套件末尾的库代码

如果你想在所有套件完成 运行ning 时将代码 运行,并且你是 运行ning 机器人版本 2.8.5 或更高版本,你可以让库执行作为响应 "close" 消息的侦听器。

例如:

from robot.api import logger

class TestLibrary(object):
    ROBOT_LIBRARY_SCOPE = 'GLOBAL'
    ROBOT_LISTENER_API_VERSION = 2

    def __init__(self, *args, **kwargs):
        self.ROBOT_LIBRARY_LISTENER = self
        logger.warn("Create library")

    def _close(self):
        logger.warn("Destroy library")

这会指示机器人在所有测试用例 运行 之后调用您的 _close 方法。在此函数中,您可以执行任何类型的清理或您需要执行的额外处理。

有关详细信息,请参阅机器人框架用户指南中的 Test Libraries as Listeners