Skip to main content

用于数据驱动测试的库。

项目描述

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 支持

对于xlsxlsx文件的文件支持,您需要安装额外的 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 演讲

https://img.youtube.com/vi/RtEUr1i4x3s/0.jpg

简要概述 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 可用于测试的罕见原因之一…… ;-)

查看示例测试套件

请参阅示例 csv 表

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® 中没有任何功能。但是,数据驱动程序将使用测试用例名称作为模板名称,并将变量替换为单个生成的测试用例的特定值。此模板测试将仅用作模板。指定数据 DefaultUserData仅在未找到 CSV 文件时使用。

数据文件的结构

分钟。必填列

  • *** 测试用例 ***列必须是第一个。

  • 参数列:对于测试模板 关键字的每个参数,数据文件中必须存在一个列作为数据源。此列的名称必须与变量名称和语法匹配。

可选列

  • [Tags]列可用于向测试用例添加特定标签。标签可以用逗号分隔。

  • [Documentation]列可用于添加特定的测试用例文档。

示例数据文件

*** 测试用例 ***

${用户名}

${密码}

[标签]

[文档]

右用户空通行证

演示

${空}

1

这是第一个的测试用例文档。

正确的用户错误的通行证

演示

富吧

2,3,富

这个测试用例分配了标签 2,3 和 foo。

${空}

模式

1,2,3,4

此测试用例具有基于模板名称生成的名称。

${空}

${空}

${空}

富吧

富吧

模式

富吧

${空}

富吧

富吧

在这个数据文件中,定义了八个测试用例。每行指定一个测试用例。前两个测试用例有特定的名称。其他六个测试用例将根据模板测试用例名称生成名称,并替换此名称中的变量。除了第一列之外,列的顺序无关紧要,*** 测试用例 ***

支持的数据类型

一般来说,DataDriver 支持从 DataReader 移交的任何 Object。然而,基于文本的 csv、excel 等阅读器也支持不同的类型。DataDriver 支持 Robot Framework® 标量变量以及字典和列表。它还支持 python 文字评估。

标量变量

前缀$定义单元格中的值采用 Robot Framework® 语法。 Stringstr${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 =