【问题标题】:Wrapping a test case in Robot Framework in keyword based on the tag of a test根据测试的标签在关键字中包装机器人框架中的测试用例
【发布时间】:2021-04-04 23:31:11
【问题描述】:

Robot Framework 支持两种方式与测试交互和修改测试结构:

  • 访问者内部 API
  • 监听器 API

我想在特定测试之前添加给定关键字,或者更准确地说,如果该测试具有特定标签,则将测试包装在给定关键字中。我应该选择这两种方法中的哪一种,以及我应该如何使用 Body of Robot Framework 的 API 将其包装在 Wait Until Keyword Succeeds 中?

【问题讨论】:

    标签: python robotframework


    【解决方案1】:

    使用 prerunmodifier,您可以在 执行之前修改套件,使用侦听器,您可以在 执行期间修改套件。由于您在执行之前拥有所有可用信息,因此建议使用 prerunmodifier 并事先进行所有修改。

    需要做的是创建一个与需要包装的测试用例具有相同正文的用户关键字。这些是步骤:

    1. 检查test.tags 以获取您的特定标签。
    2. 为测试用例创建一个robot.running.model.UserKeyword 对象。
    3. test.body 复制到ukw.body,有效地将测试用例复制为关键字。
    4. 将新关键字附加到套件资源中可用的关键字 (suite.resource.keywords)。确保每个测试用例的关键字名称都是唯一的。 (这整个步骤是之前版本答案中缺少的链接。)
    5. 清除原test.body
    6. 将调用新创建的用户关键字的Wait Until Keyword Succeeds 添加到test.body

    这将处理 IF/ELSE IF/ELSEFOR 块或它们在嵌套结构中的组合。

    应该实现start_suite访问者函数,因为需要访问suite.resource.keywords对象。

    访问者.py:

    from robot.api import SuiteVisitor
    from robot.running.model import UserKeyword
    
    class Visitor(SuiteVisitor):
    
        def start_suite(self, suite):
            for test in suite.tests:
                if 'WRAP' in test.tags:                                     # step 1.
                    keyword_name = f'Wrapper Keyword For Test:{test.name}'
    
                    ukw = UserKeyword(name=keyword_name)                    # step 2.
                    ukw.body = test.body                                    # step 3.
                    
                    suite.resource.keywords.append(ukw)                     # step 4.
                
                    test.body.clear()                                       # step 5.
                    test.body.create_keyword(                               # step 6.
                        name='Wait Until Keyword Succeeds',
                        args=['10 sec', '2 sec', keyword_name])
    

    示例测试和结果:

    *** Test Cases ***
    Test A
        [Tags]    WRAP
        KW
        Log        step 1
        Log Many    step 2    step 3
        IF    True
            Log    true
        END
        FOR    ${i}    IN RANGE    10
            FOR    ${j}    IN RANGE    10
                Log Many    ${i}    ${j}
            END
        END
    
    Test B
        [Tags]    SMOKE
        Log    1
        Log    1
    
    
    *** Keywords ***
    KW
        Log    1
        Log    2
    

    【讨论】:

    • 漂亮,快到了。您是如何找到有关 robofraemwork api 的所有这些信息的?
    • @Edmondo1984 我读了很多:robot-framework.readthedocs.io/en/latest,我也遇到了困难:stackoverflow.com/q/63491306/3820025。定义用户关键字是我尚未完成的事情,但我还有一些其他想法,只是需要一些时间来评估。
    • 实际上我也可以在遇到问题时使用相同的方法:stackoverflow.com/a/66943191/3820025.
    • 很高兴您通过帮助自己解决我的问题来帮助自己解决问题
    • 你是如何将修饰符传递给 cli 的?我得到错误模块“my_modifier”没有属性“visit_suite”,我想这意味着我还需要以某种方式将类名传递给robotframework?
    【解决方案2】:

    我认为 Listener API 可能是要走的路,但为什么不使用测试和套件设置关键字来实现您想要做的事情。然而,一般来说,即不仅仅是在 Python 或机器人框架中,让一个测试依赖于另一个测试的执行是一个坏主意。理想情况下,每个测试都应该能够独立运行,无论是第一个还是最后一个或序列中的任何位置,因此可能需要重构您的测试和/或关键字才能实现您的尝试。

    【讨论】:

    • 我想我的问题不是很清楚。在这里,我不会根据其他测试进行任何测试,只是使用给定标签进行“检测”的测试,我更大的问题是我不知道如何使用 roboframework API 来实现此检测
    • 好吧,监听器有一个 start_test 可以接受测试数据和正文,所以我想写一些诸如:“如果'my-tag'在 test.body:test.body = wrap(test.body)。还是我应该使用 prerunmodifier?
    猜你喜欢
    • 2016-03-01
    • 2016-04-03
    • 1970-01-01
    • 2015-07-16
    • 2018-07-28
    • 2017-11-14
    • 2019-01-07
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多