啄木鸟之家大吕

敏捷测试已成为现在式,尽早和持续的反馈成为各研发团队的必选项。测试同学也需要跟上这个趋势。除了“找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用起来吧,提升一下测试工作的技术含量吧~

一步一步教你搭建和使用FitNesse的更多相关文章

  1. 一步一步教你编写与搭建自动化测试框架——python篇

    [本文出自天外归云的博客园] 这两天用python写了一个自动化测试框架,取名为Auty.准备用来做Web方面的接口测试,以下为Auty框架一步一步的搭建过程——

  2. 一步一步搭建11gR2 rac+dg之安装rac出现问题解决(六)【转】

    一步一步在RHEL6.5+VMware Workstation 10上搭建 oracle 11gR2 rac + dg 之安装rac出现的问题 (六) 本文转自 一步一步搭建11gR2 rac+dg之 ...

  3. SpringBoot+MyBatisPlus+ElementUI一步一步搭建前后端分离的项目(附代码下载)

    场景 一步一步教你在IEDA中快速搭建SpringBoot项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/87688277 ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容

    上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...

  6. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

  7. 一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)

    cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑.每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大…… 但是凭心而论,3.0RC版本开始 ...

  8. 一步一步搭建Jenkins环境

    Jenkins使用经验谈1(一步一步搭建Jenkins环境)在公司使用 Jenkins 软件已经有一段时间了,走了很多弯路,但也积累了一些经验,可以和大家分享一下.我们来一起搭建Jenkins环境.首 ...

  9. 一步一步搭建客服系统 (2) 如何搭建SimpleWebRTC信令服务器

    上次介绍了<3分钟实现网页版多人文本.视频聊天室 (含完整源码)>使用的是default 信令服务器,只是为了方便快速开始而已.SimapleWebRTC官方文档里第一条就讲到,不要在生产 ...

随机推荐

  1. 《Go学习笔记 . 雨痕》反射

    一.类型(Type) 反射(reflect)让我们能在运行期探知对象的类型信息和内存结构,这从一定程度上弥(mi)补了静态语言在动态行为上的不足.同时,反射还是实现元编程的重要手段. 和 C 数据结构 ...

  2. Entity framework 增加默认执行时间

    public partial class ProductionSupportEntities : DbContext { public ProductionSupportEntities() : ba ...

  3. hdu 1042 N! 高精度运算

    N!                                                                              Time Limit: 10000/50 ...

  4. Snmp学习总结(二)——WinXP安装和配置SNMP

    一.安装SNMP 今天讲解一下在XP下安装SNMP协议,安装步骤如下:

  5. 字符串转换成整型,到底使用int.Parse,Convert.ToInt32还是int.TryParse?

    当我们想把一个字符串转换成整型int的时候,我们可能会想到如下三种方式:int.Parse,Convert.ToInt32和int.TryParse.到底使用哪种方式呢? 先来考虑string的可能性 ...

  6. ArcEngine二次开发错误编码对照表(转)

    阅读数:3323 每当我们在进行AE开发,出现错误时经常会出现错误代码,但是我们并不知道它到底代表什么意思,这里的而错误编码我们可以对照着找到我们需要的时候常详细信息(问题是,经常还是会出现没有错误编 ...

  7. Git:基础要点

    直接快照,而非比较差异. 近乎所有操作都可本地执行. 在Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网.但如果用CVCS 的话,差不多所有操作都需要连接网络.因为Git 在本地磁盘上就保 ...

  8. Android在Gallery中每次滑动只显示一页

    import android.content.Context; import android.util.AttributeSet; import android.view.KeyEvent; impo ...

  9. 【 D3.js 入门系列 --- 2 】 怎样使用数据和选择元素

    本人的个人博客首页为: http://www.ourd3js.com/  ,csdn博客首页为:http://blog.csdn.net/lzhlzz/. 转载请注明出处,谢谢. 接着上一讲的内容,这 ...

  10. [Android Security] APK自我保护 - 代码乱序

    cp : https://segmentfault.com/a/1190000005095406 乱序原理 为了增加逆向分析的难度,可以将原有代码在 smali 格式上进行乱序处理同时又不会影响程序的 ...