php fitnesse,Fitnesse+RestFixture:Web 服务回归测试利器
摘要:RestFixture 是 Fitnesse 的一个测试 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 支持。
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 的示例
废话少说,先上图:
上面的测试用例的目的是:
并且 tag 内容是
Don't forget the meeting!
note.xml 的内容:
George
John
Reminder
fitnesse 测试用例 wiki 文本:
!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 表达式:
jsonbody.status==0
GET 访问的 url:
url 返回的内容:
{"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 文档:
fitnesse 测试用例 wiki 文本:
!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 响应文本:
{"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 文档,应该返回这样的:
{
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 函数:
!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:
{"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 对象:
| 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 文件的语法。
测试结果:
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 使用文档
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 下载地址:
Fitnesse 安装包下载地址:
3.4 相关网址
Fitnesse 安装包下载: Fitnesse 首页 > Download > release 20111026 > fitnesse.jar
Fitnesse 插件列表: Fitnesse 首页 > Plug-ins
RestFixture 首页: Fitnesse 首页 > Plug-ins > SLiM Fixtures > 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 中也能打印出漂亮的测试结果。
php fitnesse,Fitnesse+RestFixture:Web 服务回归测试利器相关推荐
- Fitnesse+RestFixture:Web服务回归测试利器
RestFixture是Fitness的一个测试REST服务的插件,用于调用标准的http GET/POST等请求方法,并可以用XPath语法和Javascript语法检验http响应.本文介绍安装 ...
- 视频教程-Web前端开发利器 SPRY框架之表单验证-JavaScript
Web前端开发利器 SPRY框架之表单验证 有17年互联网行业从业经验,始终在教学第一线,勇于创新,从有效教学,不断向高效教学转变.始终坚持"学生为主体,教师为主导:商业化案例,企业化情境& ...
- C#动态调用web服务 远程调用技术WebService
一.课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上.所以在本次分享课开课之 ...
- 视频教程-Web前端开发利器 SPRY框架之页面效果-JavaScript
Web前端开发利器 SPRY框架之页面效果 有17年互联网行业从业经验,始终在教学第一线,勇于创新,从有效教学,不断向高效教学转变.始终坚持"学生为主体,教师为主导:商业化案例,企业化情境& ...
- 视频教程-Web前端开发利器 SPRY框架之数据集XML-JavaScript
Web前端开发利器 SPRY框架之数据集XML 有17年互联网行业从业经验,始终在教学第一线,勇于创新,从有效教学,不断向高效教学转变.始终坚持"学生为主体,教师为主导:商业化案例,企业化情 ...
- Docker安装Apache与运行简单的web服务——httpd helloworld
Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...
- nodejs静态web服务
项目准备 Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载.目前最主流的 ...
- java url json字符串_使用HttpClient将URL中的JSON查询字符串发送到Web服务(Java)
我有一个我建立的Web服务...我现在要做的是发送一个简单的请求,其中包含一个从Tapestry Web应用程序到该Web服务的json查询字符串.我四处搜索,大多数人都说使用Apache HttpC ...
- JAX-WS Web 服务开发调用和数据传输分析
一. 开发服务 新建maven的web项目就可以了, 1.新建一个web服务 2.服务名称定义 3.更改配置 4.默认建好的服务文件 5.增加一个add的服务 import javax.jws.Web ...
最新文章
- 机器学习模型太大难部署?这里有 3 个解决方案
- mybatis的面试一对一,一对多,多对多的mapper.xml配置
- Excel实战技巧之[活用条件格式]
- pip install 另一个程序正在使用此文件,进程无法访问
- python【力扣LeetCode算法题库】15- 三数之和
- npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! iview-admin@2.0.0 dev: `vue-cli-service serve
- python实现数据恢复_使用sklearn进行对数据标准化、归一化以及将数据还原的方法...
- vba显示正在加载_简单、易用的VBA过程积木代码
- VJC案例-走五角星
- NoteExpress自定义题录表头显示字段
- 「How The Economic Machine Works」《经济机器是如何运转的》中文字幕
- 采用曼码调制的非接触式IC卡译码软件设计
- 沈春华加入腾讯优图!金榕离职阿里达摩院...
- android mcc 模拟,Android 读取MCC, MNC
- python结合正则表达式及校验码生成算法校验:电话号码、营业执照、组织机构代码证、税务登记证、统一社会信用代码证、非盈利性企业登记证号码的函数
- R语言read.csv()读入行不规则数据
- 【ANSYS】Ansys APDL建模示例 轴承座练习
- @Validated和@Valid使用
- 3D点云论文相关论文资料总结
- 中国财团买得了 Opera,买不了仙童半导体?
热门文章
- idea一直在 downloading plugins for ... 失败
- 如何使用PowerShell在Azure中创建SQL虚拟机
- win10 object type
- Mongo分片+副本集集群搭建
- 团队作业4——第一次项目冲刺(Alpha版本) Day1
- redis 使用案例
- 国庆七天乐 Day7
- [Lintcode]102. Linked List Cycle/[Leetcode]
- Laravel 数据库实例教程 —— 使用DB门面操作数据库
- cocos2d-x3.6 连连看随机地图实现