Junit参数化测试方法(二)
本文主要引用:http://www.ibm.com/developerworks/cn/java/j-lo-feed4junit/index.html#icomments(同http://www.doc88.com/p-730456017079.html)
在上文中阐述的参数化测试方法没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不便。Feed4JUnit 是开源的基于 JUnit 的扩展,通过使用 Feed4JUnit 提供的注释,用户可以很方便的把测试数据存放在文件或其它数据源。本文通过介绍及简单示例,使读者了解并能够使用 Feed4JUnit, 方便的实现数据与代码分离的测试。
一、Feed4JUnit 与 JUnit
经常,在应用程序的业务逻辑中存在大量的这样的接口:他们接受不同的输入,然后进行或验证,或处理,进而完成相同的流程。比如网站的登录入口,用户名和密码都有长度的限制,同时也具有是否允许特殊字符的限制等,所以在我们进行其单元测试的过程中,根据不同长度的用户名和密码,以及不同的字符组合,只需要提供相同的测试代码结构,就能完成测试,不同的仅仅测试数据与期望值,但是因为每一个测试方法中的输入参数不同,我们必须为每一个输入组编写单独的测试用例,从而产生大量冗余代码,十分不便于维护。
Feed4JUnit 是 JUnit 测试框架的扩展,它通过操作来自于文件以及不同的数据源的测试数据,使您的单元测试变得更容易编写与维护。
二、Feed4JUnit 的下载及安装
1. Feed4JUnit 是开源的测试组件,您可以从如下链接下载最新版本:http://sourceforge.net/projects/feed4junit/files/
2. 解压下载的 zip 包,复制整个 lib 文件夹到您的 Java 项目的根目录,如图 1:
图 1. 复制 lib 到项目根目录
3. 选定项目,右键选择项目的属性,然后通过 Add JARs 将步骤 2 中 lib 文件夹下的所有 Jar 添加到项目的 Build Path 下,如图 2
图 2. 添加 Jar 到 Build Path
通过以上三步,您已经准备好您的 Feed4JUnit 环境并可以开始使用它,当然,开发测试代码之前,您必需要将 Feed4JUnit 相应的包 Import 进您的类。
三、使用 Feed4JUnit 实现数据与代码分离的测试
Feed4JUnit 的数据源可以包括以下几种类型 - 文件 (CSV 或者 Excel )、数据库、自定义数据源。本文根据实际项目需求以excel文件为例。
Feed4JUnit 使用一个特殊的运行类 Feeder.class,用来支持与标识参数化测试,如果您想要编写数据与代码分离的测试脚本,必须在您的测试类上增加注释
@RunWith(Feeder.class) 。同时,您需要使用 @Test 来标示您实现测试的方法,并且使用 @Source 来声明和接收数据源的数据,基本的代码结构如下所示:
1 package sample.test; 2 3 import static org.junit.Assert.assertEquals; 4 import org.databene.feed4junit.Feeder; 5 import org.databene.benerator.anno.Source; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 9 /* 10 * Feed4JUnit - @RunWith, @Test and @Source 11 */ 12 @RunWith(Feeder.class) //Specify the class will be ran as Feeder class 13 public class Feed4JSample { 14 15 @Test //Specify the method as a test method 16 @Source()//Specify the input data source 17 public void testAccessCheck() { 18 assertEquals(true, true); 19 } 20 }
四、以文件作为数据源
Feed4JUnit 支持从 CSV 或者 Excel 文件里面读取数据作为输入,这里我们以 Excel 文件为例。
1. 在测试项目的根目录下创建 testData.xlsx 数据文件,样例数据如图 3,默认情况下,第一行会以列名存在,在运行过程中不会作为数据读取。
图 3. Excel 数据源
2. 创建测试类并在接收数据的测试方法上声明数据源为 @Source("testData.xlsx"),Excel 中的数据在传递过程中会自动按照列与测试方法的参数的位置顺序进行匹配,并以行作为一个单位读取并传递给测试方法体。比如图 3 中的 productsn 列的值会做为方法的第一个参数传入方法体中,expectresultInfo 列的值会作为方法的第二个参数,以此类推。在测试进行过程中,首先在 Excel 文件中读取一行(包含两列),接着按照位置顺序将数据传递到方法体中(每列按顺序对应一个参数)进行执行,执行完成后读取 Excel 中的下一行进行相同流程的测试,其原理与 Java 中的迭代器十分类似。请注意当数据文件中数据的列数小于测试方法参数的个数的时候,测试会因为位置不匹配而失败。如下示例:
1 package JunitTestSample001; 2 3 import org.databene.benerator.anno.Source; 4 import org.databene.feed4junit.Feeder; 5 import org.junit.Assert; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 9 import testsample001.check; 10 11 @RunWith(Feeder.class) 12 public class JunitTest003 { 13 14 @Test 15 @Source("testData.xlsx") 16 public void test(String productNO, String resultInfo) { 17 System.out.println("-------------"); 18 // User user2 = userService.findByName(usernameParam); 19 check connor = new check(); 20 String actresultInfo = connor.ConnectOracle(productNO); 21 System.out.println(actresultInfo); 22 Assert.assertEquals(resultInfo, actresultInfo); 23 // fail("Not yet implemented"); 24 } 25 26 }
3. 运行测试,因为 Feed4Junit 是 JUnit 的扩展,所以运行方式与 JUnit 完全相同,即以 JUnit 运行即可,运行结果如图 4 所示,我们可以看到,testData.xlsx 中的数据已全部传入测试方法并运行。运行结果如下图所示:
图 4. 运行结果示例