跳转到主要内容

数据驱动测试库。

项目描述

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

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

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

在赫尔辛基的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的罕见原因之一…… ;-)

查看示例测试套件

查看示例CSV表格

数据驱动器如何工作

当数据驱动器在测试套件中使用时,它将在测试套件开始之前被激活。它使用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.pygeneric_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

基于标签进行过滤。

新增于 0.3.1

可以使用标签来过滤数据源。要使用此功能,必须在数据源中的测试用例分配标签。

Robot Framework® 命令行参数

要过滤源,可以使用 Robot Framework® 的正常命令行参数。有关更多信息,请参阅 Robot Framework® 用户指南。请注意,Robot Framework® 本身的过滤是在调用 DataDriver 之前完成的。这意味着如果模板测试已被 Robot Framework® 过滤,则永远不会调用 DataDriver。如果使用 --include,则 DataDriver 测试套件应具有 DefaultTagForceTag 以满足这些要求。

示例:robot --include 1OR2 --exclude foo DataDriven.robot

基于库选项进行过滤

还可以通过 DataDriver 的初始化选项过滤数据源。如果设置了这些选项,则忽略 Robot Framework® 过滤。

示例

*** Settings ***
Library    DataDriver    include=1OR2    exclude=foo

通过预运行关键字配置数据驱动器

使用 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 (687.8 kB 查看哈希值)

上传时间 源码

构建分发版

robotframework_datadriver-1.11.2-py3-none-any.whl (53.1 kB 查看哈希值)

上传时间 Python 3

支持