基于 JUnit 使用 Feed4JUnit 实现数据与代码分离的测试

发表于:2012-10-09来源:IBM作者:万书吉点击数: 标签:junit
基于 JUnit 使用 Feed4JUnit 实现数据与代码分离的测试。经常,在应用程序的业务逻辑中存在大量的这样的接口:他们接受不同的输入,然后进行或验证,或处理,进而完成相同的流程。比如网站的登录入口,用户名和密码都有长度的限制,

  经常,在应用程序的业务逻辑中存在大量的这样的接口:他们接受不同的输入,然后进行或验证,或处理,进而完成相同的流程。比如网站的登录入口,用户名和密码都有长度的限制,同时也具有是否允许特殊字符的限制等,所以在我们进行其单元测试的过程中,根据不同长度的用户名和密码,以及不同的字符组合,只需要提供相同的测试代码结构,就能完成测试,不同的仅仅测试数据与期望值,但是因为每一个测试方法中的输入参数不同,我们必须为每一个输入组编写单独的测试用例,从而产生大量冗余代码,十分不便于维护。

  基于以上场景,JUnit 4 提供了参数化的特性,从而能够实现不同数据输入对相同测试代码的测试,如清单 1 所示:

  清单 1. JUnit 4 参数化测试代码示例

				 
package sample.test;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import sample.code.UserAccess;

/*
 * JUnit - Parameter test sample
 */
@RunWith(Parameterized.class)
public class JunitSample {

	private String user;
	private String pw;
	private boolean expected;

	@Parameters
	public static Collection dataGenerater() {
		return Arrays.asList(new Object[][] { 
				{ "user01", "123456", true },
				{ "helloworld", "123456", false },
				{ "david", "re*ads", false }, 
				{ "goodone", "onegood", true } });
	}

	public JunitSample(String user, String pw, boolean expected) {
		this.user = user;
		this.pw = pw;
		this.expected = expected;
	}

	@Test
	public void testAccessCheck() {
		assertEquals(expected, UserAccess.accessCheck(user, pw));
	}
}

  通过以上示例代码可以看出,JUnit 4 通过使用一个标记 @Parameters 注释的返回类型为 Collection 的静态方法产生数据,测试数据通过变量传递给测试方法,从而完成多数据输入的测试。但是随着业务的需要,测试人员需要经常增加测试数据与修改现有测试数据,JUnit 4 提供的硬编码方式已经愈显笨重和不便,数据与代码分离显得尤为重要。

  幸好,本文所述的 Feed4JUnit 良好的解决了数据与代码分离的问题,Feed4JUnit 是 JUnit 测试框架的扩展,它通过操作来自于文件以及不同的数据源的测试数据,使您的单元测试变得更容易编写与维护。

  本文将通过示例向您展示 Feed4JUnit 的安装以及测试代码与数据分离的实现,请注意本文的示例代码全部基于针对如下一个十分简单用户登录检验的类,并且假定您正在使用 Eclipse 作为您的 IDE,请看清单 2 类代码:

  清单 2. 实例类

				 
package sample.code;

public class UserAccess {
	// simple validation for user name and password
	public static boolean accessCheck(String userName, String password) {
		if (userName.length() <= 4 || userName.length() > 8)
			return false;
		if (password.length() <= 4 || password.length() > 8)
			return false;
		if (userName.contains("@"))
			return false;
		if (password.contains("*"))
			return false;
		return true;
	}
}

  回页首

  Feed4JUnit 的下载及安装

  1. Feed4JUnit 是开源的测试组件,您可以从如下链接下载最新版本:

  http://sourceforge.net/projects/feed4junit/files/

  2. 解压下载的 zip 包,复制整个 lib 文件夹到您的 Java 项目的根目录,如图 1:

  图 1. 复制 lib 到项目根目录

图 1. 复制 lib 到项目根目录

  3. 选定项目,右键选择项目的属性,然后通过 Add JARs 将步骤 2 中 lib 文件夹下的所有 Jar 添加到项目的 Build Path 下,如图 2

  图 2. 添加 Jar 到 Build Path

图 2. 添加 Jar 到 Build Path

  通过以上三步,您已经准备好您的 Feed4JUnit 环境并可以开始使用它,当然,开发测试代码之前,您必需要将 Feed4JUnit 相应的包 Import 进您的类。

  回页首

  使用 Feed4JUnit 实现数据与代码分离的测试

  Feed4JUnit 的数据源可以包括以下几种类型 - 文件 (CSV 或者 Excel )、数据库、自定义数据源。

  Feed4JUnit 使用一个特殊的运行类 Feeder.class,用来支持与标识参数化测试,如果您想要编写数据与代码分离的测试脚本,必须在您的测试类上增加注释 @RunWith(Feeder.class) 。同时,您需要使用 @Test 来标示您实现测试的方法,并且使用 @Source 来声明和接收数据源的数据,基本的代码结构如清单 3 所示:

  清单 3. 基本代码结构

				 
package sample.test;

import static org.junit.Assert.assertEquals;
import org.databene.feed4junit.Feeder;
import org.databene.benerator.anno.Source;
import org.junit.Test;
import org.junit.runner.RunWith;

/*
 * Feed4JUnit - @RunWith, @Test and @Source
 */
@RunWith(Feeder.class) //Specify the class will be ran as Feeder class
public class Feed4JSample {

	@Test //Specify the method as a test method
	@Source()//Specify the input data source
	public void testAccessCheck() {
		assertEquals(true, true);
	}
}

原文转自:http://www.ltesting.net