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内容(需要自己从数据库查询数据记录)
  • 相关阅读:
    Powershell数据处理
    Powershell About Active Directory Group Membership of a domain user
    Powershell About Active Directory Server
    Oracle Schema Objects——Tables——TableStorage
    Oracle Schema Objects——Tables——TableType
    English Grammar
    Oracle Database Documentation
    Oracle Schema Objects——Tables——Oracle Data Types
    Oracle Schema Objects——Tables——Overview of Tables
    What is Grammar?
  • 原文地址:https://www.cnblogs.com/chengjun/p/9134945.html
Copyright © 2011-2022 走看看