在 Robot 框架中,如何在数据驱动方法中执行多个测试用例
In Robot framework, how can I execute multiple of test cases in data driven meithod
我有一组测试场景(比如 10 个),我想针对不同的国家(比如 3 个)执行这些场景。
- for 循环不是首选,因为每个场景的执行时间会更长,并且每个场景 Pass/Fail 都必须进行管理。
- 为每个测试场景创建关键字并按国家调用它们。
- 这会导致 3 个不同的机器人文件,每个国家/地区一个,每个场景有 10 个测试用例
- 任何新的add/remove场景,都需要更新3个文件
- 基于机器人数据驱动程序模板的方法似乎支持每个机器人文件一个测试场景。使用数据文件并动态执行一个数据条目作为一个测试用例
- 这导致 10 个机器人文件每个测试场景一个
- 任何新的测试场景都将是新的机器人文件
- 任何在机器人数据驱动方法中包含更多测试场景的方法
- 您建议针对数据集迭代执行场景的任何其他方法,其中每个迭代结果都是单独捕获的。
我的第一个建议是 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 and it generates test cases dynamically during run time. Only a small library that also acts as a listener is needed. This library can have a start_suite
method that will be invoked and it will get the suite(s) as Python object(s), robot.running.model.TestSuite
. Then you could use this object along with 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
机器人框架 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
关键字,为每个组合生成一个测试用例。这样每个国家/地区都会有一个单独的测试用例 - 测试场景对,同时将所有内容都放在一个文件中。
test.robot:
*** 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
==============================================================================
我有一组测试场景(比如 10 个),我想针对不同的国家(比如 3 个)执行这些场景。
- for 循环不是首选,因为每个场景的执行时间会更长,并且每个场景 Pass/Fail 都必须进行管理。
- 为每个测试场景创建关键字并按国家调用它们。
- 这会导致 3 个不同的机器人文件,每个国家/地区一个,每个场景有 10 个测试用例
- 任何新的add/remove场景,都需要更新3个文件
- 基于机器人数据驱动程序模板的方法似乎支持每个机器人文件一个测试场景。使用数据文件并动态执行一个数据条目作为一个测试用例
- 这导致 10 个机器人文件每个测试场景一个
- 任何新的测试场景都将是新的机器人文件
- 任何在机器人数据驱动方法中包含更多测试场景的方法
- 您建议针对数据集迭代执行场景的任何其他方法,其中每个迭代结果都是单独捕获的。
我的第一个建议是 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 and it generates test cases dynamically during run time. Only a small library that also acts as a listener is needed. This library can have a start_suite
method that will be invoked and it will get the suite(s) as Python object(s), robot.running.model.TestSuite
. Then you could use this object along with 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
机器人框架 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
关键字,为每个组合生成一个测试用例。这样每个国家/地区都会有一个单独的测试用例 - 测试场景对,同时将所有内容都放在一个文件中。
test.robot:
*** 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
==============================================================================