Skip to content

Instantly share code, notes, and snippets.

@oiuww09fn
Created March 4, 2014 10:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save oiuww09fn/9343889 to your computer and use it in GitHub Desktop.
Save oiuww09fn/9343889 to your computer and use it in GitHub Desktop.
Robot Framework documentation

创建测试文件

1 测试文件语法

1.1 测试用例文件和目录的组织层次结构

  • 测试用例在测试用例文件中创建;
  • 一个测试用例文件自动的创建一个包含文件中所有测试用例的测试集;
  • 一个包含测试用例文件的目录构成一个更高级的测试集,这个测试集(目录)包含每一个测试用例文件形成的子测试集;
  • 测试集目录可以包含子测试集目录,子测试集目录又可以包含孙子测试集目录,只有需要,可以嵌套多层;
  • 测试集目录可以有一个特殊的初始化文件(init.txt,类似于python)。

此外:测试库包含最低级的关键字;资源文件包含变量和更高级的用户自定义关键字;变量文件提供比资源文件更灵活的定义变量的形式。

###1.2 支持文件格式

Robot Framework的测试数据被定义为表格形式,支持HTML\TSV\reST\Txt(从2.7.6开始,txt文件后缀名可以为.robot,方便与普通txt文件区分)。Robot Framework根据文件后缀判断文件类型,进行解析。后缀名不区分大小写。

因为txt文件可以很方便的用各种编辑器编辑,并且能很好的进行版本控制,所以它成为了使用最多的数据格式。

注:本文推荐使用txt文件,并且本文暂且只详细讲解txt文件的书写规范。

最最基本的,txt文件中单元格的分隔符有两种:两个或多个空格;前后有空格的管道符。测试用例文件中可包含四个表格:Settings\Variables\Test Cases\Keywords,每个表格名称前必须有至少一个星号。第一个表之前的任何东西都会被忽略,但最好不要在前边瞎写东西,别找麻烦。

推荐:用四个单元格作为分隔符,像python那样;表头格式:*** Settings ***;所有文件编码都用UTF-8。

注:使用空格做分隔符时,所有有意义的空格都要通过反斜线或者${SPACE}全局变量转义。

在一个txt文件中分隔符空格和管道可以混用,但在一行中只能用其中一种。用管道分隔的行,行首的管道符必须有,结尾的可有可无。管道符的两侧至少有一个空格(开头和结尾的管道符除外)。

###1.3 测试用例表格:

  • Setting table:导入测试库、资源文件、变量文件,为测试集和测试用例定义元数据。有效的表名:Settings\Setting\Metadata。

  • Variable table:定义变量,此处变量可用在测试数据的其他地方。有效表名:Variables\Variable。

  • Test case table:创建测试用例。有效表名:Test Cases\Test Case。

  • Keyword table:用低级别关键字创建更高级关键字。有效表名:Keywords\Keyword\User Keyword\User Keywords。

###1.4 解析测试数据的规则:

Robot Framework在解析数据的时候,以下数据将被忽略

  • 第一个单元格不是以1.1.3中有效表名开头的所有单元格。
  • 表格第一行除了第一个单元格的所有东西。
  • 第一个表前面的所有数据。如果数据格式允许表格之间存在数据,这些数据也被忽略。
  • 所有空行。(在测试数据中适当加空行,可增加测试用例文件可读性)
  • 行末的所有非转义空单元格。
  • 所有单独的反斜杠(\)。(输入单反斜杠用\)
  • #号后的所有字符。(井号用于注释)
  • 在用HTML\reST时,所有与格式定义相关的数据。

被Robot Framework忽略的数据不会显示在测试结果报告中,大部分Robot Framework的第三方工具也会忽略这些数据。所以想使某些信息出现在结果报告中,要写成documentation或者测试用例测试集的元数据,或者用内置关键字Log。

处理空格

Robot Framework处理空格的方式和HTML源码中空格处理方式是一样的:

  • 换行符、回车和制表符被转换成空格。
  • 所有单元格开头结尾的空格被忽略。
  • 连续多个空格转换为一个空格。

除此之外,非换行空格被普通空格替换。这样避免了当一个非换行空格意外地被作为一个普通空格使用时难以调试的问题。如需换行符、回车、制表符、非换行空格时请使用转义序列:\n,\r,\t,\xA0。

转义

Robot Framework中转义字符为反斜杠(\),另外内置变量${EMPTY}和${SPACE}也常被用来做转义。

转义特殊字符: $, @, %, #, =, |, \

两/四/八位十六进制字符: \xhh, \uhhhh, \Uhhhhhhhh(从2.8.2版本开始)

注:

    所有字符串都是Unicode字符串,如果需要byte strings,需用关键字Encode String To Bytes显示转换。
    如果\x,\u,\U后跟无效的十六进制值,得到的结果是去掉反斜杠后的字符串。
    跨平台的换行符可用内置变量${\n}实现。
    紧跟\n后的未转义空格将被忽略。
    在txt文件中空单元格都要用\或${EMPTY}转义,特别注意for循环从第二行开始每行第一个单元格都要用反斜杠转义。

将测试数据拆分为多行

如果测试数据写成一行太长,可以拆分为多行,使用省略号(...)。在测试用例和用户关键字表格中,省略号前必须至少有一个空单元格。在设置和变量表中,省略号可直接放在表名下面。所有表格中,省略号前的所有单元格都将被忽略。

此外,一个单独的值也可以写成多行,在执行时Robot Framework会自动将多行合并成一行。从2.7开始,如果documentation和测试集元数据被分为多行,那它们的实际效果就是多行。

2 创建测试用例

###2.1 基本语法

测试用例是在测试用例表格中用关键字组织起来的。理论上关键字可以使测试库、资源文件或者在关键字表格中定义的关键字,但推荐使用资源文件或者关键字表格中定义的用户关键字,不推荐使用测试库提供的基本关键字(这句原文档没有,把测试库提供的关键字组织成高级别的通俗易懂的关键字,这样测试用例读起来也容易)。

测试用例表格第一列是case name,后变的列可以是关键字或者变量。有返回值的关键字,如果想获得返回值那就在关键字前面一个表格提供一个临时变量名称。

测试用例表格中可有以下几种设置项:[Documentation] [Tags] [Setup] [Teardown] [Template] [Timeout]

看单词就能猜出他们都是干什么的吧:

  • 第一个Documentation是给测试用例加注释的,但好的测试用例不需要只是,所以它基本没用;
  • 第二个Tags,加标签的;
  • 第三四个效果同python unittest中的setup、teardown,测试前后执行,用于准备恢复测试环境;
  • 第五个Template,这个设置后跟某个需要传参数的关键字,后边值提供一组组参数就行,是为数据驱动;Timeout设置超时。

注:设置名称用中括号括起来,总是在一行的第二个单元格,也就是第二列,后面几列跟值。

设置表格中与测试用例相关的设置:

Force Tags,Default Tags,Test Setup,Test Teardown,Test Template,Test Timeout 这些设置会被测试用例中的相应设置覆盖。特别要说的是,Test Setup和Test Teardown会在每条case开始结束都运行一遍!

###2.2 使用参数

传参数,关键字后跟两个以上空格,然后要传几个参数就写几个单元格就行了。有些参数有默认值,可传值也可不传,方法和普通的一样。实际上所有参数都可以有默认值,但带默认值的参数后边不能再有其他参数。另外Robot Framework支持可变数目的参数,在定义时可变数量的参数前带星号,并且这种参数必须放最后。

另外还有一种参数叫命名参数,它和默认参数相似,只不过等号后可不带默认值。

带默认值的参数和命名参数传值的时候可用=形式,比如有三个命名参数时,可以不管前两个,直接给第三个参数赋值。另外命名参数是大小写敏感的,并且等号两边不能随便加空格。使用命名参数时,${}都不要了,直接写里面的参数名=参数值,如${one}, 传值时直接写one=hello。

# TODO named arguments

Free keyword arguments,这种参数和可变数目参数对应,可变数目参数传递的是一个序列,而这种参数传递一个字典。在定义时前面带两个星号。从版本2.8.3开始,支持所有类型测试库,但暂且不支持用户关键字。

###2.3 失败

一个测试用例执行失败,一般正常情况下后边的关键字就不执行了,继续执行下条case。当然即使失败,teardown中的关键字也是会执行的。可以使用关键字或设置使测试用例失败时继续执行。

关于Error Messages,大部分关键字带默认的messages,有些特别是带should的关键字可以由用户设置错误信息。从2.8开始错误信息可通过在信息前加HTML来增加HTML信息。

###2.4 测试用例名称和文档

测试用例名称尽可能清晰,通俗易懂,最好不要用到文档。如果一个测试用例需要加文档注释,说明这个测试用例不够好,里面的关键字还需改进。另外,一些原数据,如环境、用户信息最后用标签指定。

###2.5 为测试用例添加标签

使用标签,通常有以下几点好处:

  • tag可以显示在测试报告和日志中,在测试文件中,可为测试用例提供元数据。
  • 用于测试用例的统计(可以给予tag自动收集测试用例总数、pass和fail的测试用例)。
  • 在运行测试用例的时候可以指定某些带特定tag的测试用例执行。
  • 可用于指定测试用例的级别。

设置tag的方法:

  • Force Tags:在Setting table中设置所有case的tags,可用户测试集目录初始化文件中。用次方法,在具体的测试用例中设置的tag就无效了。
  • Default Tags:在Setting table中设置,可被testcase中的tag覆盖。
  • [Tags]:在Test Cases目录中设置。
  • --settag:命令行设置

另外可以通过关键字设置:Set Tags, Remove Tags, Fail and Pass Execution keywords

###2.6 Setup和Teardown

用法:在设置表格中通过Test Setup和Test Teardown设置;在测试用例中通过[Setup]和[Teardown]设置。

Setup、Teardown后一般跟一个关键字,如果需要跟多个关键字有两种方法:定义一个更高级的关键字;使用Run Keywords。注意在设置表格中定义的setup,teardown在每条case运行时都运行一次,如果不希望它们运行,可用case中的setup、teardown覆盖设置表格中的。

###2.7 测试模版

用法:在设置表格中通过Test Template设置;在测试用例中通过[Template]设置。测试用例中的模版会覆盖设置表格中的模版。

如果一个测试用例中设置了测试模版,那这个测试用例就有关键字驱动变为了数据驱动。也就是说只提供关键字的参数就行不用写关键字的名称。关键字模版支持各种参数类型的关键字,包括内嵌式的。测试模版也可与for循环配合使用,循环体中的数据作为参数。

###2.8 三种测试用例形式

  • 关键字驱动:用于测试一个流程,Robot Framework中主要用到的。
  • 数据驱动:通过测试模版设置一个关键字,通常为用户定义的封装了复杂过程的高级关键字,在测试的时候只需提供一组组数据就行。通常用于测试相同的流程不同的输入输出时用到。
  • 行为驱动: # TODO

3 创建测试集

在本文1.1中说了,一个测试用例文件就是包含文件中所有测试用例的测试集,包含测试用例文件的目录是更高级别的测试集,包含测试集目录的目录又是更高级别的测试集,如此目录一层层嵌套,测试级别越来越高。

###3.1 测试用例文件

测试用例文件是最低级别的测试集,里面至少包含一个表Test Cases(当然空文件也行,但那又有什么意义)。理论上,文件中的case个数可以是任意多个,但除了数据驱动外,强烈建议一个测试用例文件中的case最多不要超过10个。(数据驱动只需一个关键字,可提供任意多组参数)

###3.2 测试集目录

测试集目录包含子测试集目录或者测试用例文件,不能直接包含case(这句话有必要吗,怎么直接包含?此题已解,不能再初始化文件中包含)。当一个测试目录被执行的时候,用例文件和子目录按如下方式递归处理:

  • 以点(.)或下划线(_)开头的文件或目录将被忽略。
  • 目录名是CVS的将被忽略(大小写敏感)。
  • 文件扩展名不是html、xhtml、htm、tsv、txt、rst、rest、robot的被忽略(大小写不敏感)。
  • 其他所有文件目录都将被Robot Framework解析。

注:如果一个文件中不包含case,此文件被忽略,程序跳过该文件继续执行,同时一条信息写入syslog。从2.5.5开始可是使用命令行参数--warnonskippedfiles,使该信息已一条warn级别log显示在报告中。

初始化文件

它就和python中的__init__.py差不多,文件名必须是__init__.ext(有效的ext:html、xhtml、htm、tsv、txt、rst、rest、robot),主要作用是为测试集提供设置,该文件中不能包含测试用例。

初始化文件除了可以指定测试集相关设置外,还可以指定一些与test case相关的设置。导入或者创建的变量和关键字是不能再低级别测试集中使用的,如果需共享变量或关键字可以将他们定义在资源文件中。(# TODO)

初始化文件中支持的设置:

  • Documentation,Metadata,Suite Setup,Suite Teardown这些设置用法和在资源文件和测试用例文件中的用法一样。
  • Force Tags:将该目录及子目录下所有测试用例文件中的case强行打上某标签。在低级别测试集或case中设的标签就不起作用了。
  • Test Setup,Test Teardown, Test Timeout:用法和普通文件一样,可被低级别的设置覆盖。
  • Default Tags,Test Template:暂不支持!

###3.3 测试集名称和文档注释

Robot Framework会根据文件和目录名称自己组织测试集名。规则如下:

  • 文件名中扩展名被去掉。
  • 下划线被替换成空格。
  • 将全是小写字母的单词,转换成首字母大写。

注:为使测试用例按期望顺序执行,文件和目录名可包含一个前缀。前缀与有效文件名之间必须有两个下划线,如001__test_one.txt,此文将名被转换为测试集名时,前缀和下划线都被忽略。(例子中的测试集名为Test One)

测试用例名称和文档注释,都可以通过命令行参数--name和--doc被替换。

###3.4 测试集元数据 # TODO

###3.5 测试集Setup和Teardown

上面有介绍,此处不再赘述。特别提醒的是:

  • 如果setup失败了,case直接被标为fail,不再运行case中任何关键字,直接运行teardown;
  • 如果teardown失败了,即使前面全pass,测试用例也会被标为fail;
  • teardown中某一关键字失败了,会继续执行下一关键字,也就是说teardown中每个关键字都会被执行到,不会跳出。
  • 给Setup和Teardown传的keyword名可以是一个变量,这样可以方便的通过命令行设置变量为不同的环境指定不同的setup和teardown。

4 使用测试库

测试库提供最最低级的关键字,这些关键字通常是和被测系统交互的。在实际测试中,通常将测试库关键字组织长更高级别的用户关键字,test case中直接使用用户关键字。

###4.1 导入测试库

测试库是大小写敏感的,所以必须严格按照测试库的原名导入。另外在导入测试库的时候可以为其提供参数,如果需要,方法就和给关键字传参数一样。

导入测试库有以下几种方法:

  • 在设置表格中使用Library导入。(只有在资源文件的Settings中导入的Library才能在其他导入该资源文件的文件中使用)
  • 使用内置关键字Import Library。导入的测试库只在当前测试集中有效,这种方法适用于动态生成的测试库。

测试库的搜索路径和python包的搜索路径一样(如果用java就是java的搜索路径)。可通过命令行参数--pythonpath指定搜索路径。

另外在导入测试库的时候还可以使用物理路径的形式。如果测试库是一个文件,导入的时候必须包含文件扩展名;如果是一个目录,末尾必须有斜线(/)。对于python来说如果测试库是一个python类,那么类名要和模块名相同。这种机制不支持导入JAR和ZIP包。

###4.2 为测试库制定别名

方法:按4.1中方法导入测试库,在后边加入单元格WITH NAME(大小写不敏感),然后再加一个单元格写上别名就行。

如下情况,可考虑为测试库定义别名:

  • 需以不同的参数导入同一个测试库多次。
  • 测试库名太长。
  • 希望通过变量的形式在不同环境导入不同的测试库,并想使用统一的名称。
  • 测试库的原名起的太烂。(当然,这种情况更改测试库的实际名称是中更好的选择)

###4.3 标准库

Robot Framework中提供的标准库如下:

  • BuiltIn
  • Collections
  • Dialogs
  • OperatingSystem
  • Process
  • Screenshot
  • String
  • Telnet
  • XML

BuiltIn库不用手动导入,它是Robot Framework默认导入的,其他的库如果要使用需按4.1中测试库导入方法导入测试库。

另外还有Remote library,支持分布式编程。(# TODO)

5 变量

###5.1 简介

变量是Robot Framework的一个组成特性,它可以用在测试数据的很多地方。一般他们用来给关键字传参数,另外所有的Settings都允许变量作为它们的值。正常情况下,关键字名不能用变量指定,但可以使用内置关键字Run Keyword达到想要的效果。

Robot Framework本身有两种变量:scalars和lists。它们的语法分别为:${SCALAR} and @{LIST}。除此之外,环境变量可直接使用语法:%{VARIABLE}。(大括号是必须的,大括号中可以是任意字符,但强烈推荐中用字母数字下划线和空格!) # TODO environment variables

以下几种情况推荐使用变量:

  • 当测试数据中某字符串经常变化时。使用变量,当字符串变化时只需改动一个地方。
  • 当创建跨平台的测试数据的时候。(例如:变量${RESOURCES}替代c:\resources.txt)因为变量可以很方便的在测试开始的时候通过命令行定义,所以对于跨平台或者本地化测试来说着可以大大简化测试流程开发。(使用命令行设置变量的方法:--variable RESOURCES:/tmp/resources.txt)
  • 当关键字需要一个对象而不是字符串作为参数的时候。
  • 想获取关键字的返回值。
  • 当某值过于长过于复杂的时候,可用变量替代。

###5.2 变量类型

Robot Framework中变量和关键字一样也是大小写不敏感的,并且变量中的空格和下划线将被忽略。但是,建议全局变量全用大写字母,相对局部变量全用小写字母。Much more importantly, though, cases should be used consistently. (# TODO)

标量变量Scalar variables

标量变量就是带$的变量,在测试数据中它们被其所代表的值代替。标量变量最常见的就是作为字符串使用,当然,你也可以将任何值赋给它,包括lists。(语法和shell、Perl相似?没用过他俩)

当一单元格中只有一个标量变量时,该变量被它代表的值代替;当标量变量和其他值在一个单元格时,首先该变量的值被转换为Unicode字符串(调用对象的__unicode__或__str__),然后和其它值拼接在一起。

# TODO note byte sequences

列表变量List variables

像python一样,列表中可以包含字符串,子列表,字典,列表可以很长很长,也可以为空。当在测试数据中使用列表的时候,列表中的每个元素占用一个单元格,也就是说,如果一个列表中有两个元素,那列表占用的那个单元格会被转化成两个单元格,一个单元格存一个元素。注意,包含列表变量的单元格不能再有其它数据。(语法是从Perl抄来的)

访问列表变量中的单个元素和python中访问列表元素是一样的,@{name}[index],index是元素所在的索引,从0开始。

如果每个关键字需多个参数,或者设置表格中某设置需多个参数,可以把列表变量传给它们。其他的,想setup、teardown之类的后面只跟一个关键字的,不能用列表变量。

列表变量可以当标量变量来使,只需将@换为$(注意如果有某标量变量和列表变量同名,那就没辙了,该是谁就是谁吧。命名的时候注意!)。某些对列表操作的关键字只接受标量变量参数,如:Length should be; Append to list; Remove from list...

同时,标量变量也可当列表变量来用,但前提要求标量变量应该为列表类型(list-like)。用法是将$换成@。这种情况主要用于for循环中。

列表变量时可变的,也就是说如果想更改列表又不想破坏原来的列表,应该用Copy List关键字拷贝一个备份。

环境变量Environment variables

语法:%{EVN_VAR_NAME},指向的值必须是字符串类型

环境变量是在测试执行前设置在操作系统中的,在整个测试中的全局变量。OperatingSystem库提供了设置和删除环境变量的关键字:Set Environment Variable和Delete Environment Variable。在测试运行过程中,对某环境变量的更改时无效的。

###5.3 创建变量

创建变量有以下几种方法:

  • 变量表格:Variable table是最常用的一种定义变量的形式,可以定义标量变量和列表变量,语法很简单,变量名 + 值。在变量表格中定义的变量的值只能是字符串,如果想要其他形式的值可以用关键字或者变量文件生成变量。(如果不提供值,默认变量为空。另外可以在变量名后加=)

  • 变量文件:就是一个python文件,里面定义各种变量对象。

  • 从命令行定义变量:个别变量用--variable(-v);变量文件用--variablefile(-V)。从命令行定义的变量时全局变量,并且会覆盖测试文件中的同名变量。如果同时用-v和-V传了变量,-v的变量有最高优先级;如果用-v将统一变量传了多次,后边的优先级高;如果多个变量文件中定义个相同的变量,第一个变量文件的变量有最高优先级。

  • 从关键字返回值:关键字的返回值可以赋给某个变量。这也是关键字之间传递数据的方法。赋值的时候变量在前,关键字在后,变量后面可加=。如果关键字返回一个list,也可以将值赋给几个标量变量。用这种方法得到的变量是局部变量,只在当前作用域生效。

  • 使用Set Test/Suite/Global Variable关键字:设置不同作用域的变量。

###5.4 内置变量 # TODO

系统变量

数字变量:${80} ${3.14} ${-1e-4} # 80, 3.14, -0.0001

布尔类型和空变量

空格和空单元格变量

Robot Framework支持的变量

###5.5 变量优先级和范围

命令行参数和内置参数拥有最高优先升级,并且都是全局变量;变量表格中定义的变量只对当前文件有效,优先级大于资源文件和变量文件中的变量;测试执行过程中设置的变量优先级很高但作用域很小。(注意:从资源文件和变量文件中导入的变量不能用在变量表格中,因为Robot Framework执行的时候,是先处理变量表格的)

###5.6 高级变量特性 # TODO

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment