用于数据驱动测试的库。
项目描述
DataDriver 是 Robot Framework® 的数据驱动扩展。本文档说明如何使用 DataDriver 库侦听器。有关安装、支持等信息,请访问 项目页面
有关 Robot Framework® 的更多信息,请参阅https://robotframework.org。
DataDriver 作为库使用/导入,但不提供可在测试中使用的关键字。DataDriver 使用监听器接口版本 3 来操作测试用例,并基于包含数据驱动测试数据的数据文件创建新的测试用例。这些数据文件可能是 .csv 、 .xls 或 .xlsx 文件。
Data Driver 也可以与 Microsoft PICT 合作。用于数据组合测试的开源 Windows 工具。Pict 能够根据文本模型定义生成数据组合。 https://github.com/Microsoft/pict
也可以在 Python 中实现自己的 DataReader 以从其他来源(如数据库或 json 文件)读取测试数据。
安装
如果你已经安装了 Python >= 3.6 并安装了 pip,你可以简单地运行:
pip install --upgrade 机器人框架数据驱动程序
Excel 支持
对于xls或xlsx文件的文件支持,您需要安装额外的 XLS 或依赖项。它包含 pandas、numpy 和 xlrd 的依赖项。只需将 [XLS] 添加到您的安装中。自 3.6 版以来的新功能。
pip install --upgrade robotframework-datadriver[XLS]
蟒蛇2
或者如果您并行安装了 Python 2 和 3,您可以使用
pip3 安装--升级机器人 框架-数据驱动程序
DataDriver 仅在 0.2.7 版本中与 Python 2.7 兼容。
pip install --upgrade robotframework-datadriver==0.2.7
由于 Python 2.7 已被弃用,python 2.7 兼容版本没有新功能。
目录
DataDriver 做什么
DataDriver 是一种使用 Robot Framework® 创建数据驱动测试的替代方法。DataDriver 根据测试模板和 csv 或 Excel 文件的数据内容创建多个测试用例。所有创建的测试共享相同的测试序列(关键字)并且测试数据不同。因为这些测试是在运行时创建的,所以只需在机器人测试规范中指定模板,并且在外部数据文件中指定使用的数据。
RoboCon 2020 演讲
简要概述 DataDriver 是什么以及它在赫尔斯基的 RoboCon 2020 上的工作原理。
替代方法
DataDriver 为内置数据驱动方法提供了一种替代方法,例如:
*** 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 <s>demo</s> ${EMPTY}
Right user wrong pass <s>demo</s> <s>FooBar</s>
Empty user right pass ${EMPTY} <s>mode</s>
Empty user empty pass ${EMPTY} ${EMPTY}
Empty user wrong pass ${EMPTY} <s>FooBar</s>
Wrong user right pass <s>FooBar</s> <s>mode</s>
Wrong user empty pass <s>FooBar</s> ${EMPTY}
Wrong user wrong pass <s>FooBar</s> <s>FooBar</s>
*** Keywords ***
Invalid login
[Arguments] ${username} ${password}
Input username ${username}
Input pwd ${password}
click login button
Error page should be visible
这种内置方法适用于满手数据和满手测试用例。如果您已经生成或计算了数据,特别是如果您有可变数量的测试用例/组合,这些机器人文件会变得非常痛苦。使用 DataDriver,您可以编写相同的测试用例语法,但只编写一次,并从外部数据文件传递数据。
Microsoft® Excel 或 LibreOffice Calc 可用于测试的罕见原因之一…… ;-)
DataDriver 的工作原理
在测试套件中使用 DataDriver 时,它将在测试套件启动之前被激活。它使用 Robot Framework® 的侦听器接口版本 3 来读取和修改测试规范对象。激活后,它会搜索Test Template -Keyword 来分析它拥有的 [Arguments]。第二步,它从指定的数据源加载数据。基于测试模板- 关键字,DataDriver 创建与数据源中的数据集一样多的测试用例。
在数据源为 csv 的情况下(默认)作为Test Template -Keyword 的参数值,DataDriver 从与[Arguments]匹配的名称的 CSV 文件的列中读取值 。对于 CSV 数据表的每一行,将创建一个测试用例。还可以在特定测试套件相关的 CSV 文件中为每个测试用例指定测试用例名称、标签和文档。
用法
Data Driver 是一个“库侦听器”,但不提供关键字。因为 Data Driver 同时是一个监听器和一个库,所以当这个库被导入到测试套件中时,它会将自己设置为一个监听器。
要使用它,只需将它用作套件中的库。您可以使用第一个参数(选项)来设置文件名或数据文件的路径。
如果没有设置任何选项,它会加载一个 .csv 文件,该文件与测试套件 .robot 具有相同的名称和路径。
例子:
*** Settings ***
Library DataDriver
Test Template Invalid Logins
*** Keywords ***
Invalid Logins
...
测试套件的结构
要求
目前有一些要求,必须如何构建测试套件,以便 DataDriver 可以获取所需的所有信息。
只有第一个测试用例将用作模板。所有其他测试用例将被删除。
测试用例必须在设置部分使用 测试模板定义。这样做的原因是,DataDriver 需要知道测试用例参数的名称。测试用例没有命名参数。关键字可以。
用作 测试模板的关键字必须在测试套件中定义(在同一个 *.robot 文件中)。如果用作测试模板的关键字在资源中定义,则 DataDriver 无法访问其参数名称。
示例测试套件
***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} <s>Default</s> <s>UserData</s>
***** *Keywords* *****
Invalid login
[Arguments] ${username} ${password}
Input username ${username}
Input pwd ${password}
click login button
Error page should be visible
在此示例中,DataDriver 通过将其用作库来激活。它与默认设置一起使用。使用关键字无效登录作为测试模板。这个关键字有两个参数。参数名称是${username}和 ${password}。这些名称必须在 CSV 文件中作为列标题。测试用例的名称中包含两个变量名称,这在 Robot Framework® 中没有任何功能。但是,数据驱动程序将使用测试用例名称作为模板名称,并将变量替换为单个生成的测试用例的特定值。此模板测试将仅用作模板。指定数据 Default和UserData仅在未找到 CSV 文件时使用。
数据文件的结构
分钟。必填列
*** 测试用例 ***列必须是第一个。
参数列:对于测试模板 关键字的每个参数,数据文件中必须存在一个列作为数据源。此列的名称必须与变量名称和语法匹配。
可选列
[Tags]列可用于向测试用例添加特定标签。标签可以用逗号分隔。
[Documentation]列可用于添加特定的测试用例文档。
示例数据文件
*** 测试用例 *** |
${用户名} |
${密码} |
[标签] |
[文档] |
---|---|---|---|---|
右用户空通行证 |
演示 |
${空} |
1 |
这是第一个的测试用例文档。 |
正确的用户错误的通行证 |
演示 |
富吧 |
2,3,富 |
这个测试用例分配了标签 2,3 和 foo。 |
${空} |
模式 |
1,2,3,4 |
此测试用例具有基于模板名称生成的名称。 |
|
${空} |
${空} |
|||
${空} |
富吧 |
|||
富吧 |
模式 |
|||
富吧 |
${空} |
|||
富吧 |
富吧 |
在这个数据文件中,定义了八个测试用例。每行指定一个测试用例。前两个测试用例有特定的名称。其他六个测试用例将根据模板测试用例名称生成名称,并替换此名称中的变量。除了第一列之外,列的顺序无关紧要,*** 测试用例 ***
支持的数据类型
一般来说,DataDriver 支持从 DataReader 移交的任何 Object。然而,基于文本的 csv、excel 等阅读器也支持不同的类型。DataDriver 支持 Robot Framework® 标量变量以及字典和列表。它还支持 python 文字评估。
标量变量
前缀$定义单元格中的值采用 Robot Framework® 语法。 String是str,${1}是int并且${None}是 NoneType。前缀仅定义值类型。它还可以用于将标量分配给字典键。查看示例表:${user}[id]
字典变量
可以以不同的方式创建字典。
一种选择是使用前缀&。如果定义的变量是(即&{dict})单元格值的解释方式相同,则可以使用 BuiltIn 关键字Create Dictionary。此处的参数以逗号 ( , ) 分隔。见示例表:&{dict}
另一种选择是在字典语法中定义标量变量,例如${user}[name]或${user.name} 这也可以是嵌套字典。DataDriver 将创建可以使用${user.name.first}访问的 Robot Framework® (DotDict) 字典 请参见示例表:${user}[name][first]
列出变量
可以使用前缀@作为逗号 ( , ) 分隔的列表来创建列表。查看示例表:@{list}
请注意,具有空字符串的列表必须是单元格内容${Empty}。
Python 文字
DataDriver 可以评估文字。它为此使用前缀e。(即e{list_eval})为此它使用BuiltIn Evaluate
参见示例表:e{user.chk}
*** 测试用例 *** |
${标量} |
@{列表} |
e{list_eval} |
&{字典} |
e{dict_eval} |
e{评估} |
${exp_eval} |
${用户}[id] |
${用户}[姓名][第一名] |
${user.name.last} |
e{user.chk} |
一 |
总和列表 |
1,2,3,4 |
["1","2","3","4"] |
键=值 |
{'核心价值'} |
[1,2,3,4] |
10 |
1 |
佩卡 |
克拉克 |
{'id': '1', 'name': {'first': 'Pekka', 'last': 'Klärck'}} |
二 |
应该相等 |
A B C D |
[“A B C D”] |
核心价值 |
{'核心价值'} |
真的 |
${真} |
2 |
埃德 |
曼洛夫 |
{'id': '2', 'name': {'first': 'Ed', 'last': 'Manlove'}} |
三 |
你爸爸是谁 |
!",',$ |
["!",'"',"'","$"] |
z,值,a,值2 |
{'a':'value2','z':'value'} |
{“爸爸”:“勒内”} |
勒内 |
3 |
大图 |
阿尔托 |
{'id': '3', 'name': {'first': 'Tatu', 'last': 'Aalto'}} |
4 |
应该相等 |
1 |
[“1”] |
键=值 |
{'核心价值'} |
1 |
${1} |
4 |
贾尼 |
米科宁 |
{'id': '4', 'name': {'first': 'Jani', 'last': 'Mikkonen'}} |
5 |
应该相等 |
[] |
一个=${2} |
{'a2} |
“细绳” |
细绳 |
5 |
米科 |
科尔佩拉 |
{'id': '5', 'name': {'first': 'Mikko', 'last': 'Korpela'}} |
|
6 |
应该相等 |
[1,2] |
["[1","2]"] |
键=值,键2=值2 |
{'key':'value','key2':'value2'} |
没有任何 |
${无} |
6 |
伊斯莫 |
阿罗 |
{'id': '6', 'name': {'first': 'Ismo', 'last': 'Aro'}} |
从机器人变量访问测试数据
如果需要,可以直接从 Robot Framework® 变量访问获取的数据表。这在测试设置或套件设置中可能会有所帮助。
数据驱动套件中提供了三个变量:
@{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 <s>.xlsx</s>
或者:
*** Settings ***
Library DataDriver <s>file=my_data_source.xlsx</s> <s>sheet_name=2nd Sheet</s>
MS Excel 和键入的单元格
Microsoft Excel xls 或 xlsx 文件有可能键入 thair 数据单元格。数字通常是浮点类型。如果这些数据没有在 Excel 中明确定义为文本,pandas 会将其读取为 excel 中的类型。因为我们必须在 Robot Framework® 中使用字符串,所以这些数据被转换为字符串。这会导致类似“04.02.2019”(2019 年 1 月 4 日)的欧洲时间值在 Iso 时间“2019-01-04 00:00:00”移交给 Robot Framework®。这可能会导致不需要的行为。为了降低这种风险,您应该将基于 Excel 的文件明确定义为 Excel 中的文本。
或者,您可以停用该字符串转换。为此,您必须将选项preserve_xls_types添加到True。在这种情况下,您将获得 str、float、boolean、int、datetime.time、datetime.datetime 和其他一些。
*** Settings ***
Library DataDriver <s>file=my_data_source.xlsx</s> <s>preserve_xls_types=True</s>
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 <s>my_model_file.pict</s>
可以使用导入参数pict_options=为 pict 提供选项。
*** Settings ***
Library DataDriver <s>pict_arg.pict</s> <s>pict_options=/o:3 /r</s>
Glob 文件模式
这个模块实现了一个阅读器类,它为每个与给定 glob 模式匹配的文件或文件夹创建一个测试用例。
使用可选参数“arg_name”,您可以修改将要设置的参数。请参阅文件夹示例。
带有 json 文件的示例:
*** Settings ***
Library DataDriver <s>file=</s>${CURDIR}<s>/DataFiles/*_File.json</s> <s>reader_class=glob_reader</s>
Library OperatingSystem
Test Template Test all Files
*** Test Cases ***
Glob_Reader_Test <s>Wrong_File.NoJson</s>
*** Keywords ***
Test all Files
[Arguments] ${file_name}
${file_content}= Get File ${file_name}
${content}= Evaluate <s>json.loads($file_content)["test_case"]</s>
Should Be Equal ${TEST_NAME} ${content}
文件夹示例:
*** Settings ***
Library DataDriver <s>file=</s>${CURDIR}<s>/FoldersToFind/*/</s> <s>reader_class=glob_reader</s> <s>arg_name=\\</s>${folder_name}
Library OperatingSystem
Test Template Test all Files
*** Test Cases ***
Glob_Reader_Test <s>Wrong_File.NoJson</s>
*** Keywords ***
Test all Files
[Arguments] ${folder_name}
${content}= Get File ${folder_name}<s>/verify.txt</s>
Should Be Equal ${TEST_NAME} ${content}
文件编码和 CSV 方言
CSV 远非精心设计,绝对没有“通用”格式。因此可以定义自己的方言或使用预定义的。默认为 Excel-EU,它是一个分号分隔的文件。这些设置可作为数据驱动程序库的选项进行更改。
文件=
*** Settings ***
Library DataDriver <s>file=../data/my_data_source.csv</s>
无(默认):如果存在与测试套件 *.robot 文件同名的 *.csv 文件,Data Driver 将在测试套件文件夹中搜索
仅文件扩展名:如果您只是设置文件扩展名,如“.xls”或“.xlsx”,DataDriver 将搜索
绝对路径:如果设置了文件的绝对路径,DataDriver 会尝试查找并打开给定的数据文件。
相对路径:如果该选项没有将数据文件作为绝对路径指向,Data Driver 会尝试查找相对于测试套件所在文件夹的数据文件。
编码=
如果不是 cp1252,则必须设置encoding= 。
例子:
cp1252、ascii、iso-8859-1、 latin-1、 utf_8、utf_16、utf_16_be、utf_16_le
cp1252是:
代码页 1252
Windows-1252
Windows 西欧
除了代码点 128-159 (0x80-0x9F) 之外,ISO-8859-1 (Latin-1) 之间的大多数字符都是相同的。这些字符在 cp1252 中可用,而在 Latin-1 中不存在。
€ ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ' ' “” • – — ∼ ™ š › œ ž Ÿ
有关更多编码,请参阅Python 标准编码
方言=
您可以在此处更改 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 =