robot --log custom_log.html --name Custom_Name QuickStart.rst.
--log 指定了log名称,默认为log.html, --name 指定了测试名称,默认为测试数据文件名。
关于pybot参数说明,可以运行pybot --help查看。后续会对这些参数进行详细说明。
上面执行的过程,可以看到生成了3个结果文件。这些文件链接在线可执行文件,但是执行示例会在本地创建结果文件。
report.html 测试报告
log.html 详细测试执行日志
out.xml 机器可读的xml格式结果
工作流测试
RF测试用例使用简单的表格语法创建。例如,下面有两个测试:
用户可以创建一个账户并登录
用户使用错误密码被拒绝登录
Test Case
Action
Argument
Argument
robot Framework 使用关键词驱动的方式,支持用自然语言来编写可以抓住动作和期望值的本质的测试。测试用例由关键词(通常在第二列)和它们可能的参数组成。
测试用例由关键字及其参数构成。语法要求其关键字和参数,以及设置及其值至少有两个空格或制表符分隔。通常建议使用4个空格分隔符更明确(不同设置下制表符不一样)。关于语法方面后续文章会再介绍。
测试用例可以仅使用不具有位置参数的高级关键字来创建。这种风格允许使用完全自由的文本,甚至适用于非技术人员或其他项目利益者进行沟通。当使用验收测试驱动开发(ATDD)方法或其他任何变体和创建测试时尤为重要。
RF不强制编写测试用例的风格,它可以使用行为驱动开发(BDD)推荐的given-when-then格式的样例,如:
Test Case
Steps
这种测试用例或用户故事风格的测试用例类型很适合用于acceptance test-driven development(ATDD).在ATDD中接收测试在实现实际产品特性前编写并且反映了需求。
数据驱动测试用例
通常,几个测试用例相似,但他们的输入和输出数据略有不同。在这种情况下,数据驱动的测试允许改变测试数据,而不会重复工作流程。使用RF的[Template]将测试用例转为数据驱动测试,当template关键字执行时使用测试用例主体中的定义的数据:
Test Case
Action
Password
Expected error message
Password without capital letters
Creating user with invalid passworld should fail
abcd56789
\${PWD INVALID CONTENT}
Password without numbers
Creating user with invalid password should fail
AbCdEfGh
\${PWD INVALID CONTENT}
Password without special characters
Creating user with invalid password should fail
abCD56+
\${PWD INVALID CONTENT}
除了使用具有单独测试的[模板]设置以外,可以在设置表中使用“测试模块”设置一次,如本文中定义的setups和teardowns.这种情况下,为无效长度密码案例和其他无效案例创建单独的命令测试将变得很简单。然而,这需要将这些测试移动到独立的文件,否则模板将应用与此文件中其他的测试。
注意,上述示例中的错误信息是使用变量指定的。
用于测试用例创建的关键字来源主要有两个,重要测试库中的库关键字和可以使用与创建测试用例相同语法创建的用户关键字。
所有最低级别的关键字都在使用标准编程语言(python或java)实现的测试库中定义。RF附带了一些测试库,可以分为标准库,外部库和自定义库。标准库和核心框架一起分发,并包括通用库,如OperatingSystem, Screenshot和Builtln,特别之处在于它的关键字可以自动使用。外部库,如用于web测试的selenium2Libary,必须单独安装。如果可用的测试库不够满足需求,可以很容易的创建自定义测试库。
为了能使用测试库提供的关键字,必须使用库设置导入关键字。本文中的测试需要标准OperatingSystem库(如删除文件)和定制LoginLibary(例如尝试常用凭据登陆)中的关键字。这两个库是在下面的设置表中导入的:
Settings
Library OperatingSystem
Library lib/LoginLibray.py
用户关键字
RF框架最强大的功能之一就是能够轻松地从其他关键字创建新的更高级别的关键字。创建这些所谓的用户定义关键字或用户关键字的语法类似于用于创建测试用例的语法。以前的测试用例中需要的更高级别的关键字都在此关键字表中创建:
Keyword
Action
Argument
Argument
用户定义的关键字可以包括由其他用户定义或库关键字定义的操作。从这个例子可以看出,用户定义的关键字可以作为参数。它们也可以返回值,甚至包含FOR循环。现在,重要的是要知道用户定义的关键字使得测试创建者能够为常见的动作序列创建可重复使用的步骤。用户自定义的关键字可以帮助作者将测试尽可能的读取,并在不同的情况下使用适当的抽象级别。
变量是RF的组成部分,通常在测试中使用的任何可能发生变化的数据最好定义为变量。变量定义的语法很简单,如变量表所示:
Variable
Value
除了用户定义的变量外,还有一些内置的变量始终可用。这些变量包括上面例子使用的\\(\{TEMPDIR\}和\\){/}。
变量可以在测试数据的大部分地方使用。它们最常用作关键字的参数,如以下测试用例所示。来自关键字的返回值也可以分配给变量,可以作为以后使用。例如,以下数据库包含user关键字将数据库内容设置为${database}变量,然后使用BuiltIn关键字Should Contain来验证内容。库和用户关键字都可以返回值。
Test Case
Action
Argument
Argument
Argument
测试用例组织
RF中测试用例的集合称为测试套件。每个包含测试用例的输入文件构成测试套件。执行本指南时,你可以在终端输出中看到测试套件QuickStart.该名称源自文件名,并且在报告和日志中可见。
可以通过将测试用例文件放入目录并将这些目录放入其他目录中来分层组织测试用例。所以这些目录自动创建更高级别的测试套件,从目录名称中获取其名称。由于测试套件只是文件和目录,他们被简单地放置到任何版本控制系统中。
Setups 和 teardowns
如果你希望在每次测试之前或之后执行某些关键字,请使用设置表中的setup 和 Teardown 设置。同样,可以使用“suite setup"和"suite Teardown”设置来指定整个测试套件之前和/或之后执行的关键字。
使用测试用例表中的[setup]和[Teardown],单个测试也可以进行自定义setup和teardown。这与早期使用数据驱动测试的[Template]相同。
在这个演示中,我们希望在执行开始之前确保数据库被清除,并且每次测试也会在之后清除:
Setting
Value
当你在测试执行后查看报告时,您可以看到测试已经指定了与它们相关联的标签,还有基于标签生成的统计信息。标签可以用于许多其他目的,最重要的是选择要执行的测试的可能性之一。例如,可以尝试以下命令:
robot --include smoke QuickStart.rst
robot --exclude database QuickStart.rst
RF提供了一个用于使用python或Java创建测试库的API,远程库接口还允许使用其他编程语言。RF用户指南包含有关库API的详细说明。
例如,我们可以看一下本演示中使用的LoginLibrary测试库。该库位于lib/LoginLibary.py。下面是其代码,例如,关键字Create User如何映射到方法create_user的实际实现。
33
#!/usr/bin/env python3
# *-*coding=utf-8*-*
import os.path
import subprocess
import sys
class LoginLibrary(object):
def __init__(self):
self._sut_path = os.path.join(os.path.dirname(__file__),
'..', 'sut', 'login.py')
self._status = ''
def create_user(self, username, password):
self._run_command('create', username, password)
def change_password(self, username, old_pwd, new_pwd):
self._run_command('change-password', username, old_pwd, new_pwd)
def attempt_to_login_with_credentials(self, username, password):
self._run_command('login', username, password)
def status_should_be(self, excepted_status):
if expected_status != self._status:
raise AssertionError("Expected status to be '%s' but was '%s'."
% (expected_status, self._status))
def _run_command(self, command, *args):
command = [sys.executable, self._sut_path, command] + list(args)
process = subprocess.Popen(command, universal_newlines=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
self._status = process.communicate()[0].strip()
到此,相信大家对Robot Framework应该有了一个初步的认识了。
by 李鹏