建设银行电脑版官方网站,品牌建设评价,企业做淘宝客网站,河南住房与建设厅网站JUnit 是被广泛应用的 Java 单元测试框架#xff0c;但是它没有很好的提供参数化测试的支持#xff0c;很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离#xff0c;在后续的修改和维护上有诸多限制和不便。Feed4JUnit 是开源的基于 JUnit 的扩… JUnit 是被广泛应用的 Java 单元测试框架但是它没有很好的提供参数化测试的支持很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离在后续的修改和维护上有诸多限制和不便。Feed4JUnit 是开源的基于 JUnit 的扩展通过使用 Feed4JUnit 提供的注释用户可以很方便的把测试数据存放在文件或其它数据源。本文通过介绍及简单示例使读者了解并能够使用 Feed4JUnit, 方便的实现数据与代码分离的测试。 Feed4JUnit 与 JUnit 经常在应用程序的业务逻辑中存在大量的这样的接口他们接受不同的输入然后进行或验证或处理进而完成相同的流程。比如网站的登录入口用户名和密码都有长度的限制同时也具有是否允许特殊字符的限制等所以在我们进行其单元测试的过程中根据不同长度的用户名和密码以及不同的字符组合只需要提供相同的测试代码结构就能完成测试不同的仅仅测试数据与期望值但是因为每一个测试方法中的输入参数不同我们必须为每一个输入组编写单独的测试用例从而产生大量冗余代码十分不便于维护。 基于以上场景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;Parameterspublic 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;}Testpublic 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 passwordpublic 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 到项目根目录 3. 选定项目右键选择项目的属性然后通过 Add JARs 将步骤 2 中 lib 文件夹下的所有 Jar 添加到项目的 Build Path 下如图 2 图 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 methodSource()//Specify the input data sourcepublic void testAccessCheck() {assertEquals(true, true);}
} 以文件作为数据源 Feed4JUnit 支持从 CSV 或者 Excel 文件里面读取数据作为输入这里我们以 Excel 文件为例。 1. 在测试项目的根目录下创建 Data.xls 数据文件样例数据如图 3默认情况下第一行会以列名存在在运行过程中不会作为数据读取。 图 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 {TestSource(Data.csv)//CSV sourcepublic void testAccessCheck_CSV(String userName, String pw, boolean expected) {assertEquals(expected, UserAccess.accessCheck(userName, pw));}TestSource(Data.xls)//Excel sourcepublic void testAccessCheck_Excel(String userName, String pw, boolean expected) {assertEquals(expected, UserAccess.accessCheck(userName, pw));}
} 3. 运行测试因为 Feed4Junit 是 JUnit 的扩展所以运行方式与 JUnit 完全相同即以 JUnit 运行即可运行结果如图 4 所示我们可以看到Data.xls 中的数据已全部传入测试方法并运行。 图 4. 运行结果示例 以数据库作为数据源 通过使用 Database 您可以很方便的使用来自于数据库的数据这在进行大量测试数据测试的时候或者复用现有的应用业务数据作为测试数据的情况下比较有用。 当您使用来自数据库的数据源的时候首先必须使用 Database 声明数据库的信息 可以为类或方法添加 Database 注释 , 如果注释类为 Database 的时候类中所有的方法都可以使用此数据库的数据作为源当声明 Database 于方法的时候此类中仅此方法可以调用数据库作为数据源。 Database 具有一些属性用于声明用于连接数据库信息请看一下说明 id 一个用于标识数据库数据源标识符在测试方法的 Source 中进行引用关联 url数据库的 URL driver 数据库的驱动 user 数据库的用户名 password数据库的密码 完成以上数据库的定义后需要在测试方法的 Source 中引用您所需要的库使用属性 id 和 selector 可以完成此操作 id Source 中的 id 和 Database 的 id 相对应关联 selectorSQL 语句用于查询出相应的数据传递给测试方法 以下我们以 DB2 作为数据源使用 DB2 的 Sample 数据库并创建名为 TEST 的表来存储测试数据测试数据与图 3 Excel 数据源的完全相同请看图 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 {TestSource(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());}
} 清单 6 为在方法上声明 Database: 清单 6. 在方法上声明 Database /** Feed4JUnit - Get Data from Database, only the specified method can use the database data*/RunWith(Feeder.class)
public class F4JfromDB_Method {TestDatabase(id testdb, url jdbc:db2://localhost:50000/SAMPLE, driver com.ibm.db2.jcc.DB2Driver, user db2admin, password db2admin)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());}
} 测试运行过程中通过 urldriver 等信息建立数据连接通过 selector 发出数据请求最后完成查询并把数据传递给测试方法数据在传递给方法的时候会按数据表的列的顺序与参数进行匹配运行结果与图 4 类似。 自定义数据源 除了 CSVExcel 和数据库的数据源外Feed4JUnit 还提供自定义数据源以满足不同用户的需求用户同样可以通过封装 JUnit 4 提供的参数化测试的方法来完成数据源自定义所有这里作者不再详述用户可以封装并取得不同的数据源的数据传递给 Feed4JUnit 的相应接口来完成数据源的自定义。 结束语 本文通过对比介绍和简单易懂的实例全面讲解了 Feed4JUnit 对数据与代码分离的测试支持。通过提供简单的注释Feed4JUnit 使用户能够极其方便的实施数据与代码分离的测试极大地增强了 JUnit 测试框架的易用性。 相信您已经在本文的叙述中看到它的优点。同时本文所叙述的仅仅是 Feed4JUnit 提供的测试增强功能的一部分Feed4JUnit 同时还提供了大量数据的随机测试和等价类测试等众多功能如果您感兴趣可以自行参考。 转载于:https://www.cnblogs.com/testermark/p/4075365.html