测试即文档:自动化测试框架Concordion

如果你是那种极不情愿写文档的程序员,那么,你并不孤单。然而当你的上司在检查你的工作时,他才不想看你那一堆一堆的代码,他需要看文档,这时的你需要的是Concordion——一个符合Specification By Example的自动化测试框架,通过自然语言来描述软件功能,即项目中所有成员都能看懂的而又具备测试功能的html文档。

  (一)Concordion的工作原理

  简单的说,Concordion测试只是对JUnit的扩展,但是它可以从你写好的测试文档(html)中读取测试数据,通过传统的JUnit来跑测试,并将测试结果输出为具有红绿标记(表示失败或成功)的html文档(基于原测试文档)。

   在上图中,Specification即为我们写的html测试文档,与普通的html文档不同的是,我们需要在其中加入一些名为concordion 的标签,浏览器将忽略这些标签,但Concordion用这些标签来执行测试指令,比如调用Fixture中的测试函数等。Fixture为继承自 ConcordionTestCase(最终继承自JUnit测试类)的测试用例,这些测试用例将调用我们自己所开发的功能代码。

  (二)Concordion的Hello World

  下面就通过一个简单的Hello World例子来演示Concordion。

  下载Concordion和其所依赖的包

  首先写一个html测试用例HelloWorld.html:

<html xmlns:concordion=http://www.concordion.org/2007/concordion>
    <body>
        <p>Should print:</p>
        <p concordion:assertEquals="sayHello()">HelloWorld</p>
    </body>
</html>

  此html文档可以通过浏览器正常打开,由于浏览器并不知道concordion标签,故将其忽略:

   可以看到,以上加入的concordion标签的html测试文档和普通的html文档并无区别,同时我们也看到在concordion标签后有一个 sayHello()函数调用,此函数从什么地方来呢——这就是Concordion的约定,要求在该html文档的同目录下有一个名为 HelloWorldTest.java的测试用例类存在,并且该类有一个测试函数名为sayHello()。约定规则为:如果html文档名为 Foo.html,那么测试用例类应该为FooTest.java。此时Concordion便通过名字匹配去找名为HelloWorldTest类的 sayHello()函数并调用之。

  我们还注意到,在concordion标签后有assertEquals,此时Concordion将把helloWorld()函数的输出与之后的“HelloWorld”字符串相比,如果相等,测试成功,否则失败。

  接下来实现HelloWorldTest类,在HelloWorld.html同目下创建HelloWorldTest.java文件:

package com.thoughtworks.davenkin.concordion;

import org.concordion.integration.junit3.ConcordionTestCase;

public class HelloWorldTest extends ConcordionTestCase {

    public String sayHello()
      {
           return new HelloWorld().sayHelloWorld();
      }
}

  在HelloWorldTest.java文件中实例化了一个HelloWorld对象,并调用其sayHelloWorld()方法,于是写一个需要测试的HelloWorld类如下:


package com.thoughtworks.davenkin.concordion;

public class HelloWorld
{
     public String sayHelloWorld()
       {
            return "HelloWorld";
       } 
}

  最终生成的工程目录结构如下:

  (三)编译并运行测试

  打开终端,将目录切换到 concordion(这是笔者为此helloworld创建的工程根目录,请不要与上文提到的concordion混淆)下,编译:

javac -cp lib/*:src:test test/com/thoughtworks/davenkin/concordion/HelloWorldTest.java

  用JUnit运行测试:

java -cp lib/*:src:test org.junit.runner.JUnitCore com.thoughtworks.davenkin.concordion.HelloWorldTest

  运行结果如下:


JUnit version 4.8.2
./var/folders/wM/wMUC8-0FEsq-MMkTzdzYA++++TI/-Tmp-/concordion/com/thoughtworks/davenkin/concordion/HelloWorld.html
Successes: 1, Failures: 0

Time: 0.307

OK (1 test)

  运行成功,并且显示测试输出的html文件的全路径名称(此时应该去掉最前面的那个点"."):

/var/folders/wM/wMUC8-0FEsq-MMkTzdzYA++++TI/-Tmp-/concordion/com/thoughtworks/davenkin/concordion/HelloWorld.html

  打开该文件:

  测试运行成功。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-28 20:49:09

测试即文档:自动化测试框架Concordion的相关文章

文档生成框架

序言 Word文档生成在许多项目中都是需要的,目前来看有两种方案,一种是通过Apache POI工具包.iText来生成,另外一种是利用Office Open Xml规范来进行生成.各种方案各有优缺点,这里不对其进行详细比较,已经有许多人进行过深入的比较,详细请咨询谷哥和度娘.这里采用的方案是利Office Open Xml的方式进行文档生成. 对于采用POI,iText来说,要生成复杂的Doc文件,其实并不容易.而采用Xml结构生成,去把一个文档生成xml文件,看看里面的内容,估计也会是满头是

serialize函数重载-mfc文档视图框架下怎么实现对话框中数据的保存与打开

问题描述 mfc文档视图框架下怎么实现对话框中数据的保存与打开 在文档菜单栏上自己添加了一个对话框资源,并在对话框上添加了保存与打开按钮,想在对话框中重载文档serialize函数,但程序总是进不去,请问怎么实现? 解决方案 先看serialize是否有调用,然后就是对话框是否获取到数据 解决方案二: 程序进不去是什么意思.你不如重新用向导创建一次. 新建一个单文档程序,最后一步,从CFormView继承.重写OnNewDocument和OnOpenDialog

VC文档 视图 框架窗口间的关系和消息传送规律

文档 视图 框架窗口间的关系和消息传送规律在MFC中M$引入了文档-视结构的概念,文档相当于数据容器,视相当于查看数据的窗口或是和数据发生交互的窗口.(这一结构在MFC中的OLE,ODBC开发时又得到更多的拓展)因此一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类.(VC6中支持创建不带文档-视的应用) 在程序运行时CWinApp将创建一个CFrameWnd框架窗口实例,而框架窗口将创建文档模板,然后有文档模板创建文档实

基于WPF系统框架设计(5) Ribbon整合Avalondock 2.0实现多文档界面设计(二)

AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的 版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. AvalonDock 2.0版本已经发布了,新版本 是用MVVM框架重新编写,似乎也用了Command(命令)模式.2.0版的文档尚未发布,但你可以参考 Avalon.TestApp 或者2.0版源码中的Avalon.MVVMTestApp文件夹来查看新的API. 前一篇博文有介绍关于AvalonDoc

测试即是文档

文档需要全面,实时更新,并且易懂.我说的全面是指除了介绍程序的功能外还应该覆盖到代码中一些重要的地方.对很多人来说文档的重要性不言而喻,但很难保持它的及时性和准确性.糟糕的文档的后果通常会浪费更多的资源和时间.往往都是出于一些错误的原因而编写的文档. 要求文档的一些原因 有很多原因导致我们需要编写文档.团队经常会由于一些制度上的要求而编写文档,或者就是纯粹出于无知.下面是一些编写文档的错误的理由: 有人认为文档和项目的成败息息相关. 文档能够证明某些人的存在. 需求方除了文档也不知道要什么好 要

我的软件测试之旅:(9)行动——简化测试文档和流程

现有的各种测试相关文档都很齐备,但是已经有较丰富经验的我感觉到其中的信息有很多都是不必要的冗余,老早就想把它们给简化简化.因为我这个人总觉得,如果是没有必要的或者不需要的信息,为何一定要放在文档里呢,直接不写不就行了么?放在那里总会吸引人去看一眼,然后心想"哦,N/A.",这也是时间和精力的浪费啊!保持文档干净整洁,只记录有意义的信息,不是很好么.而且,在原来的测试管理工具中,测试用例和测试计划,都有很多不同的版本,针对的是不同的产品发布版本.版本多也好的,但问题就是有的时候时间上最新

研究 Java 中 XML 文档模型的特性和性能

xml|性能 Java 中的 XML: 文档模型,第一部分:性能 研究 Java 中 XML 文档模型的特性和性能 文档选项 将此页作为电子邮件发送 最新推荐 Java 应用开发源动力 - 下载免费软件,快速启动开发 级别: 初级 Dennis M. Sosnoski, 总裁, Sosnoski Software Solutions, Inc. 2001 年 9 月 01 日 在本文中,Java 顾问 Dennis Sosnoski 比较几个 Java 文档模型的性能和功能.当选择模型时,无法做

Word文档生成

非常多的时候,都需要在程序当中生成一些文档,这些文档可能是csv,word,pdf,PPT,xls等文件格式. 生成csv还是比较简单的,但是要生成word,excel就麻烦多了. 当然,Tiny框架也面临这个问题,如何才能帮助开发人员快速生成这些文档呢? 一般来说,现在用java生成Word有如下方式: POI,iText,当然还有Xml形式. 对于采用POI,iText来说,要生成复杂的Doc文件,其实并不容易.而采用Xml结构生成,去把一个文档生成xml文件,看看里面的内容,估计也会是满头

10 个项目文档最佳实践

在软件开发和维护过程中,文档是必不可少的资料,它可以提高软件开发的效率,保证软件的质量,而且在软件的使用过程中有指导.帮助.解惑的作用.尤其在维护工作中,文档的重要性更是不言而喻.  本文整理了软件开发中10个最佳的文档编写实践,希望能对你的工作有所帮助.  1.  将编写文档作为开发工作中的一个重要环节(例如,占用总开发时间的10%).在软件开发中,不能没有文档,但如果编写文档占用了大部分的时间也不合适.可以根据需要制定代码文档.需求说明文档.设计文档.测试文档.用户手册等,在制定完成后,可以