一个项目能否发布上线,重要的环节就是测试。经过集成测试、性能测试、压力测试等不断循环的测试过后依据测试报告来确定上线。这些由专业的测试人员来完成,因此会导致程序开发者对自身的单元测试的弱化。若在代码中写入那些准备的数据代码片段,会让代码冗余,重用性不高,代码复杂度增加不易阅读,太多繁琐的低效的重复工作等会让开发人放弃这块的开发。
unit-test是基于junit框架 + csv文本结合的测试模板。JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量。csv可以很方便使用excel来编辑(由于csv是文本结构,所以很多excel中的复杂表达不能兼容也是个麻烦的事)。
既然要作为一个测试模板,那就需要满足以下操作需求:
1、简单便捷的对数据库操作
2、读取封装csv文件的工具方法
3、封装csv数据与DB数据转换
4、转换关联csv、bean、db属性关联
5、断言对比csv、db数据,验证业务流程数据是否正确
测试流程一般分三步:
1、准备业务测试数据;
2、执行需要测试的业务方法接口;
3、校验方法结果
unit-test模板由dbutils + junit + csv组成的。列举几个主要的jar包:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>net.sf.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
模板的机制是通过读取csv中准备的before数据,作为测试参数信息。调用被测试接口方法,获得返回的结果信息。然后从csv中after数据中与之对照验证,是否与期望值一致。
unitTest非表字段,只是用来标识这行数据的作用范围。 需要注意点是对应的字段要与数据库的表一致。如果表字段全是大写,此处可以小写程序内有统一转大写的。
依赖注解未使用spring 而是采用java 规范 JSR 330 inject
核心三个类,使用@Named依赖注入:
DbUtilsManager:利用dbutils框架与DB连接操作类,获取QueryRunner及一些简单的查询方法如:toBean,toBeanList。但需要注入数据源DataSource
AssertConvertManager:数据转换类。把csv转成对象、map等结构便于使用。
TestDataManager:加载csv文件并初始化TestDataContext内容和插入准备数据方法。
其它主要类:
AssertUtil:数据对比的工具类
TestDataContext:存储实体,记录表的相关信息(如表名,所有字段列表),csv加载的数据等。
以测试某查询接口为例子,摘取片段代码演示:
1、开发项目依赖引用
pom.xml
<dependency>
<groupId>com.unit</groupId>
<artifactId>unit-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
加载导入配置文件:/unittestConfig/spring-context.xml
2、初始化测试模板,加载测试数据,注入dataSource连接DB。
@PostConstruct
public void case_init() {
dbUtilsManager.setDataSource(dataSource);
queryRunner = dbUtilsManager.getQueryRunner();
if (dataContext== null) {
dataContext= testDataManager.loadDataContext("/csv/accountowner/account_owner.csv");
assertConvertManager.prepareColumnToFieldMapFromCsvAndClass(dataContext.tableName, dataContext.columnNameList, Member.class, null);
}
}
3、准备测试数据,清除相关的数据。
Long[] ids= new Long[] { 1000L };
String sql = "delete from HSDC."+table+" where id = "+ids[0];
queryRunner.update(sql);
testDataManager.putCsvDataToDb(queryRunner, dataContext, ids);
4、执行所测试的业务接口方法
Member member = service.query(ids[0]);
5、校验执行结果与期望值是否一致
Member fromCsv = assertConvertManager.buildDataObjectFromCsv(dataContext.dataBeforeTest.get(ids[0]), new Member(), dataContext.tableName);
AssertUtil.assertDO(fromCsv, member, null);
若想了解更多细节实现,码云地址:https://gitee.com/zss_376987715/unit-test
了解dbutils知识:DBUtils使用入门
junit测试模板 unit-test的更多相关文章
-
Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法
一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至 ...
-
Java高级特性 第10节 IDEA和Eclipse整合JUnit测试框架
一.IDEA整合Junit测试框架 1.安装插件 打开File菜单的下拉菜单settings[设置] : 点击左侧Plugins[插件]菜单 在输入框中输入JUnitGenerator 2.0,点击I ...
-
Spring Boot 解决方案 - JUnit 测试
简单的 JUnit 项目 回顾一下创建并运行简单的 JUnit 测试项目,先添加 JUnit 依赖然后编写类似如下模板的测试类,使用 IDE 的话直接用插件运行就行, 使用 Maven 的话运行命令 ...
-
Java Junit测试框架
Java Junit测试框架 1.相关概念 Ø JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要 ...
-
002杰信-陌生的maven-web项目整改成我们熟悉的Web架构;classpath的含义;ssm框架的整合;junit测试
这篇博客的资源来源于创智播客,先在此申明.这篇博客的出发点是jk项目,传智的做法是Maven的web模板生成的,但是这样子的结构目录与我们熟知的Web项目的结构目录相差很大,所以要按照我们熟知的项目结 ...
-
Spring Junit测试(非web,即不包含Controller测试)
使用Spring-Test对Spring框架进行单元测试 配置过程: lib加入导入spring-test.jar和junit包 或者使用Maven依赖: <dependency> < ...
-
Junit测试Controller(MockMVC使用),以及传输@RequestBody数据解决办法
转自:http://www.importnew.com/21153.html 一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功 ...
-
一键自动生成 java junit 测试代码神器 gen-test-plugin 入门介绍
gen-test-plugin 我们日常编写代码的过程中,经常需要为代码编写测试案例. 随着对代码质量的要求越来越高,很多公司开始通过代码的测试覆盖率作为 QA 的一个评定指标. 本框架可以一键生成所 ...
-
spring boot(三)Junit 测试controller
Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法 一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期 ...
随机推荐
-
Spring-data-jpa详解,全方位介绍。
本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求.这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring ...
-
9.springMVC中的拦截器
springMVC中的拦截器大概大致可以分为以下几个步骤去学习: 1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用 2.在springMVC的配置文件中添加拦 ...
-
atitit.微信项目开发效率慢的一些总结
atitit.微信项目开发效率慢的一些总结 #---理念问题..这个是最大的问题.. 要有专人提升开发效率才好.. #---没有一个好的开发方法体系.... ini deve 法. fell asd+ ...
-
超市管理系统—NABCD模型
1) N (Need 需求) 需求分析: 超市的数据和业务越来越庞大,而计算机就是一种高效的管理系统,这就需要我们把超市的管理与计算机结合起来,从而超市管理系统应运而生.依靠现代化的计算机信息处理技术 ...
-
html整理(2)
使用mailto在网页中链接Email地址 <a>标签还有一个作用是可以链接Email地址,使用mailto能让访问者便捷向网站管理者发送电子邮件.我们还可以利用mailto做许多其它事情 ...
-
jquery的相对父元素和相对文档定位示例代码
在开发jquery时候经常需要用到定位,有相对父元素定位和相对文档定位,本文为此总结下,有需要的朋友可以参考下 在开发jquery时候经常需要用到定位,这里概括两种定位: 1.相对父元素定位: $(& ...
-
Intellij Idea使用频率较高的几个快捷键
自动补全参数定义: Ctrl+Alt+V 运行断点Expression: Alt+F8 选择具体的方法以断点步入:Shift+F7 智能操作: Alt+Enter 打开最近文件:Ctrl+E 打开最近 ...
-
Openjudge-计算概论(A)-年龄与疾病
描述: 某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理. 输入共2行,第一行为过往病人的数目n(0 < n <= 100),第二行为每个病人患病时的年龄.输 ...
-
使用git将本地代码传到github
方法可能有些小小的差别,但是最终的结果都是一样的 在github上新建代码仓库 确定之后会显示一个仓库的url,复制下来 在本地找一个作为本地仓库的文件夹右键Git Bash Here打开git 把g ...
-
scikit-learn 决策树 分类问题
1.Demo from sklearn import tree import pydotplus import numpy as np #李航p59表数据 #年龄,有工作,有自己房子,信贷情况,类别 ...