variables - 在机器人框架中,我如何在数据驱动方法中执行多个测试用例
问题描述
我有一组测试场景(比如 10 个),我想针对不同的国家(比如 3 个)执行这些场景。
- for 循环不是首选,因为每个场景的执行时间会更长,并且必须管理每个场景的通过/失败。
- 为每个测试场景创建关键字并按国家/地区调用它们。
- 这导致每个国家有 3 个不同的机器人文件,每个场景有 10 个测试用例
- 任何新的添加/删除方案,都必须更新 3 个文件
- 基于机器人数据驱动程序模板的方法似乎支持每个机器人文件一个测试场景。使用数据文件并动态执行一个数据条目作为一个测试用例
- 这导致每个测试场景 10 个机器人文件
- 任何新的测试场景都将是新的机器人文件
- 在机器人数据驱动方法中包含更多测试场景的任何方式
- 您建议针对数据集迭代执行场景的任何其他方法,其中每个迭代结果都是单独捕获的。
解决方案
我的第一个建议是带有 for 循环的模板。这样您就不必管理故障,每次迭代都将相互独立。每个数据集都将使用模板执行。请注意,如果一次迭代失败,整个测试用例将被标记为失败,但您将能够检查哪个迭代失败。
以下是上述示例的代码:
*** 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}
另一个选项基于此答案,它在运行时动态生成测试用例。只需要一个同时充当侦听器的小型库。这个库可以有一个start_suite
将被调用的方法,它将套件作为 Python 对象,robot.running.model.TestSuite
. 然后你可以使用这个对象和Robot Framework 的 API以编程方式创建新的测试用例。
动态测试库.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 版本中进行了向后不兼容的更改(运行和结果模型已更改),add_test_case
如果您使用的是 4.0 以上版本,则功能应更改如下。
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
==============================================================================
推荐阅读
- ios - 开发iOS框架时如何在WKWebView中加载本地HTML文件
- istio - 请解释 Kiali 指标的含义?例如 mops、mB - 见下图 & kiali 作为 Istio v1.1.1 的一部分安装
- r - 在 R 中解析 10 GB XML 文件
- javascript - ParameterDocID 仅获得我的 DocumentUniqueID 的 6 位数字
- python - 用python计算分数的函数
- javascript - 如何从几个可能的 URL 参数之一中获取值?
- python - 是否可以在没有任何导入模块/库的情况下在 Python 中模拟按键
- google-bigquery - BigQuery 标准 SQL - 是否有任何解决方法无法在视图中保存 UDF?
- c# - 在使用 ASP.Net 和 C# 的代码中将数据 URI 设置为 asp:Image
- java - Intellij 没有抱怨 .m2 文件夹中缺少 settings.xml