Junit4参数化测试实现程序与用例数据分离
http://touchfu.iteye.com/blog/732930
现状:你是不是还在为自己的TestCase代码杂乱无章而苦恼,咎其根本还在于针对不同的用例,输入参数和mock信息的组装全部作为你的程序代码分布在各个单元测试程序中。
期望:因此为了让测试程序更加优雅的显示作为code的本质,我们需要把输入参数和mock内容与程序本身尽可能的达到松耦合的布局,即程序归程序,用例数据归用例数据。
如何:我们怎么来完成这样的一个分离动作呢,下面讲讲本人实现的基本思路。利用JUNIT4中的参数化测试为基础,通过解析文件来初始化参数信息,并对用例提供注销控制。
下面我们着重介绍下实现BaseTestCase.
- @RunWith(Parameterized.class)
- @ContextConfiguration(locations = {"XXX.xml"})
- public class BaseTestCase extends AbstractJUnit4SpringContextTests{
- /** 用例ID */
- protected String caseId;
- /** 描述 */
- protected String description;
- /** 期望值 */
- protected String expectValue;
- /** 测试上下文管理 */
- private final TestContextManager testContextManager;
- public BaseTestCase(){
- this.testContextManager = new TestContextManager(getClass());
- this.caseId = caseId;
- this.description = description;
- this.expectValue = expectValue;
- }
- /**
- * 依靠<code>DependencyInjectionTestExecutionListener<code>完成注入上下文信息
- * @throws Throwable
- */
- @Before
- public void injectDependencies() throws Throwable {
- this.testContextManager.prepareTestInstance(this);
- }
- /**
- * 获取用例数据
- * @param caseFilePath
- * @return
- */
- protected static Collection<String[]> loadCaseData(String caseFilePath) {
- if (StringUtil.isBlank(caseFilePath)) {
- throw new IllegalArgumentException("未初始化用例文件信息");
- }
- List<String[]> caseDataList = FileParser.loadItems("cases/" + caseFilePath);
- if (CollectionUtils.isEmpty(caseDataList)) {
- throw new IllegalArgumentException("准备数据不能为空");
- }
- // 剔除第一行标题信息
- caseDataList.remove(0);
- return caseDataList;
- }
- }
由于在自己基类使用的runner为Parameterized,与使用SpringJUnit4ClassRunner的不同在于少了自动对测试上下文进行依赖注入关联,因此我们需要自己手工触发完成,大家在类源码里可以注意到这一点。主要还是依赖于DependencyInjectionTestExecutionListener完成。同时由于测试基类集成了AbstractJUnit4SpringContextTests了,在此类的源码里可以看到两个关键点DependencyInjectionTestExecutionListener和其中的ApplicationContext,因此我们在子类里不需要再自己写什么上下文的属性,也不需要再添加依赖注入的执行监听器。
下面再看下FileParser的实现
- /**
- * <p>文件解析器</p>
- * @author Eric.fu
- */
- public class FileParser {
- /** 分隔符 */
- private static final String SPLIT_TAG = ",";
- /** 忽略标记 */
- private static final String IGNORE_TAG = "#";
- /**
- * 获取文件内容
- * @param filePath
- * @return
- */
- public static List<String[]> loadItems(String filePath) {
- List<String[]> itemList = new ArrayList<String[]>();
- ClassPathResource resource = new ClassPathResource(".");
- BufferedReader reader = null;
- try {
- String path = resource.getFile().getAbsolutePath();
- File file = new File(path + "/META-INF/" + filePath);
- reader = new BufferedReader(new FileReader(file));
- String tempString = null;
- // 一次读入一行,直到读入空为文件结束
- while (StringUtil.isNotBlank(tempString = reader.readLine())) {
- if (tempString.indexOf(IGNORE_TAG) == 0) {
- continue;
- }
- itemList.add(tempString.split(SPLIT_TAG));
- }
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e1) {
- }
- }
- }
- return itemList;
- }
- }
此类为相当普通的一段读文件的代码,这里有个特殊点在于加了一个忽略标记,用于注释用例数据,即把不跑的数据暂时注释掉,不作为读入参数。
下面再来看下一个简单的测试子类实现
- public class SubTestCase extends BaseTestCase {
- /** 测试请求 */
- protected String request;
- /**
- * 构造入款支付清算
- */
- public SubTestCase(String caseId, String description, String expectValue, String request){
- super(caseId, description, expectValue);
- this.request = request;
- }
- @Parameters
- public static Collection<String[]> caseData() {
- return loadCaseData("case.csv");
- }
- /**
- * 执行
- */
- @Test
- public void execute() {
- Assert.notNull(request);
- }
- }
在子类里通过构造方法初始化参数,参数数据来源为case.csv文件。
文件格式为caseId,description,expectValue,request
本文主要介绍的利用JUNIT4中的参数化测试来完成程序与测试数据的分离,当然如果你用的testNG,则可以用更优雅的provider来完成此项工作。在测试用例中除了让数据与程序分离还是不够的,还需要将mock部分也分离出去,这样才能更好的达到扩展的效果。
Junit4参数化测试实现程序与用例数据分离的更多相关文章
- JUnit4参数化测试实例
在JUnit中,可以同时使用@RunWith 和 @parameter 注解来为单元测试传递参数. 注意: 在Eclipse中因为版本问题,可能无法使用@parameters(name = " ...
- 同时使用Junit4的@Parameterized参数化测试和Spring容器
转载:http://www.jianshu.com/p/d191fe54915f 整合Spring容器 @SpringApplicationConfiguration(classes = Applic ...
- 用JUnit4进行参数化测试
参数化测试是一个JUnit 3不具备的功能. 基本使用方法 @RunWith 当类被@RunWith注解修饰,或者类继承了一个被该注解修饰的类,JUnit将会使用这个注解所指明的运行器(runner) ...
- Junit4进行参数化测试
@RunWith, 当类被@RunWith注解修饰,或者类继承了一个被该注解修饰的类,JUnit将会使用这个注解所指明的运行器(runner)来运行测试,而不是JUnit默认的运行器. 要进行参数化测 ...
- 参数化测试与Mock
参数化测试与Mock 转载自https://blog.csdn.net/sunliduan/article/details/42026509 单元测试概念 说到测试,大家都不会陌生,从我们开始学习编程 ...
- 计算某天的下一天:黑盒测试之等价类划分+JUnit参数化测试
题目要求 测试以下程序:该程序有三个输入变量month.day.year(month.day和year均为整数值,并且满足:1≤month≤12.1≤day≤31和1900≤year≤2050),分别 ...
- Google C++单元测试框架GoogleTest---值参数化测试
值参数化测试允许您使用不同的参数测试代码,而无需编写同一测试的多个副本. 假设您为代码编写测试,然后意识到您的代码受到布尔参数的影响. TEST(MyCodeTest, TestFoo) { // A ...
- MSTest不支持参数化测试的解决方案
之前的项目中做单元测试一直用的是NUnit,这次做新项目,负责人要求统一用MsTest,理由是MsTest是Visual Studio内置的.用就用吧,我没什么意见.不过用了两天,我就发现一个大问题: ...
- 参数化测试--sheet表的应用
自动化测试对录制和编辑好的测试步骤进行回放,这种是线性的自动化测试方式,其缺点是明显的,就是其测试覆盖面比较低.测试回放的只是录制时做出的界面操作,以及输入的测试数据,或者是脚本编辑时指定的界面操作和 ...
随机推荐
- 加密web.config
当我们要进行数据库的连接时,就会根据<%$ connectionsStrings:MyConnectionStringName %>这个表达式在Web.config文件中找到和MyConn ...
- 利用BeanUtils在对象间复制属性
commons-beanutils是jakarta commons子项目中的一个软件包,其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很 ...
- 事件委托能够优化js性能
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Mark Down绘图语法
以下语法在网易云笔记中测试通过. 绘图的标志位是三个单引号``` 开始 ``` 结尾 ,注意是英文半角的单引号,以下的字符也是英文半角状态下的才正确. 搜狗输入法的要特别注意,记得把shift 切 ...
- IO消息机制
同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 同步是函数自身等待结果 异步可采用状态轮询/通知/回调 返回结果: 阻塞和非阻塞的关注点是在等待消息的时候 线程的状态 同步阻塞 线程挂起 逻辑上函数不马上 ...
- 前台给后台传JSON字符串,后台解析并保存
前台 function BMSure() { var DanWeiName = $("[id$='BusinessName']").val(); var Address = $(& ...
- jQuery HTML
alert("Text: " + $("#test").text());获取text alert("HTML: " + $("#t ...
- Codeforces Round #379 (Div. 2) A B C D 水 二分 模拟
A. Anton and Danik time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- hdu 2602 Bone Collector(01背包)模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...
- iOS测试常见崩溃
什么是崩溃日志,从哪里能得它? iOS设备上的应用闪退时,操作系统会生成一个崩溃报告,也叫崩溃日志,保存在设备上.崩溃日志上有很多有用的信息,包括应用是什么情况下闪退的.通常,上面有每个正在执行线程的 ...