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

发表于:2012-10-09来源:IBM作者:万书吉点击数: 标签:junit
以文件作为数据源 Feed4JUnit 支持从 CSV 或者 Excel 文件里面读取数据作为输入,这里我们以 Excel 文件为例。 1. 在测试项目的根目录下创建 Data.xls 数据文件,

  以文件作为数据源

  Feed4JUnit 支持从 CSV 或者 Excel 文件里面读取数据作为输入,这里我们以 Excel 文件为例。

  1. 在测试项目的根目录下创建 Data.xls 数据文件,样例数据如图 3,默认情况下,第一行会以列名存在,在运行过程中不会作为数据读取。

  图 3. Excel 数据源

图 3. Excel 数据源

  2. 创建测试类并在接收数据的测试方法上声明数据源为 @Source("Data.xls"),Excel 中的数据在传递过程中会自动按照列与测试方法的参数的位置顺序进行匹配,并以行作为一个单位读取并传递给测试方法体。比如图 3 中的 user 列的值会做为方法的第一个参数传入方法体中,pw 列的值会作为方法的第二个参数,以此类推。在测试进行过程中,首先在 Excel 文件中读取一行(包含三列),接着按照位置顺序将数据传递到方法体中(每列按顺序对应一个参数)进行执行,执行完成后读取 Excel 中的下一行进行相同流程的测试,其原理与 Java 中的迭代器十分类似。请注意当数据文件中数据的列数小于测试方法参数的个数的时候,测试会因为位置不匹配而失败。

  清单 4 包括从 CSV 和 Excel 读取和传递数据的示例:

  清单 4. 文件数据源示例

				 
package sample.test;

import static org.junit.Assert.assertEquals;

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

import sample.code.UserAccess;

/*
 * Feed4JUnit - Get Data from CSV/Excel File source
 */

@RunWith(Feeder.class)
public class F4JfromFile {
	
	@Test
	@Source("Data.csv")//CSV source
	public void testAccessCheck_CSV(String userName, String pw, boolean expected) {
		assertEquals(expected, UserAccess.accessCheck(userName, pw));
	}
	
	@Test
	@Source("Data.xls")//Excel source
	public void testAccessCheck_Excel(String userName, String pw, boolean expected) {
		assertEquals(expected, UserAccess.accessCheck(userName, pw));
	}
}

  3. 运行测试,因为 Feed4Junit 是 JUnit 的扩展,所以运行方式与 JUnit 完全相同,即以 JUnit 运行即可,运行结果如图 4 所示,我们可以看到,Data.xls 中的数据已全部传入测试方法并运行。

  图 4. 运行结果示例

图 4. 运行结果示例

  以数据库作为数据源

  通过使用 @Database ,您可以很方便的使用来自于数据库的数据,这在进行大量测试数据测试的时候或者复用现有的应用业务数据作为测试数据的情况下比较有用。

  当您使用来自数据库的数据源的时候,首先必须使用 @Database 声明数据库的信息 ,可以为类或方法添加 @Database 注释 , 如果注释类为 @Database 的时候,类中所有的方法都可以使用此数据库的数据作为源,当声明 @Database 于方法的时候,此类中仅此方法可以调用数据库作为数据源。@ Database 具有一些属性,用于声明用于连接数据库信息,请看一下说明:

  id: 一个用于标识数据库数据源标识符,在测试方法的 @Source 中进行引用关联

  url:数据库的 URL

  driver: 数据库的驱动

  user: 数据库的用户名

  password:数据库的密码

  完成以上数据库的定义后,需要在测试方法的 @Source 中引用您所需要的库,使用属性 id 和 selector 可以完成此操作:

  id: @Source 中的 id 和 @Database 的 id 相对应关联

  selector:SQL 语句,用于查询出相应的数据传递给测试方法

  以下我们以 DB2 作为数据源,使用 DB2 的 Sample 数据库,并创建名为 TEST 的表来存储测试数据,测试数据与图 3 Excel 数据源的完全相同,请看图 5。

  图 5. 数据表中的测试数据

图 5. 数据表中的测试数据

  首先,创建测试类,添加 @Database 注释并增加数据库的连接信息,同时指定一个表示数据库的 id,在测试方法的 @Source 中通过 id 进行关联,并制定 selector 的语句进行数据查询,例如本例中的 selector = "select * from TEST",会从 TEST 表中取出全部数据用于测试,细节请参考以下代码示例:

  清单 5 为在类上声明 @Database。

  清单 5. 在类上声明 @Database

				 
package sample.test;

import static org.junit.Assert.assertEquals;

import org.databene.benerator.anno.Database;
import org.databene.benerator.anno.Source;
import org.databene.feed4junit.Feeder;
import org.junit.Test;
import org.junit.runner.RunWith;

import sample.code.UserAccess;

/*
 * Feed4JUnit - Get Data from Database, all test methods can use the database data
 */
@RunWith(Feeder.class)
@Database(
		id = "testdb", 
		url = "jdbc:db2://localhost:50000/SAMPLE", 
		driver = "com.ibm.db2.jcc.DB2Driver", 
		user = "db2admin", 
		password = "db2admin")
public class F4JfromDB {

	@Test
	@Source(id = "testdb", selector = "select * from TEST")
	public void testAccessCheck(String userName, String pw, String expected) {
		Boolean bSucess = UserAccess.accessCheck(userName.trim(), pw.trim());
		assertEquals(expected.trim(), bSucess.toString());

	}
}

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