Robot Framework - 2 - 创建测试库
04- 创建测试库--基础概念
Robot Framework 实际的测试能力是由测试库提供的。
***** 支持的编程语言
- Robot Framework 自身是用 Python 编写的,能使用 Python 扩展测试库。
- 如果在 Jython 运行Robot Framework 的话,那么测试库也可以用 Java 来实现。
- 也可以通过 Python C API 使用 C 语言来实现测试库。
***** 不同的测试库 API
Robot Framework 有三种不同的测试库 API:
--- 静态API
这是最简单的方法。
采用一个 Python 的 module 或者 Class,提供一系列的关键字。
module 或 class 的方法名和关键字相匹配,关键字和方法具有同样的参数。
这些关键字可以通报异常,输出日志,返回需要的值等等。
--- 动态 API
作为动态API的 Class,要实现两个方法:
一个用来获取它们自己实现了的关键字的名字,另外一个用来执行这些关键字。
关键字具体实现及运行,是在运行期决定的。
这些关键字可以通报异常,输出日志,返回需要的值。
--- 混合API
相比静态API,作为混合API的Class ,多了一个方法用来发现实现了哪些关键字,这些关键字可以直接使用。
其他的一切都跟静态 API 一模一样。
05- 创建测试库Class或者Module
***** 测试库名称
测试库以.py为后缀名,文件名与实现该测试库的模块名或者类名相同。
Python 类总是被写在一个模块中的。
- 如果实现一个库的类的名称跟它所在的模块同名,则 Robot Framework允许引入它的时候去掉模块名。
- 如果模块名和类名不同,使用测试库要同时使用模块名和类名。
- 如果测试库名称真的太长了,推荐通过 WITH NAME语法给测试库添加一个简短的别名。
***** 提供参数给测试库
所有实现测试库的类都可以带参数。但是,如果库是用模块来实现的,则不能带任何参数。
测试库需要的参数个数跟它的构造器接收的参数个数相同。默认值和可变个数参数也能工作。
参数被传递给测试库时,可以通过变量。
***** 测试库的范围
Robot Framework默认地为每个测试用例创建测试库的新实例,让测试用例之间保持独立。
属性 ROBOT_LIBRARY_SCOPE,测试库可以控制新的库什么时候被创建。
这个属性必须是字符串,并且它只有以下三个值:
- TEST CASE ---- 为每个测试用例创建一个新的实例。
- TEST SUITE ---- 为每个测试集创建一个新的实例。
- GLOBAL ---- 在整个测试执行过程中,只有 1 个实例被创建,被所有测试用例和测试集共享。
***** 声明测试库的版本
属性 ROBOT_LIBRARY_VERSION,声明测试库的版本。
如果 ROBOT_LIBRARY_VERSION 不存在,就尝试读取__version__属性。
这些属性必须是类或者模块的属性。
示例: LibraryExampleA.py
# -*- coding: utf-8 -*- ###创建测试库Class或者Module class LibraryExampleA(): ROBOT_LIBRARY_SCOPE = 'TEST SUITE' #测试库的范围 __version__ = '0.1' #声明测试库的版本 def __init__(self): self._counter = 0 def count(self): self._counter += 1 print self._counter def clear_counter(self): self._counter = 0 ## def keyword(self): ## pass
06- 创建测试库--创建静态关键字
***** 关键字名称
在测试数据中使用的关键字名称不区分方法名的大小写,空格和下划线也会被忽略。
***** 关键字参数
在静态和混合库 API 中,一个关键字需要多少参数,取决于实现它的方法。
最通用也是最简单的情况是,当一个关键字需要的参数是固定个数的。
***** 带有默认值的参数
在 Python 中,带有默认值的参数可以声明在方法签名中。
***** 可变数量的参数
Robot Framework支持带有可变数量参数的关键字。
Python 支持方法接收可变数量的参数。同样的语法也可以在测试库中使用。
***** 参数的类型
通常情况下,关键字参数是作为字符串传给 Robot Framework 的。
如果关键字需要其他类型的参数,要么就使用变量,要么利用内建关键字将字符串转换成需要的类型。
参数的数量正确,调用关键字时将会成功;参数类型不匹配,执行关键字时失败。
在 Python 中,可以很简单的将参数转换为合适的类型,例如:port = int(PortNumber)。
示例: LibraryExampleB.py
# -*- coding: utf-8 -*- ###创建静态关键字 class LibraryExampleB(): #关键字名称 def hello(self,name): print "Hello, %s!" % name def do_nothing(self): pass #关键字参数 def no_arguments(self): print "Keyword got no arguments." def one_argument(self,arg): print "Keyword got one argument '%s'." % arg def multiple_arguments(self,a1, a2, a3): print "Keyword got three arguments '%s', '%s' and '%s'." % (a1, a2, a3) #带有默认值的参数 def one_default(self,arg='default'): print "Argument has value %s" % arg def multiple_defaults(self,arg1, arg2='default 1', arg3='default 2'): print "Got arguments %s, %s and %s" % (arg1, arg2, arg3) #可变数量的参数 def any_arguments(self,*args): print "Got arguments:" for arg in args: print arg def one_required(self,required, *others): print "Required: %s\nOthers:" % required for arg in others: print arg def also_defaults(self,req, def1="default 1", def2="default 2", *rest): print req, def1, def2, rest #参数的类型 def connect_to_host(self,address, port=25): port = int(port) print address, port
07- 创建测试库--与RobotFramework通信
***** 报告关键字的状态
如果一个被执行的方法抛出一个异常,该关键字的状态就是 FAIL,如果它正常返回了,则状态为 PASS。
错误信息包含了异常的类型和信息,它被显示在日志、报告和控制台中。
异常的跟踪可以通过 DEBUG 日志级别来输出日志。这些信息在日志文件中默认是不可见的。
***** 停止测试执行
可以通过让一个测试用例失败来停止整个测试运行。
属性ROBOT_EXIT_ON_FAILURE (值为 True)设置到关键字抛出的异常中,就能达到这种目的。
***** 不管失败继续执行
可以让整个测试执行在出现了 failure 的时候继续执行。
属性ROBOT_CONTINUE_ON_FAILURE (值为 True)设置到关键字抛出的异常中,就能达到这种目的。
***** 输出日志信息
默认地,一个方法写入标准输出的一切信息都会被当作 INFO 级别输出到日志文件中。
要使用其他的日志级别(非 INFO)或者创建一些信息,可以通过将级别绑定到信息中。
格式: *LEVEL*Actual log message
*LEVEL*必须位于信息的头部,并且 LEVEL 的值必须是 TRACE、 DEBUG、 INFO、 WARN 、HTML 其中之一。
***** 警告
警告(WARN)级别的信息会自动被写入控制台和日志文件中单独的测试执行错误那一节。
使用警告来报告一下重要而不危险的问题给用户。
***** 输出 HTML 格式的日志
如果测试库想要使用格式、超链接、图片等等,它们可以使用特殊的日志级别 HTML。
***** 日志级别
大多数情况下, INFO 级别已经足够。
DEBUG 和 TRACE,可以很容易的调试测试库自身可能存在的问题。
WARN 级别可以让信息更加可见,HTML 级别对于需要其他格式时很有用。
***** 返回值
返回值可以赋给测试数据中的变量,然后这个变量又作为其他关键字的输入。
返回值在 Python中采用 return 语句。
一般地,一个值被赋给一个标量变量。
关键字能通过多个标量变量或者构成一个列表变量返回多个值。 对于Python, 返回值必须是列表或者元组。
示例: LibraryExampleC.py
# -*- coding: utf-8 -*- ###与RobotFramework通信 import base64 class LibraryExampleC(): #返回值 def return_string(self): return 'Hello, world!' def return_object(self,info): return base64.b64encode(info) def return_two_values(self): return 'first value', 'second value' def return_multiple_values(self): return ['a', 'list', 'of', 'strings'] #日志例子 def log_example(self): print 'Hello from a library.' print '*WARN* Warning from a library.' print '*INFO* Hello again!' print 'This will be part of the previous message.' print '*INFO* This is a new message.' print '*INFO* This is <b>normal text</b>.' print '*HTML* This is <b>bold</b>.' print '*HTML* <a href="http://robotframework.org">Robot Framework</a>'
行动是绝望的解药!
欢迎转载和引用,但请在明显处保留原文链接和原作者信息!
本博客内容多为个人工作与学习的记录,少数内容来自于网络并略有修改,已尽力标明原文链接和转载说明。如有冒犯,即刻删除!
以所舍,求所得,有所获,方所成。