数据驱动测试库。
项目描述
DataDriver是Robot Framework®的数据驱动扩展。本文档解释了如何使用DataDriver库监听器。有关安装、支持和其他信息,请访问项目页面
有关Robot Framework®的更多信息,请参阅https://robotframework.org。
DataDriver作为库使用/导入,但不提供可以在测试中使用的关键字。DataDriver使用版本3的监听器接口来操作测试用例,并根据包含数据驱动测试数据的Data-File创建新的测试用例。这些数据文件可能是.csv、.xls或.xlsx文件。
Data Driver还能够与Microsoft PICT合作。这是一个用于数据组合测试的开源Windows工具。Pict能够根据文本模型定义生成数据组合。https://github.com/Microsoft/pict
还可以在Python中实现自己的DataReaders来从数据库或json文件等来源读取测试数据。
安装
如果您已经安装了Python >= 3.6并带有pip,您可以直接运行
pip install --upgrade robotframework-datadriver
Excel支持
为了支持xls或xlsx文件,您需要安装额外的XLS或其依赖项。它包含pandas、numpy和xlrd的依赖项。只需将[XLS]添加到您的安装中。自版本3.6起。
pip install --upgrade robotframework-datadriver[XLS]
Python 2
如果您同时安装了Python 2和Python 3,可以使用以下命令:
pip3 install --upgrade robotframework-datadriver
数据驱动器(DataDriver)在版本0.2.7中仅兼容Python 2.7。
pip install --upgrade robotframework-datadriver==0.2.7
由于Python 2.7已弃用,因此没有针对Python 2.7兼容版本的新功能。
目录
数据驱动器能做什么
数据驱动器是创建数据驱动测试的Robot Framework®的替代方法。数据驱动器根据测试模板和CSV或Excel文件的数据内容创建多个测试用例。所有创建的测试用例共享相同的测试顺序(关键字),但测试数据不同。因为这些测试仅在运行时创建,所以必须指定模板在robot测试规范中,而使用的数据则指定在外部数据文件中。
RoboCon 2020演讲
在赫尔辛基的RoboCon 2020上简要概述数据驱动器是什么以及它是如何工作的。
替代方法
数据驱动器为内置数据驱动方法提供了替代方案,例如
*** Settings ***
Resource login_resources.robot
Suite Setup Open my Browser
Suite Teardown Close Browsers
Test Setup Open Login Page
Test Template Invalid login
*** Test Cases *** User Passwort
Right user empty pass demo ${EMPTY}
Right user wrong pass demo FooBar
Empty user right pass ${EMPTY} mode
Empty user empty pass ${EMPTY} ${EMPTY}
Empty user wrong pass ${EMPTY} FooBar
Wrong user right pass FooBar mode
Wrong user empty pass FooBar ${EMPTY}
Wrong user wrong pass FooBar FooBar
*** Keywords ***
Invalid login
[Arguments] ${username} ${password}
Input username ${username}
Input pwd ${password}
click login button
Error page should be visible
这种方法对于少量数据和少量测试用例来说很好。如果您生成了或计算了数据,特别是如果您有可变的测试用例/组合数量,这些robot文件会变得相当痛苦。使用数据驱动器,您可以一次编写相同的测试用例语法,并从外部数据文件提供数据。
在测试中使用Microsoft® Excel或LibreOffice Calc的罕见原因之一…… ;-)
数据驱动器如何工作
当数据驱动器在测试套件中使用时,它将在测试套件开始之前被激活。它使用Robot Framework®的监听器接口版本3来读取和修改测试规范对象。激活后,它会搜索Test Template -关键字来分析其[Arguments]。作为第二步,它从指定的数据源加载数据。根据Test Template -关键字,数据驱动器根据数据源中的数据集数量创建尽可能多的测试用例。
在数据源是CSV(默认)的情况下,数据驱动器从与[Arguments]匹配名称的CSV文件的列中读取参数值。对于CSV数据表的每一行,将创建一个测试用例。也可以在特定的测试套件相关的CSV文件中指定每个测试用例的名称、标签和文档。
使用方法
数据驱动器是一个“库监听器”,但不提供关键字。由于数据驱动器同时是监听器和库,因此当将此库导入测试套件时,它将自己设置为监听器。
要使用它,只需将其作为库在您的套件中使用即可。您可以使用第一个参数(选项)来设置数据文件的文件名或路径。
如果没有设置任何选项,它将加载一个与测试套件.robot文件具有相同名称和路径的.csv文件。
示例
*** Settings ***
Library DataDriver
Test Template Invalid Logins
*** Keywords ***
Invalid Logins
...
测试套件的结构
需求
在当前时刻,有一些要求关于测试套件的构建,以便数据驱动器能够获取所需的所有信息。
只有第一个测试用例将被用作模板。其他所有测试用例将被删除。
测试用例必须在“设置”部分定义一个测试模板。这样做的原因是,数据驱动器需要知道测试用例参数的名称。测试用例没有命名参数。关键字有。
用作测试模板的关键字必须在测试套件内(在同一*.robot文件中)定义。如果用作测试模板的关键字在资源中定义,数据驱动器将无法访问其参数名称。
示例测试套件
***Settings***
Library DataDriver
Resource login_resources.robot
Suite Setup Open my Browser
Suite Teardown Close Browsers
Test Setup Open Login Page
Test Template Invalid Login
*** Test Case ***
Login with user ${username} and password ${password} Default UserData
***** *Keywords* *****
Invalid login
[Arguments] ${username} ${password}
Input username ${username}
Input pwd ${password}
click login button
Error page should be visible
在此示例中,通过将其用作库来激活数据驱动器。它使用默认设置。作为测试模板的关键字使用的是Invalid Login。此关键字有两个参数。参数名称为${username}和${password}。这些名称必须作为CSV文件的列标题存在。测试用例的名称中包含两个变量名称,这在Robot Framework®中没有任何功能。然而,数据驱动器将使用测试用例名称作为模板名称,并将变量替换为单个生成的测试用例的具体值。此模板测试将仅用作模板。指定的数据默认值和用户数据仅在未找到CSV文件时使用。
数据文件的结构
最小所需列数
*** 测试用例 ***列必须是最先的。
参数列:对于测试模板关键字的每个参数,数据文件中必须存在一个列作为数据源。此列的名称必须与变量名称和语法匹配。
可选列
[Tags]列可用于向测试用例添加特定标签。标签可以是逗号分隔的。
[Documentation]列可用于添加特定测试用例文档。
示例数据文件
*** 测试用例 *** |
${username} |
${password} |
[Tags] |
[Documentation] |
---|---|---|---|---|
正确用户名空密码 |
demo |
${EMPTY} |
1 |
这是第一个测试用例的测试用例文档。 |
正确用户名错误密码 |
demo |
FooBar |
2,3,foo |
此测试用例被分配了标签2,3和foo。 |
${EMPTY} |
模式 |
1,2,3,4 |
此测试用例的名称是基于模板名称生成的。 |
|
${EMPTY} |
${EMPTY} |
|||
${EMPTY} |
FooBar |
|||
FooBar |
模式 |
|||
FooBar |
${EMPTY} |
|||
FooBar |
FooBar |
在此数据文件中,定义了八个测试用例。每行指定一个测试用例。前两个测试用例有特定的名称。其他六个测试用例将根据模板测试用例的名称生成名称,并在此名称中替换变量。列的顺序无关紧要,除了第一列*** 测试用例 ***。
支持的数据类型
通常,数据驱动器支持从数据读取器传递的任何对象。但是,基于文本的读取器(如csv,excel)也支持不同类型。数据驱动器支持Robot Framework®标量变量以及字典和列表。它还支持python字面量评估。
标量变量
前缀$定义了单元格中的值按Robot Framework®语法取值。字符串是str,${1}是int,${None}是NoneType。前缀仅定义值类型。它还可以用于将标量分配给字典键。参见示例表:${user}[id]
字典变量
词典可以以不同的方式创建。
一个选项是使用前缀 &。如果定义了一个变量(例如 &{dict}),单元格的值将以相同的方式解释,与 创建词典 关键字的作用相同。这里的参数是逗号(,)分隔的。请参阅示例表:&{dict}
另一个选项是以词典语法定义标量变量,例如 ${user}[name] 或 ${user.name}。这也可以是嵌套的词典。DataDriver 将创建 Robot Framework®(DotDict)词典,可以像 ${user.name.first} 这样访问。请参阅示例表:${user}[name][first]
列表变量
可以使用前缀 @ 创建列表,作为逗号(,)分隔的列表。请参阅示例表:@{list}
请注意,空字符串列表必须是单元格内容 ${Empty}。
Python 字面量
DataDriver 可以评估字面量。为此,它使用前缀 e。例如,e{list_eval}。为此,它使用 BuiltIn Evaluate
请参阅示例表:e{user.chk}
*** 测试用例 *** |
${scalar} |
@{list} |
e{list_eval} |
&{dict} |
e{dict_eval} |
e{eval} |
${exp_eval} |
${user}[id] |
${user}[name][first] |
${user.name.last} |
e{user.chk} |
One |
Sum List |
1,2,3,4 |
["1","2","3","4"] |
key=value |
{'key': 'value'} |
[1,2,3,4] |
10 |
1 |
Pekka |
Klärck |
{'id': '1', 'name': {'first': 'Pekka', 'last': 'Klärck'}}} |
Two |
Should be Equal |
a,b,c,d |
["a","b","c","d"] |
key,value |
{'key': 'value'} |
True |
${true} |
2 |
Ed |
Manlove |
{'id': '2', 'name': {'first': 'Ed', 'last': 'Manlove'}}} |
Three |
Whos your Daddy |
!,",',$ |
["!",'"',"'","$"] |
z,value,a,value2 |
{'a': 'value2', 'z': 'value'} |
{'Daddy' : 'René'} |
René |
3 |
Tatu |
Aalto |
{'id': '3', 'name': {'first': 'Tatu', 'last': 'Aalto'}}} |
4 |
Should be Equal |
1 |
["1"] |
key=value |
{'key': 'value'} |
1 |
${1} |
4 |
Jani |
Mikkonen |
{'id': '4', 'name': {'first': 'Jani', 'last': 'Mikkonen'}}} |
5 |
Should be Equal |
[] |
a=${2} |
{'a':2} |
"string" |
string |
5 |
Mikko |
Korpela |
{'id': '5', 'name': {'first': 'Mikko', 'last': 'Korpela'}}} |
|
6 |
Should be Equal |
[1,2] |
["[1","2]"] |
key=value,key2=value2 |
{'key': 'value', 'key2': 'value2'} |
None |
${none} |
6 |
Ismo |
Aro |
{'id': '6', 'name': {'first': 'Ismo', 'last': 'Aro'}}} |
从Robot变量访问测试数据
如果需要,可以直接从 Robot Framework® 变量访问获取的数据表。这可以在测试设置或套件设置中很有用。
在 Data-Driven 套件中有三个变量可用
@{DataDriver_DATA_LIST}
作为套件变量的列表,包含每个被选中执行测试用例的机器人词典。
[
{
"test_case_name": "Right user empty pass",
"arguments": {
"${username}": "demo",
"${password}": "${EMPTY}"
},
"tags": [
"1"
],
"documentation": "This is a test case documentation of the first one."
},
{
"test_case_name": "Right user wrong pass",
"arguments": {
"${username}": "demo",
"${password}": "FooBar"
},
"tags": [
"2",
"3",
"foo"
],
"documentation": "This test case has the Tags 2,3 and foo"
},
{
"test_case_name": "Login with user '${EMPTY}' and password 'mode'",
"arguments": {
"${username}": "${EMPTY}",
"${password}": "mode"
},
"tags": [
"1",
"2",
"3",
"4"
],
"documentation": "This test case has a generated name based on template name."
},
{
"test_case_name": "Login with user '${EMPTY}' and password '${EMPTY}'",
"arguments": {
"${username}": "${EMPTY}",
"${password}": "${EMPTY}"
},
"tags": [
""
],
"documentation": ""
},
{
"test_case_name": "Login with user '${EMPTY}' and password 'FooBar'",
"arguments": {
"${username}": "${EMPTY}",
"${password}": "FooBar"
},
"tags": [
""
],
"documentation": ""
},
{
"test_case_name": "Login with user 'FooBar' and password 'mode'",
"arguments": {
"${username}": "FooBar",
"${password}": "mode"
},
"tags": [
"foo",
"1"
],
"documentation": ""
},
{
"test_case_name": "Login with user 'FooBar' and password '${EMPTY}'",
"arguments": {
"${username}": "FooBar",
"${password}": "${EMPTY}"
},
"tags": [
"foo"
],
"documentation": ""
},
{
"test_case_name": "Login with user 'FooBar' and password 'FooBar'",
"arguments": {
"${username}": "FooBar",
"${password}": "FooBar"
},
"tags": [
"foo",
"2"
],
"documentation": ""
}
]
这可以在 Robot Framework® 中像通常那样访问。
${DataDriver_DATA_LIST}[2][arguments][\\${password}] 将导致 mode 。
&{DataDriver_DATA_DICT}
作为套件变量的词典,包含与列表相同的数据,测试名称作为键。
{
"Right user empty pass": {
"test_case_name": "Right user empty pass",
"arguments": {
"${username}": "demo",
"${password}": "${EMPTY}"
},
"tags": [
"1"
],
"documentation": "This is a test case documentation of the first one."
},
"Right user wrong pass": {
"test_case_name": "Right user wrong pass",
"arguments": {
"${username}": "demo",
"${password}": "FooBar"
},
"tags": [
"2",
"3",
"foo"
],
"documentation": "This test case has the Tags 2,3 and foo"
},
"Login with user '${EMPTY}' and password 'mode'": {
"test_case_name": "Login with user '${EMPTY}' and password 'mode'",
"arguments": {
"${username}": "${EMPTY}",
"${password}": "mode"
},
"tags": [
"1",
"2",
"3",
"4"
],
"documentation": "This test case has a generated name based on template name."
},
"Login with user '${EMPTY}' and password '${EMPTY}'": {
"test_case_name": "Login with user '${EMPTY}' and password '${EMPTY}'",
"arguments": {
"${username}": "${EMPTY}",
"${password}": "${EMPTY}"
},
"tags": [
""
],
"documentation": ""
},
"Login with user '${EMPTY}' and password 'FooBar'": {
"test_case_name": "Login with user '${EMPTY}' and password 'FooBar'",
"arguments": {
"${username}": "${EMPTY}",
"${password}": "FooBar"
},
"tags": [
""
],
"documentation": ""
},
"Login with user 'FooBar' and password 'mode'": {
"test_case_name": "Login with user 'FooBar' and password 'mode'",
"arguments": {
"${username}": "FooBar",
"${password}": "mode"
},
"tags": [
"foo",
"1"
],
"documentation": ""
},
"Login with user 'FooBar' and password '${EMPTY}'": {
"test_case_name": "Login with user 'FooBar' and password '${EMPTY}'",
"arguments": {
"${username}": "FooBar",
"${password}": "${EMPTY}"
},
"tags": [
"foo"
],
"documentation": ""
},
"Login with user 'FooBar' and password 'FooBar'": {
"test_case_name": "Login with user 'FooBar' and password 'FooBar'",
"arguments": {
"${username}": "FooBar",
"${password}": "FooBar"
},
"tags": [
"foo",
"2"
],
"documentation": ""
}
}
&{DataDriver_TEST_DATA}
作为测试变量的词典,包含当前测试用例的测试数据。此词典还包含在 Test Template 关键字中没有使用的参数。这可以在测试设置和测试用例中中使用。
{
"test_case_name": "Right user wrong pass",
"arguments": {
"${username}": "demo",
"${password}": "FooBar"
},
"tags": [
"2",
"3",
"foo"
],
"documentation": "This test case has the Tags 2,3 and foo"
}
数据源
CSV / TSV(字符分隔值)
默认情况下,DataDriver读取CSV文件。通过编码和CSV方言设置,您可以配置数据源的结构。
XLS / XLSX文件
要使用Excel文件类型,您必须安装包含Extra XLS的DataDriver。
如果您想使用基于Excel的数据源,您只需将文件设置为扩展名或指向正确的文件。如果扩展名为“.xls”或“.xlsx”,DataDriver将将其解释为Excel文件。您可以通过sheet_name选项选择要读取的表。默认设置为0,表示第一个表。您可以使用表索引(0表示第一个表)或表名称(区分大小写)。XLS解释器将忽略所有其他选项,如编码、分隔符等。
*** Settings ***
Library DataDriver .xlsx
或
*** Settings ***
Library DataDriver file=my_data_source.xlsx sheet_name=2nd Sheet
MS Excel和文本单元格
Microsoft Excel xls或xlsx文件有在数据单元格中键入数据的能力。数字通常是浮点型。如果这些数据在Excel中没有明确定义为文本,pandas将读取它在Excel中的类型。由于我们必须在Robot Framework®中处理字符串,这些数据被转换为字符串。这导致欧洲时间值(如“04.02.2019”(2019年1月4日))被传递给Robot Framework®的ISO时间“2019-01-04 00:00:00”。这可能会导致不期望的行为。为了减轻这种风险,您应该在Excel中明确将基于Excel的文件定义为文本。
或者,您可以取消激活字符串转换。为此,您必须将选项preserve_xls_types设置为True。在这种情况下,您将得到str、float、boolean、int、datetime.time、datetime.datetime和其他一些类型。
*** Settings ***
Library DataDriver file=my_data_source.xlsx preserve_xls_types=True
PICT(成对独立组合测试)
Pict可以根据模型文件生成数据文件。https://github.com/Microsoft/pict
文档:https://github.com/Microsoft/pict/blob/master/doc/pict.md
PICT的要求
必须将pict.exe的路径设置为%PATH%环境变量。
数据模型文件的扩展名为“.pict”
PICT模型文件必须使用UTF-8编码
工作原理
如果文件选项设置为扩展名为pict的文件,DataDriver将此文件传递给pict.exe,并让其自动生成扩展名为“.pictout”的文件。该文件将被用作测试生成的数据源。(它是制表符分隔的,并使用UTF-8编码)除了文件选项外,库的所有其他选项都将被忽略。
*** Settings ***
Library DataDriver my_model_file.pict
您可以通过导入参数pict_options=向pict提供选项。
*** Settings ***
Library DataDriver pict_arg.pict pict_options=/o:3 /r
全局文件模式
此模块实现了一个读取器类,为每个与给定glob模式匹配的文件或文件夹创建一个测试用例。
通过可选参数“arg_name”,您可以修改要设置的参数。请参阅文件夹示例。
json文件示例
*** Settings ***
Library DataDriver file=${CURDIR}/DataFiles/*_File.json reader_class=glob_reader
Library OperatingSystem
Test Template Test all Files
*** Test Cases ***
Glob_Reader_Test Wrong_File.NoJson
*** Keywords ***
Test all Files
[Arguments] ${file_name}
${file_content}= Get File ${file_name}
${content}= Evaluate json.loads($file_content)["test_case"]
Should Be Equal ${TEST_NAME} ${content}
文件夹示例
*** Settings ***
Library DataDriver file=${CURDIR}/FoldersToFind/*/ reader_class=glob_reader arg_name=\\${folder_name}
Library OperatingSystem
Test Template Test all Files
*** Test Cases ***
Glob_Reader_Test Wrong_File.NoJson
*** Keywords ***
Test all Files
[Arguments] ${folder_name}
${content}= Get File ${folder_name}/verify.txt
Should Be Equal ${TEST_NAME} ${content}
文件编码和CSV方言
虽然CSV格式有各种规范和实现(见RFC 4180),但不存在正式规范,这允许对CSV文件有广泛的解释。因此,您可以定义自己的方言或使用预定义的。默认为Excel-EU,它是一个分号分隔的文件。这些设置可以更改为数据驱动库的选项。
file=
*** Settings ***
Library DataDriver file=../data/my_data_source.csv
None(默认值):如果测试套件的文件夹中存在与测试套件的*.robot文件同名且扩展名为*.csv的文件,DataDriver将搜索该文件。
仅文件扩展名:如果您只设置了文件扩展名,如“.xls”或“.xlsx”,DataDriver将搜索
绝对路径:如果设置了文件的绝对路径,DataDriver 将尝试找到并打开指定数据文件。
相对路径:如果选项不是指向数据文件的绝对路径,Data Driver 将尝试在测试套件所在的文件夹中寻找数据文件。
编码=
encoding=必须在不是 cp1252 的情况下设置。
示例:
cp1252, ascii, iso-8859-1, latin-1, utf_8, utf_16, utf_16_be, utf_16_le
cp1252是
代码页 1252
Windows-1252
Windows 西欧
ISO-8859-1(拉丁-1)和cp1252之间的大多数字符相同,除了代码点128-159(0x80-0x9F)。这些字符在cp1252中可用,但在拉丁-1中不可用。
€ ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ
有关更多编码,请参阅 Python 标准编码
dialect=
您可以在此更改CSV方言。方言选项可以是以下之一:- Excel-EU - excel - excel-tab - unix - UserDefined
支持的方言
"Excel-EU"
delimiter=';',
quotechar='"',
escapechar='\\',
doublequote=True,
skipinitialspace=False,
lineterminator="\\r\\n",
quoting=csv.QUOTE_ALL
"excel"
delimiter = ','
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\\r\\n'
quoting = QUOTE_MINIMAL
"excel-tab"
delimiter = '\\t'
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\\r\\n'
quoting = QUOTE_MINIMAL
"unix"
delimiter = ','
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\\n'
quoting = QUOTE_ALL
在 Robot Framework® 中的使用
*** Settings ***
Library DataDriver my_data_file.csv dialect=excel
*** Settings ***
Library DataDriver my_data_file.csv dialect=excel_tab
*** Settings ***
Library DataDriver my_data_file.csv dialect=unix_dialect
示例:用户自定义
用户可以完全自定义格式。如果未设置选项,则使用默认值。要注册用户定义的格式,用户必须将选项 dialect 设置为 UserDefined
在 Robot Framework® 中的使用
*** Settings ***
Library DataDriver my_data_file.csv
... dialect=UserDefined
... delimiter=.
... lineterminator=\\n
默认值
file=None,
encoding='cp1252',
dialect='Excel-EU',
delimiter=';',
quotechar='"',
escapechar='\\\\',
doublequote=True,
skipinitialspace=False,
lineterminator='\\r\\n',
sheet_name=0
自定义数据读取器类
您可以将自己的 DataReader 类作为 DataDriver 的插件编写。DataDriver 类从 DataDriver 中调用以返回一个 TestCaseData 列表。
使用自定义 DataReader
在运行时,DataDriver 会动态地将 DataReader 类加载到 DataDriver 中。DataDriver 通过数据文件的文件扩展名或选项 reader_class 来识别要加载的 DataReader。
通过文件扩展名选择读取器
*** Settings ***
Library DataDriver file=mydata.csv
这将从同一文件夹中的 csv_reader.py 加载类 csv_reader。
通过选项选择读取器
*** Settings ***
Library DataDriver file=mydata.csv reader_class=generic_csv_reader dialect=userdefined delimiter=\\t encoding=UTF-8
这将从同一文件夹中的 generic_csv_reader.py 加载类 generic_csv_reader。
创建自定义读取器
建议
请查看现有 DataReader 的源代码,如 csv_reader.py 或 generic_csv_reader.py。
要编写自己的读取器,请创建一个继承自 AbstractReaderClass 的类。
在 __init__ 中,您的类将作为 ReaderConfig 对象获取所有可用的配置。
DataDriver 将调用 get_data_from_source 方法。该方法应从您自定义的源加载数据,并将其存储在 TestCaseData 对象的列表中。这个 TestCaseData 列表将被返回给 DataDriver。
AbstractReaderClass 还有一些可能有用的可选辅助方法。
您可以将自定义读取器与其它文件一起放在 DataDriver 文件夹中,或放在磁盘上的任何位置。在第一种情况下或如果您的自定义读取器在 python 路径中,可以像其他文件一样通过名称使用它。
*** Settings ***
Library DataDriver reader_class=my_reader
如果它在磁盘上的某个位置,则可以使用绝对或相对路径到自定义读取器。自定义读取器的导入规则与导入 Robot Framework® 库的规则相同。路径可以是相对于 ${EXECDIR} 或 DataDriver/__init__.py 的相对路径。
*** Settings ***
Library DataDriver reader_class=C:/data/my_reader.py # set custom reader
... file_search_strategy=None # set DataDriver to not check file
... min=0 # kwargs arguments for custom reader
... max=62
此 my_reader.py 应实现一个继承自 AbstractReaderClass 的类,该类命名为 my_reader。
from DataDriver.AbstractReaderClass import AbstractReaderClass # inherit class from AbstractReaderClass
from DataDriver.ReaderConfig import TestCaseData # return list of TestCaseData to DataDriver
class my_reader(AbstractReaderClass):
def get_data_from_source(self): # This method will be called from DataDriver to get the TestCaseData list.
test_data = []
for i in range(int(self.kwargs['min']), int(self.kwargs['max'])): # Dummy code to just generate some data
args = {'${var_1}': str(i), '${var_2}': str(i)} # args is a dictionary. Variable name is the key, value is value.
test_data.append(TestCaseData(f'test {i}', args, ['tag'])) # add a TestCaseData object to the list of tests.
return test_data # return the list of TestCaseData to DataDriver
请以其他读取器为例。
选择要执行的测试用例
由于在执行过程中通过解析创建的测试用例,无法使用某些 Robot Framework® 方法来选择测试用例。
需要不同方式使用选项的示例
robot 选项 |
描述 |
---|---|
--test |
通过名称选择测试用例。 |
--task |
当执行任务时,是--test的别名。 |
--rerunfailed |
从先前的输出文件中选择失败的测试用例以重新执行。 |
--include |
通过标签选择测试用例。 |
--exclude |
通过标签选择测试用例。 |
按名称选择测试用例
选择单个测试用例
要按精确名称执行单个测试用例,可以执行测试套件并设置全局变量${DYNAMICTEST}的值为要执行的测试用例名称。模式必须是suitename.testcasename。
示例
robot --variable "DYNAMICTEST:my suite name.test case to be executed" my_suite_name.robot
Pabot 使用此功能在 --testlevelsplit 时执行单个测试用例。
选择一系列测试用例
可以使用变量${DYNAMICTESTS}(复数)设置一系列测试用例名称。此变量必须是一个字符串,名称列表必须用管道符(|)分隔。
示例
robot --variable DYNAMICTESTS:firstsuitename.testcase1|firstsuitename.testcase3|anothersuitename.othertestcase foldername
也可以通过例如 Python 代码设置变量@{DYNAMICTESTS}为列表变量。
重新执行失败的测试用例
由于无法直接从命令行使用 --rerunfailed 参数,DataDriver 带来了一个 Pre-Run-Modifier,用于处理此问题。
通常重新执行失败的测试用例有三个步骤。
原始执行
根据原始执行输出重新执行失败的测试用例
将原始执行输出与重新执行输出合并
DataDriver.rerunfailed Pre-Run-Modifier 根据先前的 output.xml 删除所有已通过测试用例。
示例
robot --output original.xml tests # first execute all tests
robot --prerunmodifier DataDriver.rerunfailed:original.xml --output rerun.xml tests # then re-execute failing
rebot --merge original.xml rerun.xml # finally merge results
请注意,在这种情况下,不允许在原始输出文件路径中使用“:”作为字符。如果您想在 Windows 上设置完整路径,如 e:\\myrobottest\\output.xml,则必须使用“;”作为参数分隔符。
示例
robot --prerunmodifier DataDriver.rerunfailed;e:\\myrobottest\\output.xml --output e:\\myrobottest\\rerun.xml tests
通过预运行关键字配置数据驱动器
使用 config_keyword= 可以指定一个在数据驱动开始处理 数据文件 之前将被调用的关键字。一种可能的用法是,如果 数据文件 在数据驱动测试套件执行期间由另一个关键字动态创建,则可以使用 config_keyword= 调用该关键字并将更新的参数(例如 文件)返回到数据驱动库。
配置关键字
可以全局定义或在每个测试套件中单独定义
获取数据驱动从库导入的所有参数,作为一个机器人字典
应返回(更新后的)数据驱动参数作为机器人字典
在 Robot Framework® 中的使用
*** Settings ***
Library OperatingSystem
Library DataDriver dialect=excel encoding=utf_8 config_keyword=Config
Test Template The Keyword
*** Test Cases ***
Test aaa
*** Keywords ***
The Keyword
[Arguments] ${var}
Log To Console ${var}
Config
[Arguments] ${original_config}
Log To Console ${original_config.dialect} # just a log of the original
Create File ${CURDIR}/test321.csv
... *** Test Cases ***,\\${var},\\n123,111,\\n321,222, # generating file
${new_config}= Create Dictionary file=test321.csv # set file attribute in a dictionary
[Return] ${new_config} # returns {'file': 'test321.csv'}
Pabot和数据驱动器
您应使用 Pabot 版本 1.10.0 或更高版本。
仅在 PabotLib 被使用时,DataDriver 才支持 pabot 的 --testlevelsplit。使用 --pabotlib 启用该功能。
使用 pabot 以这种方式时,DataDriver 会自动将测试用例的数量分成大小几乎相同的组。它使用 pabot 的进程数来计算组。当使用 8 个进程和 100 个测试用例时,您将获得 8 个大小为 12 到 13 个测试用例的测试组。这 8 个组然后作为一个块由 8 个进程执行。这大大减少了套件设置和清理的开销。
您可以在三种模式之间切换
Equal:表示它创建大小相等的组
Binary:更复杂。它创建一个容器大小递减以支持更好的平衡。
Atomic:它根本不会对测试用例进行分组,并且真的在单独的线程中运行每个测试用例。
这可以通过库导入中的 optimize_pabot 设置。
示例:
*** Settings ***
Library DataDriver optimize_pabot=Binary
在 40 个测试用例和 8 个线程的情况下,二进制创建的情况如下
P01: 01,02,03,04,05
P02: 06,07,08,09,10
P03: 11,12,13,14,15
P04: 16,17,18,19,20
P05: 21,22,23
P06: 24,25,26
P07: 27,28,29
P08: 30,31,32
P09: 33
P10: 34
P11: 35
P12: 36
P13: 37
P14: 38
P15: 39
P16: 40
项目详细信息
下载文件
下载您平台的文件。如果您不确定要选择哪个,请了解更多关于 安装软件包 的信息。
源分布
构建分发版
robotframework_datadriver-1.11.2.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c75a3b8856e141331e65a22a6bed1a8263221ee6dad821d526f932918576fffd |
|
MD5 | fa6333005332cc2b143fc6a987f3bc65 |
|
BLAKE2b-256 | 6a8c44b57249ba22fd1bc97f654a1e2e26cd88b7c142d82f6242f00959d6c9ca |
robotframework_datadriver-1.11.2-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bb59c81834e58b2e7fa6bafc8180b2d659d2a09d13ecb7c6232da281e23804aa |
|
MD5 | ba41cbcc94141d5e8663ae2fa8c995d5 |
|
BLAKE2b-256 | 4cfd2d79ab59a6ebc8f5f6d20598dcf27a74bd378e05bc55a3f324a6c3c272d8 |