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

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. 《C++程序设计语言(英文第四版)》【PDF】下载

    <C++程序设计语言(英文第四版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382177 内容简介 本书是C++领域经典的参 ...

  2. 英式英语VS美式英语

  3. sql基础题目测试及正确答案

    在网上做了一套基本的sql题目,以下是我的写的答案,适合基础人员练练 --创建测试数据 use test create table Student(S# varchar(10),Sname nvarc ...

  4. 给虚拟机添加新硬盘并分区,fdisk查看分区,分区,重新读取分区表信息partprobe,格式化,挂载,查看分区挂载信息,自动挂载文件/etc/fstab,/etc/fstab文件错误导致重启崩溃后的修复

    1.虚拟机关机断电 2.添加硬盘 2.开机 3.fdisk -l查看刚才新添加的硬盘 [root@localhost ~]# fdisk -l 磁盘 /dev/sda:21.5 GB, 2147483 ...

  5. BOOTPROTO=[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)

     BOOTPROTO=[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议) 

  6. 比较日期大小以及获取select选中的option的value

    原生JavaScript如何获取select选中的value // 1. 拿到select对象 const selectObject = document.getElementById('test') ...

  7. Python安装和开发环境搭建

    1.官网:http://www.python.org/download/下载安装包,目前最新版本为3.6,安装包很多地方可以下,也可以在360软件管家上下载安装  特别要注意勾选:Add Python ...

  8. Robot Framework 学习笔记(二)-------第一个脚本

    robot Framework环境搭建好之后先来一个简单的脚本跑一下 一.新建项目 二.新建测试套件  三.创建测试用例 四.导入Selenium2Library库 因为RF框架编写基于web 的测试 ...

  9. python2中的__init__.py文件的作用

    python2中的__init__.py文件的作用: 1.python的每个模块的包中,都必须有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module. 2.__init_ ...

  10. JS中将一个值转换为字符串的3种方法

    1.value.toString() 2."" + value 3.String(value) 第一种方法存在的问题是,它不能把null和undefined转换为字符串.还有第二种 ...