FitNesse 试用
FitNesse 通常用于集成测试,也非常适合测试后端接口。不过这个工具似乎并不知名,使用也太不广泛。这里简单记录一下用法。
安装和运行
从 FitNesseDownload 下载 jar 包。目前最新包是release 20161106。
命令行中使用 java -jar fitnesse-standalone.jar -p 9999
启动fitnesse server。
fitnesse server 启动后,我们可以通过浏览器访问,截图如下:
用法简介
FitNesse 文档过于简单,不过它提供了一个可以快速上手的 A Two-Minute Example。我们直接看这个例子。
示例测试一个计算器程序中的除法运算。比如,对于10除以2,你期望返回5。FitNesse 使用 input 和 expected output 数据表来表示 test。类似这样:
FitNesse 将这个表格称为 Decision Table,例子中的每行数据代表一个完整的场景。”numerator”和”denominator”列表示 input,而”quotient?”的问号告诉 FitNesse 这一列表示是 expected output(期望的输出值)。以”10/2 = 5.0”为例,可将其理解为一个问句:”如果使用10除以2,我能否得到5?”
点击FitNesse logo旁边的 Test 按钮即可运行测试。
运行结果如下:
绿色表示代码返回正确的期望值,红色表示代码返回值跟预期不同。这里可以看到 expected value 和 actual value 两个不同的值。
另外注意这里用于比较的符号:
- 22/7 ~= 3.14 22/7 约等于3.14
- 9/3 < 5 9/3 的结果小于5
- 11/2 4<_6 11/2 的结果在4和6之间
工作原理
当用户点击 Test 按钮时发生了什么?
- 首先,FitNesse 将 test 表格提交到 Slim,即底层的测试系统(该系统包含实际执行测试所需要的代码)
- Slim 找到跟 test 表格对应的 fixture 代码并运行
- fixture 代码调用应用代码,得到运行结果
- Slim 向 FitNesse 返回 fixture 代码的运行结果
- FitNesse 根据运行结果给 test 表格中标记相应的颜色
那 Fixture Code 又是什么呢?下面是一个例子。
1 | package eg; |
eg
- Java 包名Division
- Java 类
Slim 运行 fixture 代码的流程如下:
- Slim 从左到右处理表格中的每一行数据
- 对每一行,Slim 调用对应的 setter 将输入数据保存到对应字段中。比如对”numerator”会调用
Division.setNumerator()
- 然后,Slim 会调用
Decision.quotient()
方法得到输出数据
以第一行测试数据为例,几个方法调用的顺序如下:
- division.setNumerator(10)
- division.setDenominator(2)
- division.quotient()
如果返回值和期望值匹配,FitNesse 将格子显示为绿色。如果返回值和期望值不匹配,FitNesse 将格子显示为红色并显示期望值和返回值。如果 Slim 遇到异常或者找不到fixture 代码,FitNesse 将格子显示为黄色并显示相应的堆栈信息。
实际中的 fixture 代码不应当做任何实际操作,而是代理到应用代码。即,fixture 代码应当 越”薄”越好 , 最好是充当 FitNesse 表格和实际应用代码之间的 管道 。更多关于 fixture 代码的内容请参考这里。
Decision Table
使用一种简单的标记语言创建上文中提到的 Decision Table,包括表头,文本加粗,下划线,斜体,无序列表,以及其他一些简单的格式化。具体参考 FitNesse.UserGuide.FitNesseWiki。
1 | |eg.Division| |
上面的标记文本可生成如下表格:
Hello FitNesse
现在我们自己动手添加一个 FitNesse 测试。
应用代码
1 | package demo; |
Fixture代码
1 | package demo; |
代码路径 /Users/kc/wd/unitTest/lib1/out/production/classes
添加 FitNesse 测试页面
点击 “Add” 下拉菜单,选择 “Test Page” ,并在页面中添加以下内容并保存
1 | !path /Users/kc/wd/unitTest/lib1/out/production/classes |
- 第1行
!path
指定了类路径 - 第2行
!define
指定当前为 slim 测试 - 第4行
demo.CalculatorDemo
指定了完整的类名 - 第5行指定了输入数据和输出数据
- 第6行及以后为实际测试数据
运行测试
总结
试用下来感觉 FitNesse 还不错。wiki 形式的测试易理解易于团队成员间沟通,非常适用于后台接口测试。后续我将用 FitNesse 对后台接口进行测试,看看效果如何。