【问题标题】:In Robot framework, how can I execute multiple of test cases in data driven meithod在 Robot 框架中,如何在数据驱动方法中执行多个测试用例
【发布时间】:2021-05-03 22:16:31
【问题描述】:

我有一组测试场景(比如 10 个),我想针对不同的国家(比如 3 个)执行这些场景。

  1. for 循环不是首选,因为每个场景的执行时间会更长,并且必须管理每个场景的通过/失败。
  2. 为每个测试场景创建关键字并按国家/地区调用它们。
    • 这会导致每个国家/地区有 3 个不同的机器人文件,每个场景有 10 个测试用例
    • 任何新的添加/删除方案,都必须更新 3 个文件
  3. 基于机器人数据驱动程序模板的方法似乎支持每个机器人文件一个测试场景。使用数据文件并动态执行一个数据条目作为一个测试用例
    • 这会导致每个测试场景 10 个机器人文件一个
    • 任何新的测试场景都将是新的机器人文件
    • 在机器人数据驱动方法中包含更多测试场景的任何方式
  4. 您建议针对数据集迭代执行场景的任何其他方法,其中每个迭代结果都是单独捕获的。

【问题讨论】:

    标签: variables robotframework data-driven-tests


    【解决方案1】:

    我的第一个建议是Templates with for loops。这样您就不必管理故障,每次迭代都将相互独立。每个数据集都将使用模板执行。请注意,如果一次迭代失败,整个测试用例将被标记为失败,但您将能够检查哪个迭代失败了。

    这是上面例子的代码:

    *** Variables ***
    @{COUNTRIES}    USA    UK
    
    *** Test Cases ***
    Test Scenario 1
        [Template]    Test Scenario 1 Template
        FOR    ${country}    IN    @{COUNTRIES}
            ${country}
        END
    
    Test Scenario 2
        [Template]    Test Scenario 2 Template
        FOR    ${country}    IN    @{COUNTRIES}
            ${country}
        END
    
    Test Scenario 3
        [Template]    Test Scenario 3 Template
        FOR    ${country}    IN    @{COUNTRIES}
            ${country}
        END
        
    *** Keywords ***
    Test Scenario 1 Template
        [Arguments]    ${country}
        Log    ${country}
        Run Keyword If    $country == 'UK'    Fail    Simulate failure.
    
    Test Scenario 2 Template
        [Arguments]    ${country}
        Log    ${country}
        Run Keyword If    $country == 'USA'   Fail    Simulate failure.
    
    Test Scenario 3 Template
        [Arguments]    ${country}
        Log    ${country}
    

    另一个选项基于answer,它在运行时动态生成测试用例。只需要一个小的library that also acts as a listener。这个库可以有一个 start_suite 方法,该方法将被调用,它将套件作为 Python 对象,robot.running.model.TestSuite。然后你可以使用这个对象和Robot Framework's API 以编程方式创建新的测试用例。

    DynamicTestLibrary.py:

    from robot.running.model import TestSuite
    
    class DynamicTestLibrary(object):
        ROBOT_LISTENER_API_VERSION = 3
        ROBOT_LIBRARY_SCOPE = 'GLOBAL'
        ROBOT_LIBRARY_VERSION = 0.1
    
        def __init__(self):
            self.ROBOT_LIBRARY_LISTENER = self
            self.top_suite = None
    
        def _start_suite(self, suite, result):
            self.top_suite = suite
            self.top_suite.tests.clear() # remove placeholder test
    
        def add_test_case(self, name, keyword, *args):
            tc = self.top_suite.tests.create(name=name)
            tc.keywords.create(name=keyword, args=args)
            
        def add_test_matrix(self, data_set, test_scenarios):
            for data in data_set:
                for test_scenario in test_scenarios:
                    self.add_test_case(f'{test_scenario} - {data}', test_scenario, data)
    
    globals()[__name__] = DynamicTestLibrary
    

    Robot Framework 4.0 更新

    由于 4.0 版本中的向后不兼容更改 (Running and result models have been changed),如果您使用 4.0 以上版本,add_test_case 函数应更改如下。

    def add_test_case(self, name, keyword, *args):
        tc = self.top_suite.tests.create(name=name)
         tc.body.create_keyword(name=keyword, args=args)
    

    在机器人文件中添加一个Suite Setup,您可以在其中调用Add Test Matrix 关键字以及国家列表和测试场景,为每个组合生成一个测试用例。这样,每个国家/地区都会有一个单独的测试用例 - 测试场景对,同时将所有内容都放在一个文件中。

    测试机器人:

    *** Settings ***
    Library        DynamicTestLibrary
    Suite Setup    Generate Test Matrix
    
    *** Variables ***
    @{COUNTRIES}    USA    UK
    
    *** Test Cases ***
    Placeholder test
        [Documentation]    Placeholder test to prevent empty suite error. It will be removed from execution during the run.
        No Operation
        
    *** Keywords ***
    Generate Test Matrix
        ${test scenarios}=    Create List    Test Scenario 1    Test Scenario 2    Test Scenario 3
        DynamicTestLibrary.Add Test Matrix    ${COUNTRIES}    ${test scenarios}
    
    Test Scenario 1
        [Arguments]    ${country}
        Log    ${country}
        Run Keyword If    $country == 'UK'    Fail    Simulate failure.
    
    Test Scenario 2
        [Arguments]    ${country}
        Log    ${country}
        Run Keyword If    $country == 'USA'   Fail    Simulate failure.
    
    Test Scenario 3
        [Arguments]    ${country}
        Log    ${country}
    

    这将是控制台上的输出:

    # robot --pythonpath . test.robot
    ==============================================================================
    Test
    ==============================================================================
    Test Scenario 1 - USA                                                 | PASS |
    ------------------------------------------------------------------------------
    Test Scenario 2 - USA                                                 | FAIL |
    Simulate failure.
    ------------------------------------------------------------------------------
    Test Scenario 3 - USA                                                 | PASS |
    ------------------------------------------------------------------------------
    Test Scenario 1 - UK                                                  | FAIL |
    Simulate failure.
    ------------------------------------------------------------------------------
    Test Scenario 2 - UK                                                  | PASS |
    ------------------------------------------------------------------------------
    Test Scenario 3 - UK                                                  | PASS |
    ------------------------------------------------------------------------------
    Test                                                                  | FAIL |
    6 critical tests, 4 passed, 2 failed
    6 tests total, 4 passed, 2 failed
    ==============================================================================
    

    【讨论】:

    • 有一种方法可以从现有测试用例而不是关键字添加新测试用例。类似
       ** 设置 *** 库 DataDriver file=data/countries_data.csv 测试拆解 关闭所有浏览器 *** 变量 *** @{COUNTRIES} 英国新加坡 *** 测试用例 *** Test1生成测试矩阵 test2 *** 关键字 *** 生成测试矩阵 ${测试场景} DynamicTestLibrary.Add 测试矩阵 ${COUNTRIES} ${测试场景} <pre> 
    • @DnD 我想如果你从库中删除这行self.top_suite.tests.clear() # remove placeholder test,它应该可以工作。
    • 它们确实被创建了,但没有被执行。因此想知道我错过了什么.. txs
    • 我不得不将 DynamicTestLibrary.py 中的第 18 行更改为:tc.body.create_keyword(name=keyword, args=args)
    • @karezza 感谢您的评论,我已经用 4.0 版本中所做的更改更新了答案。
    猜你喜欢
    • 2019-04-03
    • 2022-07-20
    • 2021-06-07
    • 2015-04-25
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多