编写单元测试

    • 背景

      在编写单元测试,经常遇到需要创建实体对象的场景,比如测试插入实体到数据库的场景。针对这些状况,我们一般做法是先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内容(需要自己从数据库查询数据记录)

posted on 2018-06-04 19:05  chengjunde  阅读(440)  评论(0编辑  收藏  举报

导航