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