Scenario:模块化定义Fitnesse测试用例的能力和局限

首先普及一下概念,什么是Fitnesse,听一听.NET版Cucumber的创始人Aslak Hellesøy谈Fitnesse与Cucumber对比:

FIT/Fitnesse和Cucumber都执行高级语言编写的验收测试。FIT仅识别HTML,Fitnesse则通过提供Wiki语法来简化编写测试的过程。在FIT/Fitnesse当中,所有的测试都以表格的形式呈现。 
FitNesse比Cucumber的优势在于Wiki支持。

原文链接:http://www.infoq.com/cn/news/2009/11/interview-cucumber-for-dotnet

《实例化需求》中关于Fitneese的描述:

FitNesse套件(活文档)覆盖的所有功能,通过了完整的系统测试和用户验收测试,在生产环境上线时也没有发现任何缺陷。系统测试时发现了几个核心计算组件以外的错误。业务人员之所以觉得用户验收测试非常好,是因为出现计算错误时,我们都非常确定根本问题是在计算代码的上游。使用了FitNesse后,很容易诊断出缺陷的根源,从而可以更加利落快速地交付到生产环境中。

原文链接:http://www.douban.com/group/topic/35316487/

1.Scenario是什么

Fitneese的SliM UserGuide中介绍了 Scenario

原文是这么介绍Scenario的:

A Scenario table is a table that can be called from other tables; namely Script Table and Decision Table.

The format of a Scenario table is the same as the format of a Script Table, but with a few differences. You can see a Scenario table in action here.

Scenario是一种Table,可以被Script Table 和 Decision Table调用。

由此很多人都对Scenario报了很大的期望,希望能用Scenario模块化封装测试步骤。

2.Scenario能力展示

下面是我结合Script示例和Scenario示例写的一个Scenario演示用例:

wiki文本:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

!define TEST_SYSTEM {slim}

!path classes

|import|

|fitnesse.slim.test|

!4 定义scenario checkLogin: 登录并检查结果

| scenario | checkLogin | u || p || ensure || logged |

| @{ensure} | login with username | @{u} | and password | @{p} |

| check @{logged} | login message | @{u} logged in. |

| show | number of login attempts |

!4 创建script实例,后面调用scenario都是针对这个实例

| script | login dialog driver | Bob | xyzzy |

!4 Invoking a scenario from a !-DecisionTable-!

| checkLogin |

| u | p | ensure | logged |

| Bob | xyzzy | ensure |  |

| Bob | zzyxx | reject | not |

| Cat | xyzzy | reject | not |

!4 Invoking a scenario from a !-ScriptTable-!

| script |

| checkLogin | Bob || zzyxx || reject || not |

| checkLogin | Bob || xyzzy || ensure ||  |

!4 script原示例

| script | login dialog driver | Bob | xyzzy |

| login with username | Bob | and password | xyzzy |

| check | login message | Bob logged in. |

| reject | login with username | Bob | and password | bad password |

| check | login message | Bob not logged in. |

| check not | login message | Bob logged in. |

| ensure | login with username | Bob | and password | xyzzy |

| note | this is a comment |

| show | number of login attempts |

| $symbol= | login message |

The fixture for this table is:{{{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;

  }

} }}}

测试用例页面:

点击Test执行后:

展开DecisionTable调用Scenario的测试结果:

展开ScriptTable调用Scenario的测试结果:

至此,我们看到Scenario可以把Script步骤封装起来,取个模块名,然后使用DecisionTable或ScriptTable调用。

3.Scenario的局限

请注意调用Scenario前的这一行:

目的是在调用Scenario前先创建好Script实例。

如果去掉这一句,再执行,是这样的结果:

再尝试一下,把创建Script实例的语句塞到Scenario中:

?


1

2

3

4

5

6

!4 定义scenario checkLogin: 登录并检查结果

| scenario | checkLogin | u || p || ensure || logged |

| script | login dialog driver | Bob | xyzzy |   <--这是新加的创建Script实例的语句

| @{ensure} | login with username | @{u} | and password | @{p} |

| check @{logged} | login message | @{u} logged in. |

| show | number of login attempts |

保存后执行测试:

4.不满意怎么办?

我还想使用Scenario封装TableTable,比如RestFixture定义的TableTable, 
国外最著名的软件开发问答网站stackoverflow.com也在问: 
Can I make a scenario of RestFixture table in fitnesse?, or is there another way to make reusable components?

我准备修改Fitneese代码,使得Scenario能直接封装ScriptTable和TableTable,请关注后续博客……

Scenario:模块化定义Fitnesse测试用例的能力和局限

时间: 2024-10-11 04:38:43

Scenario:模块化定义Fitnesse测试用例的能力和局限的相关文章

转:什么是好的测试用例

这项研究部分基于NSF制定的EIA-0113539 ITR/SY+PE:“提高软件测试者的教育.” 材料中表达的任何观点.发现和结论或者评论都属于作者,不代表国家科学基金会(NSF)的观点. 摘要 设计好的测试用例是一门复杂的艺术.其复杂性有三个原因: 1.测试用例能帮我们发现信息.不同类型的测试对不同类型的信息有效. 2.可以从多方面证明测试用例是“好的”.但没有一个测试用例在任何方面都很优秀. 3.人们往往会根据某个测试类型来创建测试用例,比如域测试或基于风险的测试.好的域测试与好的基于风险

从273二手车的M站点初探js模块化编程

前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据. 273这个M站点是产品推荐我看的.第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的.所以就顺便看了下源码. 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度). 三次加载和分

css预处理语言的模块化实践

编写css是前端工作中,一项普通而又频繁的劳动,由于css并不是一门语言,所以在程序设计上显得有些简陋.对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目,那就需要对css进行管理和规范了,否则会发生不可挽回的后果(吓唬谁呢??). 背景上一节[从css谈模块化]我们通过规范的约束,将css的编写方式进行了优化和改进,形成一种可持续发展的路线.但还是遗留了一些问题:冗余.虽然我们通过定义公共模块和私有模块,来委婉地分担common的体积,但commo

测试用例质量的评估

测试用例质量的评估,可以考虑下面3个方面的因素: 第一,根据测试用例的形式评估其质量,主要包括: 1)测试用例与需求规格说明中需求条目的可追溯性,例如:我们要求每个需求条目至少有1个测试用例与之对应.目的是为了评估测试的需求覆盖率,以及分析需求发生变更的时候,对测试修改工作的影响程度; 2)测试用例有无明确的期望结果.通常来说,测试用例的每个执行步骤,都应该明确描述期望的结果,以保证测试人员可以与测试实际结果进行比较,并分析是否需要提交缺陷报告,或者修改测试用例. 3)是否满足公司内部定义的测试

JavaSript模块化 &amp;&amp; AMD CMD 详解.....

模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理.模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式.可以想象一个巨大的系统代码,被整合优化分割成逻辑性很强的模块时,对于软件是一种何等意义的存在.对于软件行业来说:解耦软件系统的复杂性,使得不管多么大的系统,也可以将管理,开发,维护变得“有理可循”.(等同于Java 高内聚低耦合思想详情请参见Java编程思想第三版) 还有一些对于模块化一些专业的定义为:模块化是软件

JavaSript模块化-AMD规范与CMD规范

JavaScript模块化 在了解AMD,CMD规范前,先来简单地了解下什么是模块化,模块化开发. 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理.模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式.可以想象一个巨大的系统代码,被整合优化分割成逻辑性很强的模块时,对于软件是一种何等意义的存在.对于软件行业来说:解耦软件系统的复杂性,使得不管多么大的系统,也可以将管理,开发,维护变得"有理可循". 一些对

javaScript模块化规范ADM与CMD介绍

模块化:模块化是指在解决某一个复杂问题时,依照一种分类的思维把问题进行系统性的分解处理,可以想象一个巨大的系统代码,被整合优化分割成逻辑性很强的模块时,对于软件是一种何等意义的存在. 模块化系统所必须的能力: 1.定义封装的模块 2.定义新模块对其他模块的依赖 3.可对其他模块的引入支持 AMD模块规范:其实就是异步模块定义,所有的模块将被异步加载,模块加载不影响后面语句运行,所有依赖某些模块的语句均放置在回调函数中. AMD规范定义了一个全局变量define函数,格式为:define(id, 

如何编写有效测试用例

转载 如何编写有效测试用例 测试用例,是一份关于具体测试步骤的文档,它描述了测试的输入参数.条件及配置.预期的输出结果等,以判断被测软件的工作是否正常. 设计.书写和执行测试案例是测试活动中重要的组成部分,测试案例通常由测试案例管理系统或工具进行管理. 一.编写测试用例的原则 测试用例的重要性是毋庸置疑的,它是软件测试全部过程的核心,是测试执行环节的基本依据.测试用例编写应该遵循的原则: 测试用例要达到最大覆盖软件系统的功能点. 测试用例对测试功能点.测试条件.测试步骤.输入值和预期结果应该有准

等价类和边界值方法编写测试用例

测试用例概念: 定义:测试用例是为了特殊目的,而主要记录了测试步骤.方法.数据.预期结果的文档,由测试人员在执行测试之前编写. 写用例主要包括:(编号.测试目的.用例描述(步骤.数据).预期结果) 测试中你可能会用到的问题? 不知道是否全面测试了所有问题? 所有的功能是否全测试到了? 每个功能测试的是否全面? 存在大量冗余测试,影响测试效率. 有些功能点可能测试多次? 对新版本的重复测试很难实施. 每个版本测试的步骤,数据都不一样,随意性很强. 测试的覆盖率无法衡量. 最后测试的结果好与坏无法准