一个项目能否发布上线,重要的环节就是测试。经过集成测试、性能测试、压力测试等不断循环的测试过后依据测试报告来确定上线。这些由专业的测试人员来完成,因此会导致程序开发者对自身的单元测试的弱化。若在代码中写入那些准备的数据代码片段,会让代码冗余,重用性不高,代码复杂度增加不易阅读,太多繁琐的低效的重复工作等会让开发人放弃这块的开发。

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的更多相关文章

  1. Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

    一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至 ...

  2. Java高级特性 第10节 IDEA和Eclipse整合JUnit测试框架

    一.IDEA整合Junit测试框架 1.安装插件 打开File菜单的下拉菜单settings[设置] : 点击左侧Plugins[插件]菜单 在输入框中输入JUnitGenerator 2.0,点击I ...

  3. Spring Boot 解决方案 - JUnit 测试

    简单的 JUnit 项目 回顾一下创建并运行简单的 JUnit 测试项目,先添加 JUnit 依赖然后编写类似如下模板的测试类,使用 IDE 的话直接用插件运行就行, 使用 Maven 的话运行命令 ...

  4. Java Junit测试框架

    Java    Junit测试框架 1.相关概念 Ø JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要 ...

  5. 002杰信-陌生的maven-web项目整改成我们熟悉的Web架构;classpath的含义;ssm框架的整合;junit测试

    这篇博客的资源来源于创智播客,先在此申明.这篇博客的出发点是jk项目,传智的做法是Maven的web模板生成的,但是这样子的结构目录与我们熟知的Web项目的结构目录相差很大,所以要按照我们熟知的项目结 ...

  6. Spring Junit测试(非web,即不包含Controller测试)

    使用Spring-Test对Spring框架进行单元测试 配置过程: lib加入导入spring-test.jar和junit包 或者使用Maven依赖: <dependency> < ...

  7. Junit测试Controller(MockMVC使用),以及传输@RequestBody数据解决办法

    转自:http://www.importnew.com/21153.html 一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功 ...

  8. 一键自动生成 java junit 测试代码神器 gen-test-plugin 入门介绍

    gen-test-plugin 我们日常编写代码的过程中,经常需要为代码编写测试案例. 随着对代码质量的要求越来越高,很多公司开始通过代码的测试覆盖率作为 QA 的一个评定指标. 本框架可以一键生成所 ...

  9. spring boot(三)Junit 测试controller

    Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法 一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期 ...

随机推荐

  1. 【Web性能进阶】1.无线网络基础

    一.无所不在的连接 针对不通的使用场景,无线网络技术有很多种. 鉴于无线网络技术如此多样,笼统地概括所有无线网络的性能优化手段是不可能的.好在大多数无线技术的原理都是相通的,衡量性能的指标和约束条件也 ...

  2. linux系统下安装单台Redis

    注意:搭建redis前一定要安装gcc redis安装方式一 1.安装gcc命令:yum install -y gcc #安装gcc [root@localhost src]# yum install ...

  3. python运算符优先级问题

    附上 对于or与and运算 其一, 在不加括号时候, and优先级大于or 其二, x or y 的值只可能是x或y. x为真就是x, x为假就是y 第三, x and y 的值只可能是x或y. x为 ...

  4. JavScript--表单提交

    前台代码 <div > <div id="show">asdasdas</div> <form id="form"&g ...

  5. 【JS】数据类型

    其他类型转化为boolean类型规则: number:非0为true,0和NaN为false: String:非空为true,空为false: Object:任何对象都为true 任何变量赋值为nul ...

  6. jQuery: $.extend()用法总结

    1.重载原型 $.extend({},src1,src2,src3...) Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型. 它的含义是将src1,src2, ...

  7. 创建access数据库表demo的封装

    1.创建类 public void CreateBiao(ADOX.Catalog catlog,ADOX.Table table) { //StuId Column(AutoIncrement ) ...

  8. 高性能管线式HTTP请求(实践·原理·实现)

      该篇实际是介绍pipe管线的原理,下面主要通过其高性能的测试实践,解析背后数据流量及原理.最后附带一个简单的实现     实践 先直接看对比测试方法 对于单一客户端对服务器进行http请求,一般我 ...

  9. bzoj 4199 [NOI2015]寿司晚宴

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...

  10. 安装两个JDK后配置环境变量没用?

    在实际开发中,由于项目的需要,可能JDK的版本是不同的.比如我们前一个项目所需JDK版本是1.6的,项目完成后,下一个项目JDK版本又是需要1.7的,为了防止由于切换项目我们需要频繁的安装卸载JDK, ...