测试即文档:自动化测试框架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

  

  打开该文件:

  测试运行成功。

  

posted @ 2012-02-18 15:26  无知者云  阅读(2711)  评论(1编辑  收藏  举报