Fitnesse Slim的使用
官网上的使用说明:http://www.fitnesse.org/FitNesse.UserGuide.WritingAcceptanceTests.Slim
本文主要介绍Slim常用的几种表格,更多其他表格的使用可以参考官网使用手册
Fitnesse默认使用fit,如果要使用slim需要先声明
!define TEST_SYSTEM {slim}
1.Decision Table
表格
源码
package fitnesse.slim.test;
public class ShouldIBuyMilk {
private int dollars;
private int pints;
private boolean creditCard;
public void setCashInWallet(int dollars) {
this.dollars = dollars;
}
public void setPintsOfMilkRemaining(int pints) {
this.pints = pints;
}
public void setCreditCard(String valid) {
creditCard = "yes".equals(valid);
}
public String goToStore() {
return (pints == 0 && (dollars > 2 || creditCard)) ? "yes" : "no";
}
// The following functions are optional. If they aren't declared they'll be ignored.
public void execute() {
}
public void reset() {
}
public void table(List<List<String>> table) {
}
public void beginTable() {
}
public void endTable() {
}
}
Table 的流程
1) 构建ShouldIBuyMilk的fixture
2) 调用table方法(如果存在)
3) 调用beginTable,(用来初始化)
4) 对于表格中的每一行的调用流程
4.1)调用reset方法,以便进行准备和清除
4.2)然后通过调用相应的set方法加载所有输入,输入按照从左到右的顺序加载
4.3)调用execute方法
4.4)最后调用输出的方法,比较表格中的期望值
5)调用endTable方法,清除和关闭你想要的东西
PS:表的第一行填的是类名,不分大小写,这是最基本最常用的表格
2.Dynamic Decision Table
表格
源码
public class AddUpChange {
private Integer totalCents = 0;
private static Map<String, Integer> COIN_VALUES = new HashMap<String, Integer>();
static {
COIN_VALUES.put("1c", 1);
COIN_VALUES.put("5c", 5);
COIN_VALUES.put("10c", 10);
COIN_VALUES.put("25c", 25);
COIN_VALUES.put("50c", 50);
COIN_VALUES.put("$1", 100);
}
public void reset() {
totalCents = 0;
}
public void set(String coin, Integer amount) {
if (!COIN_VALUES.containsKey(coin)) {
throw new IllegalArgumentException("Unknown coin type " + coin);
}
totalCents += amount * COIN_VALUES.get(coin);
}
public String get(String requestedValue) {
if ("$ total".equals(requestedValue)) {
return String.format(Locale.US, "%.2f", totalCents / 100.0);
}
return String.format("%d", totalCents);
}
}
dynamic decision table 基本上和decision table的语法一致,除了需要在第一行中加入ddt
没有?的列,都会统一调用set(header,value)方法,有?的列都会统一调用get(header)方法,除此之外其他方法的调用都跟decision table一样(table, beginTable, reset, execute, endTable).
有#的列都是注释的内容
3.Query Table
表格
源码
package fitnesse.slim.test;
import java.util.Date;
import java.util.List;
import static java.util.Arrays.asList;
public class EmployeesHiredBefore {
public EmployeesHiredBefore(Date date) {
}
public void table(List<List<String>> table) {
// optional function
}
public List<List<List<String>>> query() {
return
asList( // table level
asList( // row level
asList("company number", "4808147"), // cell column name, value
asList("employee number", "1429"),
asList("first name", "Bob"),
asList("last name", "Martin"),
asList("hire date", "10-Oct-1974")
),
asList(
asList("company number", "5123122"),
asList("employee number", "8832"),
asList("first name", "James"),
asList("last name", "Grenning"),
asList("hire date", "15-Dec-1979")
)
);
}
}
第一行中需要加入Query,接下来就是构造函数的参数,每一行的标题就是字段名.Fixture类必须有一个query方法返回结果行,每一行都是由两个元素构成,一个就是字段名,另外一个就是对应的值(String类型)。从表格中的值从最左边开始匹配返回的结果,如果该行中的第一列不匹配,则该条记录是不匹配的,执行时候就查询失败
4.Script Table
表格
源码
public class LoginDialogDriver {
private String userName;
private String password;
private String message;
private int loginAttempts;
public LoginDialogDriver(String userName, String password) {
this.userName = userName;
this.password = password;
}
public boolean loginWithUsernameAndPassword(String userName, String password) {
loginAttempts++;
boolean result = this.userName.equals(userName) && this.password.equals(password);
if (result)
message = String.format("%s logged in.", this.userName);
else
message = String.format("%s not logged in.", this.userName);
return result;
}
public String loginMessage() {
return message;
}
public int numberOfLoginAttempts() {
return loginAttempts;
}
}
第一行Script后面跟的是类名和构造函数的参数,如果该page在script后面没有指定fixture,则会沿用该页面的上一个script table的fixture
Script table 调用方法可以插入式调用,即方法和参数是相间的
也可以连续调用,可以在单元格方法名后面添加分号,然后紧接的单元格都是入参
4.1. 一行中如果只包含一个方法名,那么只有它返回的是布尔值,才会执行的时候变成绿色或者红色,其他情况不会有颜色
4.2. 如果一个变量在第一个单元格,则它后面应该跟的是方法名,该变量的值就是方法返回的值
4.3. 如果第一个单元格是check,则它后面应该跟的是方法名,最后一个单元格就是期望值
4.4. 如果第一个单元格是not check,则它后面跟的是方法名,最后一个单元格就是不希望的期望值
4.5. 如果第一个单元格是ensure,则它后面跟的是方法名,返回的布尔值如果是true就变成绿色,如果是false就变成红色
4.6. 如果第一个单元格是reject,则它后面跟的是方法名,返回的布尔值如果是false就变成绿色,返回的布尔值如果是true就变成红色
4.7. 如果第一个单元格是note,则在执行的时候就会忽略(空格,以#或者*开头的都是这种效果)
4.8. 如果第一个单元格是show,则它后面跟的是方法名,当这个测试运行的时候,一个新的单元格将会被添加,显示的是该方法的返回值
如果第一个单元格是start,它后面跟的应该是一个新的fixture和构造函数的参数,会开始一个新的actor,覆盖上面的,它下面的script都会沿用该fixture
5.Scenario Table
Scenario Table可以被其他tables调用(Script table和Decision table),可以用作封装测试步骤。但是Scenario只能封装Script的测试步骤,而且Script实例要先创建,然后才能调用
5.1 声明Scenario
Scenario Table的格式跟Script table的一致,有插入式调用和连续调用
上表的第一个单元格式scenario,表明这个是scenario table.这个表格的名字是WidgetRenders,它有两个入参,wikiText和htmlText(WidgetRenders不是调用的fixture,而是Scenario的名称),Scenario的名称是camel-cased而且首字母是大写,参数也是camel-cased,而且首字母是小写
Scenario也可以用下划线声明,第二个单元格代表名称,第三个单元格代表参数,每个下划线代表一个参数。
Scenario中@为前缀的都是参数(@后面的参数命名也要遵循camel-cased规则,而且首字母是小写),如果参数比较长,也可以使用@{the parameter}这种形式
Scenario被调用前需要先实例化它的fixture,Scenario中的方法都是来自以下fixture
5.2 Decision Table调用Scenario
Decision Table的名字转化为camel-cased会是WidgetRenders.如果这是一个Scenario的名字在同一个page中,那么Scenario会被调用而不是相同名字的fixture.如果Scenario不再该page定义,但是included中包含了,也遵循该调用规则。
在Scenario中可以使用出参,定义
调用,在表格中新增一列名字后面添加”?”,可以用作捕获值和比较
构造函数参数
如果不想每次调用的时候都要赋值,可以利用构造函数赋值
语法如下 :Scenario Name-[giving|having]-1.Variable Name-1.Variale Value-2.Variable Name-2.Variable Value-……
先确保向后兼容性构造函数参数检查,如果他们是一个Scenario Name.那么就无法传递参数值。
5.3 Script Table调用Scenario Table
调用Scenario是不会有返回值的,所以不能使用check和show关键字
5.4 嵌套调用Scenario
Fitnesse Slim的使用的更多相关文章
- Fitnesse - Slim Tables
Fitnesse - Slim Tables 2017-09-28 目录1 什么是Wiki Word?2 Query Table 2.1 Query Table的格式 2.2 源代码3 Scri ...
- fitnesse - 一个简单的例子(slim)
fitnesse - 一个简单的例子(slim) 2017-09-30 目录1 编写测试代码(Fixture code)2 编写wiki page并运行 2.1 新建wikiPage 2.2 运行 ...
- Fitnesse在eclipse中的调试
需要在Fitnesse的wik中添加: '''此句话专门用来Debug'''!define COMMAND_PATTERN {java -Xdebug -Xrunjdwp:transport=dt_s ...
- 初试FitNesse
1.下载fitnesse-standalone.jar 2.在cmd中输入,开启fitnesse server 3.在浏览器中输入: 4.编写代码: package fitnesse.slim.tes ...
- 介绍并扩展Fitnesse的测试模块化机制:ScenarioTable
摘要:在验收测试框架Fitneese中,使用Scenario可以把最常用的测试步骤封装起来,从而达到模块化定义Fitnesse测试用例的能力.但Scenario仅限于封装Script测试步骤,Scri ...
- fitnesse - Variables and Symbols
fitnesse - Variables and Symbols 2017-09-30 目录 1 Variables(静态变量) 1.1 定义及使用 1.2 Variable作用域 1.2. ...
- 给Fitnesse添加调用多参数fixture的调用方法
修改文件:fitnesse.slim.fixtureInteraction.DefaultInteraction.java 修改如下三处内容: (注意只支持仅含有一个参数,且该参数是多参数的fixtu ...
- Fitnesse批量读取变量信息,并保存到用例执行上下文中
Fitnesse变量可以分成两种,一种是自定义变量,另一种是用例执行过程中的临时变量. 在Finesse使用过程中,如果需要定义一些公共的变量,可以统一在一个文件中使用自定义变量的方法,将公共变量全部 ...
- 扩展Fitnesse的ScriptTable:支持if-then
Fitnesse的ScriptTable只能顺序执行所有行,本博文介绍如何让ScriptTable支持if-then,来条件执行一行. 首先普及一下概念,什么是Fitnesse,听一听.NET版Cuc ...
随机推荐
- CAS配置(3)之restful-api接入接口
第一步,cas服务端对api接口支持 在cas-server-webapp下 pom.xml添加如下依赖 <dependency> <groupId>org.jasig.cas ...
- 使用MALTAB标定实践记录
记录一下整个相机的标定矫正过程,希望能够帮助到刚学习标定的童鞋们- 首先下载matlab calibration toolbox,百度搜索第一条就是了(http://www.vision.caltec ...
- Cloudera Manager安装之利用parcels方式(在线或离线)安装单节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(Ubuntu14.04)(四)
.. 欢迎大家,加入我的微信公众号:大数据躺过的坑 免费给分享 同时,大家可以关注我的个人博客: http://www.cnblogs.com/zlslch/ 和 http ...
- 改善用户体验 Web前端优化策略总结
前端是庞大的,包括HTML.CSS.Javascript.Image.Flash等等各种各样的资源.前端优化是复杂的,针对方方面面的资源都有不同的方式.那么,前端优化的目的是什么? 1. 从用户角度而 ...
- buf.readInt32LE函数详解
offset {Number} 0 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的带有特定尾数格式(readInt32BE() 返回一个较大 ...
- Android高亮TextView
HighlightTextView Android文本高亮控件,基于View实现. 特点 文本高亮 单词自动换行 高亮词组保持在同一行显示 截图 Demo Java: public class Mai ...
- Microsoft SQL Server 2005技术内幕:T-SQL查询笔记
logical operation:基于微软查询处理概念模型的逻辑操作.例如,联接运算符的physical operation属性表示联接算法(nested loops,merge ,hash)物理运 ...
- fatal error C1083: 无法打开包括文件:“stdio.h
现象: vs2012一直fatal error C1083: 无法打开包括文件:"stdio.h" 不知道配置太多,动到了什么地方,出现了这个问题: 在: 解决方案--调试源文件 ...
- SLAM: Inverse Depth Parametrization for Monocular SALM
首语: 此文实现客观的评测了使线性化的反转深度的效果.整篇只在表明反转可以线性化,解决距离增加带来的增长问题,有多少优势--%! 我的天呢!我竟然完整得翻译了一遍. 使用标记点地图构建SLAM的方法, ...
- (转)Openlayers 2.X加载天地图
http://blog.csdn.net/gisshixisheng/article/details/44621923 概述: 在前面的章节,讲到了Arcgis for js加载天地图,在本节讲述如何 ...