`
超爱fitnesse
  • 浏览: 6943 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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支持。

原文链接:http://www.infoq.com/cn/news/2009/11/interview-cucumber-for-dotnet

1.几句题外话

对于http请求的测试,有几种方式:

  1. 浏览器中输入http url,只适用于GET方法
  2. curl命令手工测试
  3. junit中直接用java network api调用GET/POST方法
  4. 在自动化测试框架中封装指令,如cucumber, fitnesse, robotframework

上述1、2手工测试,不能用于回归测试;3、4能用于回归测试,但要开发测试脚本代码,维护非常麻烦。

今日回想起两年前浅尝辄止的fitnesse,想碰运气看看有没有好的测试插件,结果真找到了用于Restful API测试的插件:RestFixture

2.Fitnesse 20111026+RestFixture 3.0 ——最佳拍档

2.1 http响应格式是xml的示例

废话少说,先上图: 
用Xpath语法检查GET响应内容

上面的测试用例的目的是:

并且 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的示例

用IP获取地址信息

上面的测试用例的目的是:

调用百度地图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))}) | |

body替换后测试结果

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使用文档

RestFixture使用文档链接

https://cloud.github.com/downloads/smartrics/RestFixture/RestFixture-3.0.pdf

RestFixture使用文档片段

3.2 运行环境

fitnesse运行环境文件目录:

fitnesse文件目录 
restfixture文件目录

注意:其中的slf4j-simple-1.6.6.jar需要额外下载

启动fitnesse命令: 
启动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 首页:
  • 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 的运行结果: 
最新版Fitnesse的运行结果

其中的GET行,只有第2、3列正确显示,4、5列显示为HTML文本,看上去十分杂乱,

旧版的Fitnesse是这样显示的:

用Xpath语法检查GET响应内容

后续的博客中,我会介绍如何让RestFixture 3.0在Fitnesse 20140630中也能打印出漂亮的测试结果。

 

为Fitnesse-20140630定制RestFixture代码

0
1
分享到:
评论

相关推荐

    Bootstrap模板:高效Web开发的利器.zip

    Bootstrap模板作为现代Web开发中的一款利器,以其高效、易用和响应式设计的特性,极大地提高了Web开发的效率和品质。通过掌握Bootstrap模板的基本概念、优势和使用方法,并结合实战案例进行练习和实践,相信读者可以...

    中台战略:企业数字化转型利器.pdf

    中台战略:企业数字化转型利器.pdf

    Burp Suite安装教程:网络安全测试的利器.txt

    burpsuite安装详细教程

    Python实现EMV指标计算:股票技术分析的利器系列(2)

    Python实现EMV指标计算:股票技术分析的利器系列(2)

    OMToolkit介绍(2) :Web Server 实现

    本文将深入探讨OMToolkit的第二部分——Web服务器实现,旨在帮助用户更好地理解和利用该工具进行Web服务相关的操作。 首先,我们要了解Web服务器的基本概念。Web服务器是一种软件,它接收HTTP(超文本传输协议)...

    模糊测试 强制发掘安全漏洞的利器

    《模糊测试:强制发掘安全漏洞的利器》是一本系统性描述模糊测试的专著,介绍了主要操作系统和主流应用类型的模糊测试方法,系统地描述了方法和工具,并使用实际案例帮助读者建立直观的认识。随着软件安全性问题变得...

    探索Python的Web开发框架:构建高效应用的利器

    Python是一种广泛使用的高级编程语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进来区分代码块,而不是使用大括号或...

    Nginx:构建高效Web架构的利器.pdf

    ### Nginx:构建高效Web架构的利器 #### 一、Nginx的基本概念 Nginx是一款基于事件驱动架构的高性能HTTP服务器和反向代理服务器。与传统的基于进程或线程的Web服务器不同,Nginx采用了轻量级的设计理念,能够高效...

    Rest 测试利器Postman v4.1.3

    **Postman:REST测试利器详解** 在现代Web开发中,RESTful API已经成为服务端与客户端交互的主要方式。为了确保这些接口的功能性和性能,测试工具至关重要。Postman是一款强大的REST客户端工具,尤其适用于测试...

    PyCharm代码检查:提升代码质量的利器

    它提供了许多强大的功能,以帮助开发者编写、测试和调试Python应用程序。PyCharm有两个主要版本: 1. **PyCharm Community Edition(社区版)**:这是一个免费且开源的版本,提供了基本的Python开发功能,包括代码...

    逻辑分析仪:数字设计验证的利器

    逻辑分析仪是一种专门用于捕获和分析数字信号的测试仪器,它在数字电路设计、验证和故障诊断中发挥着重要作用。本文将详细介绍逻辑分析仪的基本概念、工作原理、使用方法以及在实际应用中的优势。 逻辑分析仪是数字...

    VBScript:Windows脚本编程的利器

    虽然VBScript在现代Web开发中的使用已经不如以前广泛,但它仍然是Windows系统管理员和自动化脚本开发者的重要工具之一。随着技术的发展,VBScript可能不再是微软主推的脚本语言,但它在特定领域的应用仍然具有价值。

    Perl脚本:灵活多用的编程利器

    它最初被设计为一种文本处理工具,但随着时间的发展,Perl已经证明了自己在多个领域的强大能力,包括但不限于系统管理、网络编程、生物信息学和Web开发。 Perl脚本是一种功能强大的工具,它可以帮助开发者高效地处理...

    单元测试利器JUnit4

    单元测试是软件开发过程中的重要环节,它能帮助开发者确保代码的质量和稳定性。JUnit4作为Java平台上最流行的单元测试框架,极大地简化...阅读《单元测试利器JUnit4.pdf》文档将更深入地理解这些概念,并提供实践指导。

    Pandas实战指南:数据分析的Python利器

    Pandas是Python中进行数据分析的利器,它提供了丰富的数据结构和数据分析工具。通过本文的介绍和代码示例,你应该能够掌握Pandas的基本用法和一些高级技巧,从而在实际的数据分析工作中更加得心应手。无论是数据清洗...

    LaTeX:学术界的排版利器.txt

    latex

    深入理解 SSH:安全远程访问的利器.pdf

    SSH 是一种强大且安全的远程访问协议,广泛应用于系统管理和网络服务。通过理解 SSH 的工作原理、配置方法和安全最佳实践,您可以有效地利用 SSH 进行安全的远程管理和文件传输。希望本文能帮助您深入理解 SSH,并在...

    Debugging with Fiddler 2012 (英文版 Eric Lawrence 亚马逊5星 热评 畅销书) 网络编程 Web服务开发调试利器

    Debugging with Fiddler 2012 (英文版 Eric Lawrence 亚马逊5星 热评 畅销书) 网络编程 Web服务开发调试利器 亚马逊11个客户全部评5星,热评畅销书。 Web Services 开发必备。

    DeWeb:Delphi开发Web/小程序/公众号的利器

    DeWeb:Delphi开发Web/小程序/公众号的利器 DeWeb是一个革命性的工具,它能够将Delphi程序快速转换为网页应用,极大地简化了开发过程。使用DeWeb,开发者无需学习HTML/CSS、JavaScript、Java、PHP、ASP、C#等复杂的...

Global site tag (gtag.js) - Google Analytics