官网上的使用说明: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是不会有返回值的,所以不能使用checkshow关键字

5.4 嵌套调用Scenario

Fitnesse Slim的使用的更多相关文章

  1. Fitnesse - Slim Tables

    Fitnesse - Slim Tables 2017-09-28 目录1 什么是Wiki Word?2 Query Table   2.1 Query Table的格式  2.2 源代码3 Scri ...

  2. fitnesse - 一个简单的例子(slim)

    fitnesse - 一个简单的例子(slim) 2017-09-30 目录1 编写测试代码(Fixture code)2 编写wiki page并运行  2.1 新建wikiPage  2.2 运行 ...

  3. Fitnesse在eclipse中的调试

    需要在Fitnesse的wik中添加: '''此句话专门用来Debug'''!define COMMAND_PATTERN {java -Xdebug -Xrunjdwp:transport=dt_s ...

  4. 初试FitNesse

    1.下载fitnesse-standalone.jar 2.在cmd中输入,开启fitnesse server 3.在浏览器中输入: 4.编写代码: package fitnesse.slim.tes ...

  5. 介绍并扩展Fitnesse的测试模块化机制:ScenarioTable

    摘要:在验收测试框架Fitneese中,使用Scenario可以把最常用的测试步骤封装起来,从而达到模块化定义Fitnesse测试用例的能力.但Scenario仅限于封装Script测试步骤,Scri ...

  6. fitnesse - Variables and Symbols

    fitnesse - Variables and Symbols 2017-09-30 目录 1 Variables(静态变量)  1.1 定义及使用  1.2 Variable作用域    1.2. ...

  7. 给Fitnesse添加调用多参数fixture的调用方法

    修改文件:fitnesse.slim.fixtureInteraction.DefaultInteraction.java 修改如下三处内容: (注意只支持仅含有一个参数,且该参数是多参数的fixtu ...

  8. Fitnesse批量读取变量信息,并保存到用例执行上下文中

    Fitnesse变量可以分成两种,一种是自定义变量,另一种是用例执行过程中的临时变量. 在Finesse使用过程中,如果需要定义一些公共的变量,可以统一在一个文件中使用自定义变量的方法,将公共变量全部 ...

  9. 扩展Fitnesse的ScriptTable:支持if-then

    Fitnesse的ScriptTable只能顺序执行所有行,本博文介绍如何让ScriptTable支持if-then,来条件执行一行. 首先普及一下概念,什么是Fitnesse,听一听.NET版Cuc ...

随机推荐

  1. C语言和C++的应用领域都在哪些?学C语言好,还是学习C++好?

    从事嵌入式开发十几年,基本上围绕着这两种编程语言展开,都可以直接操作底层的编程语言,用的越熟练越是感觉工具属性越强.虽然两种编程语言分属于不同的编程思想,用的时间长了觉得差异也不是很大,现在就个人的从 ...

  2. Netty引导流程解读

    Channel的生命周期状态[状态转换将变为相应的事件,转发给ChannelPipeline中的ChannelHandler进行处理] ChannelUnregistered:Channel已经被创建 ...

  3. JAVA 中进行网络通信时,通信的程序两端要传输的对象,不仅要序列化,而且这个对象所属的类的名字要完全一样,连包的名字都得一样

    如上图项目目录,这是一个简易的QQ,客户端登录的时候要传输用户信息到服务器验证,所以两端都会用到User类的对象,但一开始我在Server端的包名是com.qq.server.common,两端的报名 ...

  4. mysql数据库的介绍及安装

    一.什么是数据库 1.什么是数据(Data) 描述事物的符号记录成为数据,描述事物的符号既可以是文字.图片.图像.声音.语言等,数据有多种表现形式,他们都可以经过数字化后存入计算机 在计算机中描述一个 ...

  5. C#中通过js实现个人用户和非个人用户的登陆

    实现用户的登录功能,这里举一个个人和非个人用户的登录的例子 前台代码: <ul class="login_list clearfix"> <li> < ...

  6. Android 打开设置界面或者WiFi连接界面

    1.使用APP打开系统的设置界面或者WiFi连接界面 startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); //直接进入手机中的wifi网 ...

  7. 《java数据结构与算法》系列之“开篇”

    大学的时候学习数据结构,当时吧虽然没挂这门课,但是确实学的不咋地,再但是其实自己一直都觉得数据结构很重要,是基础,只有基础好了,后面的路才能走的更好. 懒惰真的是天下的罪恶之源.所以一直到现在都毕业了 ...

  8. 1、Scala安装与基础

    1.scala与java 2.安装 3.scala编译器 4.变量声明 5.数据类型 6.操作符 7.函数调用 8.apply函数 1.scala与java scala基于java虚拟机,所有scal ...

  9. C++:C++在图片特定区域之外产生随机数

    参考原文:C++产生随机数 (整数) C++在图片特定区域之外产生随机数,避开正则表达式,可以分为两种情况. 第一种:在某个数之前生成随机数:第二种,生成随机数,加上某个数,然后截断:第三种,指定范围 ...

  10. Java:Java 队列的遍历

    Java队列到底有没有可以遍历的功能呢?暂且试一下吧 参考链接:stl容器遍历测试 1.LinkedList实现简单遍历 for(Iter =LocTimesSerials.size()-1; iSe ...