初识Concordion与入门

酆意智
2023-12-01
摘要: 第一个测试很容易理解greetingFor函数接受一个字符串并返回,通过concordion:set设置firstName为World,...

初识Concordion与入门

问题域?

测试及文档,Specification By Example 应该怎么做,怎样提高测试的效率。

什么是Concordion ?

Concordion是一种自动化测试框架,是测试及文档,Specification By Example的一种实现,可以用自然的语言来描述软件功能,能很好的描述用户的Story。它不仅支持Java,也同样支持.NET, Python, Scala, and Ruby. 是JUnit的扩展,写好的测试不仅是格式良好的测试文档,同样也可以当成JUnit单元测试来跑。

如何使用 ?

Concordiong很简单,我们可以直接看看官方的例子。

1. 安装

下载例子concordion-kickstart, 例子使用Gradle构建工具管理的,比maven简单,这里就不详细介绍它的使用方式了。

Greeter.java 需要测试的类。

specs 验收测试归类文件夹。

concordion.css 级联样式表让测试展现更好看一点。

HelloWordTest.java JUnit测试类,集成至ConcordionTestCase

HelloWord.html Concordion测试文档,名字必须与测试类保持一致。

环境要求Jdk1.5以上,依赖一下jar包:

concordion-1.4.2.jar

junit-3.8.2.jar or junit-4.8.2.jar

ognl-2.6.9.jar

xom-1.2.5.jar

2. 导入项目到IDE中,Eclipse或者IntelliJ IDEA

使用Gradle很方便导入,在gradle的构建脚本build.gradle最前面加上或者intellij插件即可,如下:

然后在命令行运行 gradle eclipse或者gradle idea,然后通过IDE导入就可以了。

3. Concordion测试

Concordion测试文档需要遵循一些固定的格式,它必须是一个格式良好的XHTML文档,所以必须包含

concordion:assertEquals用来断言结果的正确性。

concordion:set设置变量值。

concordion:execute执行测试类方法。

看第一个简单的例子:

JUnit测试类:

package com.example.specs.greeting;

import org.concordion.integration.junit3.ConcordionTestCase;

import com.example.Greeter;

public class HelloWorldTest extends ConcordionTestCase {

public String greetingFor(String firstName) {

return new Greeter().greetingFor(firstName);

}

public void setCurrentTime(String time) {

// TODO

}

}

测试文档:

Hello World!

After a user logs into the system, a greeting is

displayed saying "Hello [user's first name]!"

Example

When user World

logs in, the greeting will be:

Hello World!

If time is

09:00AM

第一个测试很容易理解greetingFor函数接受一个字符串并返回,通过concordion:set设置firstName为World,用concordion:assertEquals判断最后结果是否是Hello World.输出界面为:

第二个例子:测试函数返回值

package com.example.specs.greeting;

import org.concordion.integration.junit3.ConcordionTestCase;

public class SplittingNamesTest extends ConcordionTestCase{

public Result split(String fullName){

String[] words = fullName.split(" ");

Result result = new Result(words[0], words[1]);

return result;

}

class Result {

private final String firstName;

private final String lastName;

Result(String firstName, String lastName) {

this.firstName = firstName;

this.lastName = lastName;

}

public String getFirstName(){

return firstName;

}

public String getLastName(){

return lastName;

}

}

}

Splitting Names

To help personalise our mailshots we want to have the first name

and last name of the customer. Unfortunately the customer data

that we are supplied only contains full names.

The system therefore attempts to break a supplied full name into

its constituents by splitting around whitespace.

Example

Full NameFirst NameLast Name
John SmithJohnSmith
David PetersonDavidPeterson

使用concordion:execute调用函数split,返回结果保存在result变量里面,Concordion会自动把它映射为Result对象。

第三个例子:测试数据集package com.example.specs.greeting;

import org.concordion.integration.junit3.ConcordionTestCase;

import java.util.*;

public class PartialMatchesTest extends ConcordionTestCase {

private Set usernamesInSystem = new HashSet();

public void setUpUser(String username){

usernamesInSystem.add(username);

}

public Iterable getSearchResultsFor(String searchString){

SortedSet matches = new TreeSet();

for(String username : usernamesInSystem){

if(username.contains(searchString)){

matches.add(username);

}

}

return matches;

}

}

Partial Matches

Username searches return partial matches, i.e. all usernames containing

the search string are returned.

Example

Given these users:

Username
john.lennon
ringo.starr
george.harrison
paul.mccartney

Searching for "arr" will return:

Matching Usernames
george.harrison
ringo.starr

使用concordion:verifyRows来接受结果集,并判断结果集中的数据,相当简单一看就懂。

结束语

通过上面的例子看Concordion还是比较简单的,它鼓励把测试写成类似用户Story描述那样,让项目中的每个人都能看懂测的具体是什么场景包括BA或者其他不懂技术的人。它是JUnit的扩展,能像JUnit测试一样自动话执行和生成结果。比起其他的BDD工具JBehave, Cucumber有些区别的就是它并不使用Given When Then的格式,它提倡自然语言Specification By Example的方式来描述测试用例。

 类似资料: