首页 > 解决方案 > Robotframework 测试库中的上下文管理器

问题描述

我想将一个测试库嵌入到机器人框架中,该框架本身正在使用上下文管理器库来提供测试数据。

我想知道没有“准备就绪”的功能或 API (对吗?)。我喜欢避免使用 asetup和 ateardown关键字3,因为例如在错误情况下可以跳过 teardown 关键字 -更糟糕的是,它是锅炉代码

在我看来更好的是测试(套件)结束时的自动解构。想象一下,很多测试套件都在使用这个库。在机器人文件中导入库或通过 cli 作为 ListenerInterface 导入库是有意义的,请参见下面的想法。

我正在考虑基于将上下文管理器和方法嵌入到/ api 调用的侦听器接口。(第一次在测试套件 setup/teardown 上,但将这种技术扩展为测试或关键字规模也可能是有意义的。)__enter____exit__start_suiteend_suite

  1. 我是对的,有关于嵌入上下文管理器库的 API 想法,但是(粘合到机器人setup/teardown模型中)?(我只有机会明确定义关键字。)
  2. 是否有一些(其他)想法或技术可以将上下文管理器库嵌入到测试库中?(可能与问题 1 相关,也可能与 github 问题有关。)

这个想法会奏效(可能面临同样问题的人):

from typing import ContextManager
from robot.running.model import TestSuite as TestSuiteModel
from robot.result.model import TestSuite as TestSuiteResult


@library(scope='Test Suite', doc_format='reST')
class MyResourceLib:
    '''
    User Test Library making use of context manager: `MyDBContextManger`
    '''
    ROBOT_LISTENER_API_VERSION = 3

    class __init__(self, some_resource: Optional[MyDBContextManger] = None):
        self.ROBOT_LIBRARY_LISTENER = self
        if not some_resource:
            self.some_resource = MyDBContextManger()
        else:
            self.some_resource = some_resource

    def start_suite(self, data: TestSuiteModel, result: TestSuiteResult) -> None:
        '''
        Robot Library Listener interface v3.
        '''
        assert self.some_resource
        self.some_resource.__enter__()

    def end_suite(self, data: TestSuiteModel, result: TestSuiteResult) -> None:
        '''
        Robot Library Listener interface v3.
        '''
        assert self.some_resource
        self.some_resource.__exit__(None, None, None)

标签: pythonrobotframeworkcontextmanager

解决方案


推荐阅读