啄木鸟之家大吕
敏捷测试已成为现在式,尽早和持续的反馈成为各研发团队的必选项。测试同学也需要跟上这个趋势。除了“找bug”、“分析需求”、“功能测试”,还需考虑“交付质量、一次做对、在没有用户界面情况下尽早接口测试”。
测试要拥抱变化,改变过去到最后才安排测试活动以及只能做黑盒测试的被动局面,从项目一开始就开始测试活动。
今天给大家介绍的FitNesse,就是一个完全集成单独可运行wiki的验收测试框架。它是开源的wiki web服务,允许创建自己的web页用于包含测试表格,这些测试表格实际就是测试数据。FitNesse主要用于支持敏捷方式的黑盒验收和回归测试,它也是一个协作工具,可支撑开发和测试、研发和业务同学一起准备测试用例集(test suite)。
从自动化测试金字塔结构来说,FitNesse定位业务接口测试层面,介于UI和单元测试之间。该定位确保我们的测试可在UI没出来前就可以开展测试,而且基于wiki页面的方式,也确保业务、开发和测试之间良好的沟通,因为业务方也能很容易读懂测试内容。
为什么要用Fitnesse
敏捷测试团队可以用FitNesse来准备业务验收测试用例集,用它们来测试系统对外的方法,有点类似Junit和TestNG等,它们之间主要区别是 FitNesse用wiki页面上表格形式来表示测试用例,项目上各角色都可以很方便共享这些用例。
好处:
1、通过执行自动化的验收测试用例实现尽早反馈
2、通过类似Junit的红色(测试失败)和绿色(测试通过)显示,能很清晰展现测试执行结果
3、能根据质量要求设计不同覆盖程度的测试数据
4、测试用例通过wiki语言编写并通过表格形式展示,各方都能理解
5、通过测试表格定义测试用例的输入和预期结果,很直观
备注:关于FitNesse特性介绍可直接参考官网
用FitNesse能做什么
通过FitNesse,我们能创建测试用例和测试用例集(简称测试集),这跟平时我们做测试要做的测试活动类似。测试用例是单个测试脚本,测试集是一组测试用例集合。当我们执行测试集时,测试集中所有测试用例都会被执行,因此我们需要合理安排每个测试集中应该包括的测试用例。
FitNesse框架原理简介
FitNesse框架包含Wiki、Test system、Fixtures,其中
1、Wiki:展现具体的Test Case、Test suite、甚至是Test Requirement;
2、Test system:Fitnesse的执行引擎,包括两个部分:Slim、Fit
3、Fixtures:真正的测试代码
具体如图所示。
- SUT:System Under Test,也就是被测试的系统。
- Custom Fixture:也就是针对具体被测试系统设计的测试代码。
- SLIM:Simple List Invocation Method的缩写,它包括SLIM Runner和SLIM Executor两部分。
以SLIM执行引擎为例来说,当我们点击Test按钮开始测试执行时,Fitnesse读取页面表格数据,然后调用SLIM Runner将该表格解释为SLIM指令发送给SLIM Executer,之后Executer调用Fixture测试代码,最后Fixture测试代码执行具体的测试函数。一般我们就是通过该测试代码中测试函数跟被测系统交互完成测试验证的。
Fit类似原理,Fit执行引擎对测试代码要求更严格,建议采用SLIM,下文将以它为例展开,若要进一步了解FIT测试框架,请自行百度或阅读官网说明。
下载和配置FitNesse
1、进入FitNesse官网下载页面:http://www.fitnesse.org/FitNesseDownload,下载最新的fitnesse-standalone.jar。
2、打开command命令行窗口,到fitnesse jar包所在目录,然后执行该文件。(注:为方便,大家为下面命令行创建批处理文件。下面端口号可自己随意设置)
java -jar fitnesse-standalone.jar -p 2222
文件成功执行成功后,FitNesse启动情况如下。
3、打开FitNesse,只需要在浏览器输入http://localhost:<portnumber>,本例子是http://localhost:2222
在该页面,大家可看到Edit和Add菜单,点击Add,可看到Suite page(测试集页)和Test page(测试用例页)。当我们创建某个测试集页,所有在该页面上的测试脚本在执行时都会被执行。为讲解方便,下面以创建某个测试用例页为例。
FitNesse例子
我们将以一个简单的计算器程序为例,代码包括4个方法:
1、addition() 加
2、minus() 减
3、multiply() 乘
4、divide() 除
(注意:FitNesse能支持大部分开发语言,用Java为例而已)
FitNesse中代码被称作Fixture(大家可称为夹具,本文直接以英文称呼),它是测试代码,也是FitNesse和待测系统之间连接点。因此,当你要测试某个方法,就需要编写一个fixture,测试执行时该fixture被触发,然后测试该方法。
计算器例子对应的Fixture代码如下:
public class Calculator {
private int first, second;
public void setFirst(int first) {
this.first = first;
}
public void setSecond(int second) {
this.second = second;
}
public int addition() {
return (first + second);
}
public int minus() {
return (first - second);
}
public int multiply() {
return (first * second);
}
public float divide() {
return (first / second);
}
}
eclipse中的代码如下:
后面需要该计算器代码的class文件,请确保编译成功。
开始FitNesse编写测试
STEP #1,让我们进入fitnesse frontpage页面。在该页面Add菜单,选择Test page,然后输入测试的名字,然后点击save按钮。根据这个case,我们输入Calculator
STEP #2,在浏览器中使用.操作符。类似:
STEP #3,点击edit按钮,然后输入下面的代码行
让我们一行一行看一下这些内容的含义:
a)第一行表示FitNesse使用SLIM测试系统 (关于SLIM调用关系还不清楚,参考上面框架原理介绍章节)
b)第二行定义了测试代码Class文件所在路径,本例Java class文件保存在“C:AndrewalipayautomationbirdieAutobin”
c)第三行引入class文件所在包
d)第四行说明了具体的class文件,本例为“Calculator”
e)第五行开始具体测试内容部分:
前面2列 |first|second| 表示测试方法的输入参数,之后每个带“?”列都是要测试的函数预期的返回值|addition?|minus?|multiply?|divide?|,测试执行时会将
前面测试参数传入,然后调用函数计算结果,并跟相应列中测试数据,也就是预期值进行比较,若符合就通过,若不符合则算失败。
f)接下来就几行都是测试数据。每一行就是代表一个测试点。我们以第一个测试点为例说明一下:
|first|second|addition?|minus?|multiply?|divide?|
|4 |2 |6 |2 |8 |2.0 |
这表示将4作为第一个参数,2作为第二个参数输入传给addition函数,然后将返回值跟该列对应预期值6进行比较。其它列minus、multiply和divide类似处理。
备注:若测试代码行之间有空行,可能会报如下错误:
STEP #4,编辑完成后,点击保存按钮,你的页面如下
STEP #5,点击页面上test按钮,将得到下图所示结果
执行结果第一行很清楚告诉有几个测试(1个)、几个断言(12个),以及相应执行结果,还给出测试执行时间。
在表格上会标准执行了那个包、那个测试代码类,每个预期结果比对情况。
若通过则显示绿色,若失败则显示红色。类似Junit展现方式。
STEP #6:为了演示需要,让我们修改几个错误预期值,比如:第一行测试数据加法预期从6改到7,第二行减法预期从5改到4,第三行除法从1.0改到2.0。
STEP #7:再次点击Test按钮,大家可看到它们变成红色了,表示不符合预期测试失败了。
Fixture/Table类型:
在FitNesse中,Fixture的表格类型支持多种类型,主要有:
1、列(Column)格式的Fixture,也就是上面例子样子,使用最广泛。列直接对应待测函数的输入参数和返回预期值,适合各类组合的输入参数,然后跟预期结果比对。
2、行(Row)格式的Fixture,返回结果是列表的测试验证,比如可用于根据某个条件查询得到很多行返回结果的测试情况。
3、Action Fixture,支持工作流方式的一系列测试函数组合,可用于多个测试函数组合的业务测试类型。
!|ActionFixture||start|ActionFixtureTest||enter|firstPart|Hello||enter|secondPart|World||press|join||check|together|Hello, World|
建议:
本文介绍FitNesse框架原理、安装以及通过简单case一步步说明如何入门。该工具本身带有user guide和很多用例演示,大家可进一步深入了解。
从上文演示例子,大家可看到,该工具需要测试同学掌握一些编码技能,一旦我们具备基本的编码技能,那么FitNesse就非常适合基于API或对外暴露接口的业务验收测试,毕竟基于Wiki的页面让项目各方都很容易理解测试点和测试数据。
你还在等什么,赶快试用起来吧!
结论:
敏捷测试中一般采用4个层次的测试:
1、自动化单元测试,一般基于Junit等Xunit系列
2、自动化验收测试,可基于FitNesse
3、自动化UI回归测试,可基于Selenium或QTP等
4、手工测试
基于测试分层的金字塔原理,我们应尽量多采用自动化单元和验收测试,而等底层足够稳定,再开展UI自动化测试,这样不仅实现测试提前和尽早反馈的目的,而且让UI自动化回归测试效率更高。
如果Junit一般由开发负责,那么测试同学就尽快把FitNesse用起来吧,提升一下测试工作的技术含量吧~