• 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是不会有返回值的,所以不能使用checkshow关键字

    5.4 嵌套调用Scenario

  • 相关阅读:
    利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试
    spring mvc中,直接注入的HttpServletRequst是否安全呢?
    基础篇系列,JAVA的并发包
    撸基础篇系列,JAVA的NIO部分
    1, 本地缓存的实现以及遇到的问题
    python操作mysql数据库之pymysql
    软件测试中常见的一些经典Bug
    做性能测试前需要弄明白的几个知识点
    接口测试常见问题汇总
    用例中四大核心要素的写作规范
  • 原文地址:https://www.cnblogs.com/wuqm/p/6612824.html
Copyright © 2020-2023  润新知