Fitnesse+RestFixture:Web服务回归测试利器
RestFixture是Fitness的一个测试REST服务的插件,用于调用标准的http
GET/POST等请求方法,并可以用XPath语法和Javascript语法检验http响应。本文介绍安装运行RestFixture的步骤,并给出测试用例示例。
首先普及一下概念,什么是Fitnesse,听一听.NET版Cucumber的创始人Aslak Hellesøy谈Fitnesse与Cucumber对比:
FIT/Fitnesse和Cucumber都执行高级语言编写的验收测试。FIT仅识别HTML,Fitnesse则通过提供Wiki语法来简化编写测试的过程。在FIT/Fitnesse当中,所有的测试都以表格的形式呈现。
FitNesse比Cucumber的优势在于Wiki支持。
原文链接:http://www.infoq.com/cn/news/2009/11/interview-cucumber-for-dotnet
1.几句题外话
对于http请求的测试,有几种方式:
- 浏览器中输入http url,只适用于GET方法
- curl命令手工测试
- junit中直接用java network api调用GET/POST方法
- 在自动化测试框架中封装指令,如cucumber, fitnesse, robotframework
上述1、2手工测试,不能用于回归测试;3、4能用于回归测试,但要开发测试脚本代码,维护非常麻烦。
今日回想起两年前浅尝辄止的fitnesse,想碰运气看看有没有好的测试插件,结果真找到了用于Restful API测试的插件:RestFixture
2.Fitnesse 20111026+RestFixture 3.0 ——最佳拍档
2.1 http响应格式是xml的示例
废话少说,先上图:
上面的测试用例的目的是:
检查 url: http://www.w3school.com.cn/example/xmle/note.xml 中有一tag:
<body>
并且 tag内容是
1
|
Don't forget the meeting! |
note.xml的内容:
1
2
3
4
5
6
7
8
|
<?xml version= "1.0" encoding= "ISO-8859-1" ?> <!-- Copyright w3school.com.cn --> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> |
fitnesse 测试用例wiki文本:
1
2
3
4
5
6
|
!define TEST_SYSTEM {slim} !path D:\fitnesse\fitnesse- 20111026 \smartrics-RestFixture- 3.0 \lib\* | Table:smartrics.rest.fitnesse.fixture.RestFixture | http: //www.w3school.com.cn | | GET | /example/xmle/note.xml | 200 | Content-Type: text/xml | //body[text()="Don't forget the meeting!"]| |
2.2 http响应格式是json的示例
上面的测试用例的目的是:
调用百度地图Web API,根据IP获取地图地址信息,检查服务响应内容中的status字段必须是0,下面判断语句是javascript表达式:
1
|
jsonbody.status==0 |
GET访问的url:
- http://api.map.baidu.com/location/ip?ip=202.198.16.3&coor=bd09ll&ak=60IFKTCwlIsSpDcGfkx36L8u
url返回的内容:
1
|
{ "address" : "CN|\u5409\u6797|\u957f\u6625|None|CERNET|1|None" , "content" :{ "address" : "\u5409\u6797\u7701\u957f\u6625\u5e02" , "address_detail" :{ "city" : "\u957f\u6625\u5e02" , "city_code" :53, "district" : "" , "province" : "\u5409\u6797\u7701" , "street" : "" , "street_number" : "" }, "point" :{ "x" : "125.31364243" , "y" : "43.89833761" }}, "status" :0} |
被调用Web API文档:
- http://developer.baidu.com/map/wiki/index.php?title=webapi/ip-api#.E6.8E.A5.E5.8F.A3.E7.A4.BA.E4.BE.8B
fitnesse 测试用例wiki文本:
1
2
3
4
5
6
|
!define TEST_SYSTEM {slim} !path D:\fitnesse\fitnesse- 20111026 \smartrics-RestFixture- 3.0 \lib\* | Table:smartrics.rest.fitnesse.fixture.RestFixture | http: //api.map.baidu.com | | GET | /location/ip?ip= 202.198 . 16.3 &coor=bd09ll&ak=60IFKTCwlIsSpDcGfkx36L8u | 200 | Content-Type: application/json | jsonbody.status== 0 | |
2.3 用javascript处理json对象
我们再来看上面的GET响应文本:
1
|
{ "address" : "CN|\u5409\u6797|\u957f\u6625|None|CERNET|1|None" , "content" :{ "address" : "\u5409\u6797\u7701\u957f\u6625\u5e02" , "address_detail" :{ "city" : "\u957f\u6625\u5e02" , "city_code" :53, "district" : "" , "province" : "\u5409\u6797\u7701" , "street" : "" , "street_number" : "" }, "point" :{ "x" : "125.31364243" , "y" : "43.89833761" }}, "status" :0} |
\u5409\u6797|\u957f\u6625是什么?
按照百度API文档,应该返回这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{ address: "CN|吉林|长春|None|CERNET|1|None" , content: { address: "吉林省长春市" , address_detail: { city: "长春市" , city_code: 53 , district: "" , province: "吉林省" , street: "" , street_number: "" }, point: { x: "125.31364243" , y: "43.89833761" } }, status: 0 } |
原来\u5409\u6797|\u957f\u6625是 吉林|长春 encodeURI的结果
可以在 Chrome浏览器 > 菜单 > 工具 > JavaScript控制台(Firefox/IE/Opera都有对应的控制台) 中使用 String.replace函数来把\u5409变成"吉”:
下一步在Fitnesse中要见证奇迹了,RestFixture居然支持Javascript语法和全局函数,也可以调用String.replace函数:
1
2
3
4
5
6
7
|
!define TEST_SYSTEM {slim} !path D:\fitnesse\fitnesse- 20111026 \smartrics-RestFixture- 3.0 \lib\* | Table:smartrics.rest.fitnesse.fixture.RestFixture | http: //api.map.baidu.com | | GET | /location/ip?ip= 202.198 . 16.3 &coor=bd09ll&ak=60IFKTCwlIsSpDcGfkx36L8u | 200 | Content-Type: application/json | jsonbody.status== 0 | | let | bodyDecoded | js | response.body.replace(/\\u[\dabcdef]{ 4 }/g, function(word){ return String.fromCharCode(parseInt(word.substr( 2 ), 16 ))}) | | |
RestFixture变量bodyDecoded的内容是中文化后的json:
1
|
{ "address" : "CN|吉林|长春|None|CERNET|1|None" , "content" :{ "address" : "吉林省长春市" , "address_detail" :{ "city" : "长春市" , "city_code" : 53 , "district" : "" , "province" : "吉林省" , "street" : "" , "street_number" : "" }, "point" :{ "x" : "125.31364243" , "y" : "43.89833761" }}, "status" : 0 } |
下面,还可以把bodyDecoded作为表达式文本计算,生成一个js对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
| let | printJsonMembers | js | !- var jsonObject = eval( 'a=%bodyDecoded%' ); var str1= "" ; function printObject(obj, indent){ for (var i in obj){ if (typeof obj[i] == "object" ){ str1+= indent + i+ ":" + "\n" ; printObject(obj[i], indent+ "\t\t" ); } else str1+= indent + i + ":" +obj[i] + "\n" ; } } printObject(jsonObject, "" ); str1-! | | |
这里要演示的第二个let行使用了第一个let行定义的变量:%bodyDecoded%,显然借鉴了Windows Bat文件的语法。
测试结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
address:CN|吉林|长春|None|CERNET| 1 |None content: address:吉林省长春市 address_detail: city:长春市 city_code: 53 district: province:吉林省 street: street_number: point: x: 125.31364243 y: 43.89833761 status: 0 |
3.RestFixture参考资料
3.1 RestFixture使用文档
https://cloud.github.com/downloads/smartrics/RestFixture/RestFixture-3.0.pdf
3.2 运行环境
fitnesse运行环境文件目录:
注意:其中的slf4j-simple-1.6.6.jar需要额外下载
启动fitnesse命令:
D:\fitnesse\fitnesse-20111026>java -jar fitnesse.jar -p 11026
-p 11026 是让fitnesse网站使用11026端口,因为我要在后面的例子中使用多个fitnesse版本,所以用版本号作为端口。
3.3 相关安装包下载地址
RestFixture安装包下载地址:
slf4j-simple-1.6.6.jar下载地址:
- http://repo2.maven.org/maven2/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar
- 注意:RestFixture安装包中未包含此jar包,但运行时需要。
Fitnesse安装包下载地址:
- http://fitnesse.org/fitnesse.jar?responder=releaseDownload&release=20111026
- 注意:RestFixture只维护到20111026的Fitnesse版本,所以只能下载与之匹配的Fitnesse安装包。
3.4 相关网址
- Fitnesse 首页:
- http://www.fitnesse.org/
- Fitnesse安装包下载: Fitnesse首页 > Download > release 20111026 > fitnesse.jar
- Fitnesse插件列表: Fitnesse首页 > Plug-ins
- RestFixture首页: Fitnesse首页 > Plug-ins > SLiM Fixtures > RestFixture =>
- https://github.com/smartrics/RestFixture
- RestFixture安装包下载: RestFixture首页 > Wiki > Live documentation > download > smartrics-RestFixture-3.0-bin.zip
- RestFixture使用文档: RestFixture首页 > Wiki > Live documentation > download > RestFixture-3.0.pdf
4.Fitnesse 20140630+RestFixture 3.0 ——水土不服
RestFixture在最新版Fitnesse 20140630 的运行结果:
其中的GET行,只有第2、3列正确显示,4、5列显示为HTML文本,看上去十分杂乱,
旧版的Fitnesse是这样显示的:
后续的博客中,我会介绍如何让RestFixture 3.0在Fitnesse 20140630中也能打印出漂亮的测试结果。
为Fitnesse-20140630定制RestFixture代码
Fitnesse+RestFixture:Web服务回归测试利器的更多相关文章
- 如何测试Web服务.2
-->全文字数:2700,需要占用你几分钟的阅读时间 ,您也可以收藏后,时间充足时再阅读- -->上一节讲了<Web服务基础介绍>,本节介绍可用于测试web服务的开源测试工具. ...
- RESTful风格的Web服务框架:Swagger
Swagger与SpringMVC项目整合 为了方便的管理项目中API接口,在网上找了好多关于API接口管理的资料,感觉目前最流行的莫过于Swagger了,功能强大,UI界面漂亮,并且支持在线测试等等 ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- 基于IIS构建Pyathon Web服务
本文简单叙述了在Windows下,如何利用IIS构建Python Web服务. 其主要步骤如下: 1.在IIS下构建一个站点,如图: 2.配置Python文件的处理程序,如图: 3.最后,在对应站点根 ...
- Web服务
Web服务的相关信息 Apache服务器是web服务的重要应用 在这也是讲的apache 这里需要安装一个http服务软件才行! Apache的根文档在/var/www/html 主配置文件 /e ...
- Python flask 基于 Flask 提供 RESTful Web 服务
转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...
- 使用 ServiceStack 构建跨平台 Web 服务
本文主要来自MSDN杂志<Building Cross-Platform Web Services with ServiceStack>,Windows Communication Fou ...
- webServices与Web服务
本篇的内容在MSND中标注已是一项旧技术,而取而代之的是WCF, 那么我也放弃吧!但是这个属于Web服务的范畴,而WCF本质上也是一个Web服务来的,所以对于基础的东西还是不变的.那么这次就着重看看这 ...
- J2EE基础之Web服务简介
J2EE基础之Web服务简介 1.什么是Web服务? 在人们的日常生活中,经常会查询网页上某城市的天气信息,这些信息都是动态的.实时的,它是专业的气象站提供的一种服务.例如,在网上购物时,通常采用网上 ...
随机推荐
- [转] 软件定义网络(SDN) 的应运而生
原文见51CTO:http://network.51cto.com/art/201103/251425.htm 2012的故事 2012年的某天,你跟往常一样起床,打开电脑,却发现无法登录到邮箱.无法 ...
- mysql InnoDB 索引小记
0.索引结构 1).MyISAM与InnoDB索引结构比较,如下: 2).MyISAM的索引结构 主键索引和二级索引结构很像,叶子存储的都是索引以及数据存储的物理地址,其他节点存储的仅仅是索引信息.其 ...
- 乳草的入侵//BFS
P1030 乳草的入侵 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO OCT09 6TH 描述 Farmer John一直努力让他的草地充满鲜美 ...
- lintcode 中等题:permutations II 重复数据的全排列
题目 带重复元素的排列 给出一个具有重复数字的列表,找出列表所有不同的排列. 样例 给出列表 [1,2,2],不同的排列有: [ [1,2,2], [2,1,2], [2,2,1] ] 挑战 使用递归 ...
- 其实 Dropbox 的缺点也很明显,速度慢,空间小(我对国内的网盘的建议)
作者:王成链接:http://www.zhihu.com/question/20237962/answer/15146386来源:知乎著作权归作者所有,转载请联系作者获得授权. 国内的云存储服务基本上 ...
- PHP 语言需要避免的 10 大误区
PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.但是,你大概很奇怪的注意到有少部分的人发誓要离php 远远的.但是令人更奇怪的是或者很震惊的说他们不用php ...
- PHP之APC缓存详细介绍(转)
1.APC缓存简介 APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”.它为我们提供了缓存和优化PHP的中间代码的框架. APC的缓存分两部分:系统缓存和用户数据缓 ...
- 1641. Duties
1641 枚举 #include <iostream> #include<cstdio> #include<cstring> #include<algorit ...
- poj 1151 Atlantis (离散化 + 扫描线 + 线段树 矩形面积并)
题目链接题意:给定n个矩形,求面积并,分别给矩形左上角的坐标和右上角的坐标. 分析: 映射到y轴,并且记录下每个的y坐标,并对y坐标进行离散. 然后按照x从左向右扫描. #include <io ...
- oracle 11g rac 无法自动启动
如果以上的操作依然不能使数据库资源自动启动,那么参考下面这篇文章修改资源AUTO_START属性. 查看资源状态: crsctl status resource 资源 -p crs ...