RobotFramework永远不会在python中发布全局类库

时间:2016-06-07 15:49:22

标签: python robotframework

我正在使用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')

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

1 个答案:

答案 0 :(得分:1)

似乎您的真正问题不在于__del__,而是在套件完成运行时需要运行一些代码。虽然__del__似乎是正确的解决方案,但并非如此。 Python并不保证__del__将在所有情况下运行,因此将代码放在那里必须运行是不明智的。

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

来自__del__上的python文档:

  

无法保证为对象调用__del__()方法   解释器退出时仍然存在。

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

如果您希望代码在所有套件运行完毕后运行,并且您运行的是机器人版本2.8.5或更高版本,则可以让库充当侦听器,以响应"关闭"信息。

例如:

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