zoukankan      html  css  js  c++  java
  • 编写单元测试

      • 背景

        在编写单元测试,经常遇到需要创建实体对象的场景,比如测试插入实体到数据库的场景。针对这些状况,我们一般做法是先new一个空的实体对象,然后通过调用属性的set方法完成赋值动作。当实体属性只有少量几个的时候,手工调用set方法可能不会成为问题,但当实体对象的属性达到10个或者更多时,逐个调用set方法效率非常低,而且频繁重复工作让人容易烦劳疲惫,不利于工作的快速开展。

        目前css项目中使用到单元测试辅助工具springdbtest,经常需要构建xml预期结果文件,当表中字段非常多时,手工构建xml文件存在容易出错,效率低等问题。

        基于上述问题,这里将通过工具的方式,自动完成实体对象及xml内容的构建工作,减少单元测试编写中的工作量,提升效率。

      • 目的
        通过java反射技术,快速构建随机的实体对象及xml内容,简化工作,提升效率。

      • 总括
        创建实体对象及xml内容生成等功能是由 工具类 TestHelper 提供。

        TestHelper工具类下载:TestHelper.java
        TestAssertHelper 工具类支持对实体对象的断言,避免手工对实体对象的每个属性进行断言比较。

        test-helper项目包含该工具类及相关的单元测试用例,下载地址为:test-helper.rar

        下面简单介绍类中的方法:
        1. 创建实体对象
          1. public static <T> T newInstance(Class<T> clazz, String[] ignoreFields, OverrideFieldMap<String, Object> overrideFieldMap, boolean isIgnoreSuperClassField)

          2. public static <T> T newInstance(Class<T> clazz, String[] ignoreFields, OverrideFieldMap<String, Object> overrideFields)  (isIgnoreSuperClassField =false)
          3. 参数介绍:
            clazz 需要创建的类型

            ignoreFields 需要忽略设置取值的属性名称列表,该参数中的取值为实体属性的名称,处于该字段名数组中的属性将不会自动生成随机值
                   使用场景:
                   1. 对于那些不需要赋值的字段进行过滤;
                   2. 该工具方法默认不支持属性为实体对象的,可以通过该参数进行过滤

            overrideFieldMap 需要重载的属性map, key为实体属性名称;value为该属性的取值;

                   使用场景:

                   1. 因为有可能随机生成的属性取值不满足需求,可以使用该参数对属性取值进行指定;

                   2. 该工具方法为字段生成随机值时,遇到不支持的属性类型时,将抛出异常;如果想继续使用该工具方法,可以使用该参数,进行人为指定不支持的类型属性的取值
            isIgnoreSuperClassField 

                  是否需要为父类中的属性进行赋值;true表示忽略父类中的字段;false表示需要为父类中的字段进行赋值

        2. 将实体对象转换为xml
          1. public static String toDbTestXml(Object entity, String[] ignoreFields, boolean isIgnoreSuperClassField)
          2. public static String toDbTestXml(Object entity, String[] ignoreFields)   (isIgnoreSuperClassField = false)
          3. 参数介绍:
            entity 实体对象
            ignoreFields 不需要再输出的xml中出现的属性列表,可以是当前类及父类中的属性名称
            isIgnoreSuperClassField 是否 忽略父类中的属性,true表示忽略,在输出的xml中不会存在父类属性; false 不忽略,xml中将会输出父类中的属性

      • 使用
        1. 使用流程
          1. 添加工具类中有依赖fastjson包
          2. 将工具下载复制到自己工程的单元测试所在包中,将工具类所在包名更改为自有包名即可
        2. 使用案例

          1. 场景:测试man表的插入方法是否正确
            步骤:
                        1、调用创建实体方法, 如Man man = TestHelper.newInstance(Man.class, null, null);
                        2、创建实体方法会打印下属结果:
                       如下图所示:
                       结果由2部分构成:
                              第1部分为 实体对应xml内容,直接复制到springdbtest 的xml文件中即可,为预期的xml结果;
                              第2部分为  代码部分,包括json字符串及json反序列化语句,该语句直接复制到单元测试的方法中即可。

                       3、将结果中的第1部分内容直接复制到springdbtest 的xml文件中即可,为预期的xml结果;
                       4、将结果中的第2部分内容该语句直接复制到单元测试的方法中即可。
                       5、单元测试完成;

          2. 场景:测试属性过滤功能
            步骤:
                       1、Man man = TestHelper.newInstance(Man.class, new String[]{"sex", "name", "tid"}, null, false);
                       2、打印的结果中,过滤参数数组中存在的字段取值为null或者默认值;


          3. 场景:测试属性取值重载功能;
            步骤:
                       1、Man man = TestHelper.newInstance(Man.class, null, TestHelper.overrideFieldMap().put("sex", -1).put("name", "bob").put("tid", 1000), false);
                       2、打印的结果中,实体属性sex=-1, name="bob", tid=1000


          4. 更多使用方式及测试用例可以查看附件test-help项目单元测试TestHelperTest.java


          5. 场景:将数据库中的记录转换为springdbtest中的xml内容(需要自己从数据库查询数据记录)
  • 相关阅读:
    解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
    React中使用Ant Table组件
    Maven在Eclipse中的实用小技巧
    knockout+echarts实现图表展示
    深入分析Spring 与 Spring MVC容器
    二维码登录原理及生成与解析
    Maven中安装本地Jar包到仓库中或将本地jar包上传
    sorl6.0+jetty+mysql搭建solr服务
    git revert和reset区别
    java注意的一些细节问题
  • 原文地址:https://www.cnblogs.com/chengjun/p/9134945.html
Copyright © 2011-2022 走看看