http://chuansong.me/n/1858477
1、RF框架
1.1 RF框架介绍
Robot Framework 框架是一个通用的测试框架,一直是由诺西网络(Nokia Siemens Networks Oyj)的人员在维护的。后来诺基亚卖掉了手机业务后,现在更名成诺基亚解决方案网络(Nokia Solutions and Networks)了。现在还是那帮子老外们在维护,已经到 2.9 了,不过 2.9 碰到很多问题,暂时还是用 2.8.7 比较好。
下面介绍一下 RF 的特性:
易于使用,采用表格式语法,统一测试用例格式;
可以使用关键字驱动(keyword-driven)、数据驱动(data-driven)和行为驱动开发 (BDD) 完成;
重用性好,可以利用现有关键字来组合新关键字;
结果报告和日志采用 HTML 格式,易于阅读;
平台和应用无关联性;
模块结构支持使用不同的接口来测试你的应用;
易于扩展,提供了简单 API,用户可以自定义的基于 Python 或者 Java 的测试库;
易于集成,提供了命令行接口和基于 XML 的输出文件;
功能全面,支持WEB测试(Selenium)、Java GUI 测试,启动线程、Telnet、SSH 等;
RemoteLibrary 接口可以支持分布测试和使用其他编程语言实现测试库;
提供tag标签来分类和选择你的案例执行;
内置支持变量variables,支持不同的环境进行测试;
根据我的理解,整理了一个比较形象的Robotframework框架图,如图:
Robotframework作为框架平台,上面可以加载各种Library,通过测试套件、资源文件集成起来,然后可以针对被测系统进行不同角度的测试,图中只列了三种Library,实际上还有很多种不同方向的Library,这里只是方便大家理解。
1.2 安装Robotframework
接下来我们说说怎么安装相关软件来用Robotframework
a. 首先要安装Python,如果是Mac电脑已经自带了Python了,如果是其他平台需要下载2.7.x系列的。目前RF整体还不支持Python3。windows平台在安装完Python后记得要把Python的两个路径加到环境变量Path里,一个是Python安装目录,一个是Python安装目录下的Scripts目录,然后重新打开命令行进行后面的安装操作。
b. 接着安装两个工具,setuptools和pip,打开浏览器访问pypi.python.org官方下载地址,搜索setuptools和pip找到最新的tar.gz文件下载,安装方法:先解压缩,然后在命令行窗口进入setup.py文件所在目录,输入python setup.py install进行安装。
c. 安装Robotframework框架。从这里开始包括后续的测试库安装一般有两种方式,一个是手工安装,前面安装setuptools和pip就是手工方式,另一种是pip安装。对于测试库安装来说,我推荐pip安装方式,不需要本地提前下载安装包,pip会自动从pypi.python.org上搜索安装包并下载安装。
这里我们用命令pip install robotframework就可以了,如果不想安装最新的版本,可以通过使用==, >=, <=, >, <来指定一个版本号。比如pip install ‘robotframework==2.8.7’来指定安装2.8.7的版本。
d. 安装wxPython。我基本上没有试过用pip安装这个,因为他自身有一个独立的安装包,版本目前只建议使用2.8.12.1。官网是http://sourceforge.net/projects/wxpython/files/wxPython/2.8.12.1/,要下载unicode版本的。
e. 安装RIDE,可以用pip install robotframework-ride安装。
Windows一般没啥问题,Mac上通常第一次安装后,在终端输入ride.py回车,会提示Python要运行在32位模式下: ”python should be executedin 32-bit mode to support wxPython on mac. Check BUILD.rest for details”。
因为Mac默认是64位运行,所以Python也默认运行64位,此时需要调整一下默认Python为32位,具体方式有两种:
(1).在终端里执行下面这句:
defaultswrite com.apple.versioner.python Prefer-32-Bit -bool yes
(2).或者在~/.bash_profile里增加下面这句:
exportVERSIONER_PYTHON_PREFER_32_BIT=yes
保存退出后运行source ~/.bash_profile后再输入ride.py回车就可以正常打开RIDE了。
f.安装测试库,可以用pip install LibraryName 进行相应测试库的在线安装,前面已经有相应例子了。
完整的pip命令请在命令行输入pip —help (注意是2个-)查看。
g. 本次接口测试要用到requests和robotframework-requests,前者是一个Python库,一般直接写Python脚本测试接口会importrequests来使用。后者是对requests做了一层封装,使其更好的应用在robotframework框架上。请根据这两个库的名字自己进行pip安装。
PS:如果熟悉pip安装的同学其实只要一个安装命令就可以了,因为后者依赖前者的存在才能安装,所以只需要pip安装后者,然后他会自动帮你把前者安装好的。
2、创建测试案例
2.1 第一个案例
为了让大家有个直观的认识,这里直接介绍一下怎么创建一个测试案例,暂时先不进行细致的介绍,RIDE和Robotframework的基础知识可以到http://blog.csdn.net/tulituqi看我的博客。
2.1.1打开RIDE
windows下直接双击界面的Robot机器人图标即可,或者进入到Python目录的scripts子目录下双击ride.py文件,也可以在命令行输入ride.py然后回车,就可以看到RIDE界面,如图。
mac下直接在终端命令行输入ride.py回车,就可以看到如图的界面。
由于Mac上和Windows上基本一致,所以这里主要以Windows的截图为主。这里因为大部分截图是之前做的,所以都是windows的,实际上我目前使用Mac环境更多一些。
2.1.2创建工程和测试套
选择File→New Project,如图
在Name的文本框里输入一个名字,例如testproject,右边选择Directory,如图
然后点击OK按钮,如图
右键点击testproject,在弹出菜单里点击“New Suite”,在Name的文本框里输入一个名字,例如testsuite1,如图
然后点击OK按钮,之后界面如图
2.1.3创建案例
右键点击testsuite1,在弹出菜单里点击“New Test Case”,在Name的文本框里输入一个名字,例如case1,如图
然后点击OK按钮,界面如图
2.1.4写一行脚本
我们第一个脚本就用log命令吧,这个命令是用来打印日志的,对比C语言,你可以理解为printf,我们来打印一个“hello world”吧
脚本写完如图
2.1.5运行案例
点击工具栏像播放按钮的图标 运行案例,运行结果如图
2.1.6查看运行结果
点击Report或Log图标查看报告,report和log分别是两种报告,展示的信息不一样,Report报告如图
Log报告如图
Report报告主要是概括性的报告,总体案例执行情况。Log报告则是更为详细的案例步骤的报告。
3、Requests接口自动化测试介绍
主要介绍几种常见的接口如何进行自动化测试,重点是get request和post request。
这部分测试案例可以在这里找到:https://github.com/qitaos/rf-demos/tree/master/RequestsDemo
3.1 接口测试
接口测试通常是系统之间交互的接口,或者某个系统对外提供的一些接口服务,我之前接触的大部分都是RESTful,还有一些webservice的接口。现在大家也越来越多的关注接口测试了,因为有时候可能界面上的功能还没有实现,我们可以先一步对接口进行验证,提早发现一些和预期不一致的错误。这方面的工具应该也有一些,基于RF的接口测试库我们首推requests和requestsLibrary。
3.2requestsLibrary、requests安装
前面介绍了pip安装,如果pip不好用或者网络不好的同学,可以本地安装,到下面官网下载进行手动安装。
requests的官方下载地址: https://pypi.python.org/pypi/requests
requestsLibrary的官方下载地址:
https://pypi.python.org/pypi/robotframework-requests/
如果是下载tar.gz包安装,先要安装requests,再安装requestsLibrary
3.3 requestsLibrary关键字
requestsLibrary的关键字不多,我常用的就几个。
Create Session: 创建一个session,连接某个服务器
Create Ntlm Session: 也是创建一个session,只不过加上了域、用户名、密码用于NTLM认证。
Get Request: 通过GET方式发起请求。
Post Request: 通过POST方式发起请求。
Head Request: 发送一个HEAD请求。
TO Json: 将文本转换成json对象。
3.4 测试案例
这里的demo我们是用到了flask的网站,做了几种例子,大家了解一下,如果需要更完整的了解,建议看一下RequestsLibrary在github上的测试案例。
3.4.0 使用demo前的准备
我用了flask来实现了一个demo网站,它可以快速建立起一个网站,只用一些简单的语句。
如果使用pip安装会比较方便,特别是在mac电脑上,为了保证例子能正常运行,大家需要安装四个东东,flask、flask-httpauth、flask_restful、python-simplexml。
只需要运行如下命令:
mac
sudo pip install flask
sudo pip install flask-httpauth
sudo pip install flask_restful
sudo pip installpython-simplexml
windows
pip install flask
pip install flask-httpauth
pip install flask_restful
pip install python-simplexml
安装完成之后就可以运行我们的demo-website了,我的书里全部的demo的地址是:
https://github.com/qitaos/rf-demos
具体说明可以看网站上的README,所有的demo都会放到这里,同时书籍出版后也会继续更新,所以你看到github上rf-demos的内容可能会比书上的多。
demo-website的地址是:https://github.com/qitaos/rf-demos/tree/master/demo-website
下载整个工程之后,进入demo-website目录,
运行命令
python flaskdemo.py
运行成功后会有提示信息
python flaskdemo.py
Running onhttp://127.0.0.1:8000/ (Press CTRL+C to quit)
Restarting with stat
这里提示我们服务器已经启动,访问http://127.0.0.1:8000/ 或者 http://localhost:8000/ 就可以打开页面了。
如果有任何出错信息,有可能是前面的测试库没有安装完整。
1、get request json
访问http://localhost:8000/users/1 的时候,它会返回一个json:
{“1”: “john”}
如果把1换成5,它会返回一个404的json:
{
“message”: “NotFound: http://localhost:8000/users/5“,
“status”: 404
}
所以这里第一个案例就是来测试这2个接口请求。
首先要先Create Session创建一个连接到服务器的host,然后通过Get Request发起请求,请求的返回是个Request对象${addr},所以在这里的变量是个对象,而对象的属性值的有${addr.status_code}和${addr.content},使用了To Json后,就把返回的content格式化成Json串,然后就可以用Dictionary的方法获取其中的值了。脚本见表格
2、getrequest xml
前面一个例子是接口返回json进行处理的,这个例子是接口返回xml格式内容。访问http://localhost:8000/hello/qitao,会返回一个xml格式的内容:
qitao
案例比较长,分两个部分说,第一个部分其实还是用json来处理,虽然返回的是xml,但是requestslibrary自动把它处理成json了。所以它的这部分处理其实和前面的案例一样。脚本见表格
那么想要返回xml怎么处理呢?这里就要在Request的essay-header里加上一个accept=application/xml,此时返回的就是一个xml格式的内容qitao
所以这里用到了XML库的关键字Get Element Text来获取xml节点的文本,使用Get Element获取到一个Element对象${hello},既然是对象,那么它也有属性值${hello.text}。再后面的几行就是用XML库的关键字新增Element,然后取值,这也算是提前准备好来XML的demo了。
这里为什么要做xml的例子呢,其实是因为有一种接口测试就是测试Web Service的,通常Web Service都是返回一个xml格式的内容。这里demo网站没有做Web Service的例子,所以就用这个xml的例子来代替Web Service了。脚本见表格
运行案例结果如图:
3、增加登录态
有些接口是需要用户密码登录后才能访问的,如果直接访问http://localhost:8000/401
会提示要输入用户名密码
输入正确的用户名密码ok/python,会得到一个返回的信息
{
“pass”:”Authorized access”
}
但是我们做自动化脚本的时候不能去手动输入的,所以我们可以在Create Session的时候加上用户名密码,就可以直接访问了。
用户名ok,密码python,我们用${auth}创建个List存起来,然后在Create Session时加上${auth}参数,后面的过程就是前面一样了,不需要自己再手动输入用户密码了。脚本见表格
运行结果如图
4、postrequest
前面几个都是get方式的,这个例子是post方式的。
这里主要是在essay-header加了一项Content-Type=application/x-www-form-urlencoded,这是最常见的post提交数据的方式,另外还有几种我不太常用的,大家可以根据自己的实际情况来使用。
然后我们向 http://localhost:8000/post, 发起请求,并将${data}作为post的data传过去。demo网站对post请求做了个处理,将username的值获取到然后以json格式返回。脚本见表格
3.5 小结
接口测试其实比我们前面的UI自动化测试要有价值的多,而且投入也不是很高,维护成本也低很多,一般来说接口上不会特别频繁的变更。即使有变更,正好也可以用这些案例来回归其他接口是否受到了影响。所以推荐大家将接口自动化测试优先做起来,一定要在上线前跑接口自动化回归测试,某些时候能够避免一些接口变更导致的问题。
顺便打个小广告:我的新书《Robotframework自动化测试修炼宝典》即将在10月底11月初面市,欢迎感兴趣的朋友届时到各大网上书店购买。
答疑环节
1. RF对Java 和c#是一样适用吗?
这里不确定你说的是底层还是说Java和C#开发的程序。如果是底层,RF是支持java的,如果程序,java应该有swing库,C#貌似可以用autoitlibrary。
2.在Linux可以使用吗?
可以的。
3.autoit library 可以在mac下使用么?
不可以。因为autoit是针对win32程序的,只有windows上才能用。如果要对mac的ui进行自动化测试,可以研究一下其他的工具,我记得mac自带就有。
4.Linux 安装robot framework 直接参照Mac的吗?
我觉得参考mac的就可以,不过我确实没有尝试过。
5.基于RF的接口测试库我们首推requests和requestsLibrary———请问这是为什么,HttpLibrary.HTTP不好用吗,最近我们在两者之间就选择了后者?
这是我个人使用了requests后觉得比较方便。httplibrary的貌似也不错,我没有深入研究,抱歉。
6.可以用于云测试吗?若可如何使用?
具体要看你的应用场景。不过我对云测试了解不多。如果是类似于分布式测试的话,以前我是通过Jenkins来实现的。RF也有remote库可以把测试库放在一个统一的服务器上,然后在不同机器上去使用。
7.接口测试可以支持哪些接口?
今天介绍了几种接口,我理解大部分应该都可以支持了。
8.可不可支持APP或网站前端测试?
我们目前就是在自己的APP项目上用了这个接口测试,因为我们的接口是比较简单的RESTful接口,json串返回,我们解析json然后验证。
9.测试代码是否要求自己写?若要用啥语言?
测试案例是要自己写,不需要写太多代码,底层代码是Python的,如果你要写测试库可以写Python来实现。实际上写测试案例是直接使用各个测试库提供的关键字就可以了。
10.这是个什么接口,没看懂?404那个。
我这里演示的接口都是比较简单的请求返回的,自己做的demo的,就没弄那么复杂的。
11.使用or占整体业务的比例有多少?
我个人认为,接口测试如果可以的话做到100%自动化是最好的。因为他不像UI经常变化,接口大多都比较稳定的,自动化回归测试是非常有必要的。
12.request.txt这个文件怎么用RF打不开呢?
用RIDE打开就可以了,我这边演示的也是用RIDE打开的。
13.请问道长近期有没有计划做性能和app端测试的课程?
性能我不太熟悉,这个monkey来吧。app测试我的新书里写了使用Robotframework+appium的例子。以后有机会可以再进行相关介绍,不过我对appium还不太熟练,这方面monkey和恒温是专家
14.比如接口测试登录…要输入验证码,怎么实现?接口测试,如果要求传参要求加密怎么做?
验证码这个东西最好让开发给你加万能码或者关掉验证码,如果自动化实现了录入验证码,那就是bug,因为验证码没起到他的作用。至于传参要加密的,我们近期也碰到了,我们是用Python实现了加密方法,然后做成library使用。
15.post request之后 返回一个html页面 要如何进一步获取他的表单信息?用XML库吗?
XML应该可以处理。不过感觉比较麻烦。我做的貌似比较简单,所以没考虑到这个情况。我个人在想如果能结合Selenium2Library好像会比较方便,但是要尝试是否可行。
16.请问道长之前有没有出过书?书名是什么?
之前没出过。刚写了一本《Robotframework自动化测试修炼指南》,即将出版了。
17. 自定义库怎么写?
这里一两句话很难说清楚,在我的github上有个qtlibrary,可以参考一下。我在新书里也用这个来介绍写测试库。
18提问,怎样快速查找当前library里面的方法?rf我记得有些文字的显示可以纠错?这块可不可以简单说一下。
查看Library关键字请按F5,选择测试库后就可以看到了。纠错的你说的是那个内容助手吧,Content Assistance,他在RIDE的tools菜单下,有自己的快捷键,比如ctrl+空格。但是很容易和输入法的冲突,所以你要么选择另一个快捷键,要么自己改一下快捷键
19.脚本中的第一个和倒数第二345都没讲过,是干什么用的呢?
这个是说最后一个案例吧?第一行是创建一个字典变量,然后保存了一个值,是post的essay-header里的,倒数那几个都是用dictionary的方法来解析json,因为json基本上就是和dictionary一样的。
20.用rf做接口测试,需要哪些编程基础?没有编程基础的怎么学?有什么方法吗?
对于使用rf做测试,其实只需要比较简单的编程知识就够了。如果没有基础的可以学习一下算法,比如谭浩强的C语言的算法之类。其实用RF做测试,你要了解你想要怎么测试,然后找到方法去做就好了
21.作为一个高校老师,应该如何给学生开展测试的课程呢?普通高校,测试的课程几乎可以说没有,虽然一直很关注测试,但是,坦白说,一直也没有一个明晰的概念如何跟学生去进行这样一个课程的教学。可否请老师给指点下迷津,毕竟高校也是未来开发主力军的一个培养基地。
这个话题有点大。这方面应该请南京大学的陈振宇教授(俗称陈龙虾)来给讲解。我个人的意见是先介绍基础的测试知识,培养学生的测试思想和测试意识,测试工具可以晚一些再接触。