官网上的使用说明: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. Moon Http Server,强大如斯的全脚本web服务器

    Moon Http Server(MHS) 是一个使用Pascal脚本的高性能Web服务器. 昨天晚上是第一次接触.花了30分钟入门,非常强大.是Delphi 者开发Web的福音. 引用一下作者的介绍 ...

  2. android ui篇

    android ui篇主要做两件事情. 第一件事情就是能够自己去定义基本的简单的界面. 第二件事情就是能够使用开源library去构造一些复杂的界面. 第一件事情就需要对于布局等方面知识有着基本的掌握 ...

  3. HBase编程 API入门系列之delete(客户端而言)(3)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面的基础,如下 HBase编程 API入门系列之put(客户端而言)(1) HBase编程 API入门系列之get(客户端而言) ...

  4. spring注解、aop(二)

    使用注解配置spring 1.导入 spring-aop-5.0.6.RELEASE.jar包 2.为主配置文件引入新的命名空间 xmlns:context="http://www.spri ...

  5. java StringUtils

    /** * */ package com.sign.utils; import java.util.regex.Pattern; /** * @author Administrator * creat ...

  6. windows 下安装mysql 成功版

    mysql 下载地址 http://dev.mysql.com/downloads/ zip版下载 解压到本地 假设文件保存在C:\mysql-5.7.17-winx64 1.以管理员身份运行cmd. ...

  7. 浅谈Json数据格式

    我们先来看下w3cschool对json的定义: JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XM ...

  8. UIAutomator定位简介

    UIAutomator元素定位是 Android 系统原生支持的定位方式,虽然与 xpath 类似,但比它更加好用,且支持元素全部属性定位.定位原理是通过android 自带的android uiau ...

  9. html第八节课

    导航 1.首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果(从网站上下载即可) 1 <script language="javascript&qu ...

  10. JavaScript获取日期方法

    var time = new Date(); //当前时间 var year = time.getFullYear();//当前年份 var month = time.getMonth()+1; // ...