技术经验分享:谈一谈单元测试(3)

发表于:2022-2-21 09:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:有尘    来源:阿里技术

  五 、打造代码自动生成最佳方案
  既然市场上的插件都不是特别合适,就决定写一个适合自己项目的插件(暂时命名JCode5)。有兴趣的也可以自己试试。
  1. 插件安装
  idea插件市场下载,搜索JCode5。
  2. 插件使用
  插件有三个功能
  ·生成测试代码,也就是生成单元测试
  · 生成json数据,通常用来生成测试数据,比如model。用来参数化测试。
  · 增加测试方法,随着业务开发,类可能增加一下功能方法,这个时候相应的可以增加测试方法
  定位到需要测试的类,快捷键或菜单定位到generater,如下,选择JCode5。
  生成测试类
  目前支持三个选项,后续会逐渐完善。
  另外两个功能类似,直接尝试使用一下就行。
  生成的结果---类+json数据
  @ParameterizedTest
    @ValueSource(strings = {"/com/cq/common/JCode5/testExtend.json"})
     public void testExtendTest(String str) {
      JSONObject arg= TestUtils.getTestArg(str);
      Integer i = arg.getInteger("Integer"); 
      // 识别泛型活着集合类
      List<String> stringList = JSONObject.parseArray(arg.getString("List<String>"),String.class); 
      String stringArg = arg.getString("String"); 
      String stringArg1 = arg.getString("String"); 
      String stringArg0 = arg.getString("String"); 
      // 识别四个方法,包括父类调用、其他方法调用
      when(testService.testBase(any(Integer.class))).thenReturn(stringArg);
      when(testService.testMuti(any(List.class),any(Integer.class))).thenReturn(stringList);
      when(testService.getStr(any(Integer.class))).thenReturn(stringArg0);
      when(testService.testOther(any(Student.class))).thenReturn(stringArg1);
      jCode5.testExtend(i);
      //todo verify the result
    }

  如上除了生成基本的代码,另外会生成测试数据,它会将该方法所需要的测试数据全都生成在一个json文件当中,完全实现
  “数据和代码的分离”
  如testExtend.json:
  {
    "Integer":1,
    "String":"test",
    "List<String>":[
      "test"
    ]
  }

  补充判定语句
  这一块前期考虑对于不同的方法有不同的校验,所以目前想的还是开发者自己去写验证代码。
  注意事项
  在自动生成完代码之后,虽然可以运行,但如我们前面提到的,为了写单元测试而写的单元测试是没什么价值的,我们的最终目的是为了写一个好的测试。代码自动生成,但它终究能力有限,所以还是需要我们自己再去验证,比如
  ·该插件生成的代码需要junit5和mockito的支持,使用时需要引入相关的依赖
  · 增加assert校验逻辑,看是不是想要的结果,目前插件不会自动生成assertEquals等断言代码。
  · 运用参数化测试能力,复制一份生成的json文件并修改输入数据,多组测试
  3. 插件实现介绍
  主要的实现思路,参考了dubbo的SPI的源码,也就是自动实现自适应SPI那部分,简单点说就是反射获取代码逻辑,然后生成测试代码。
  4. 后期规划
  mock数据可定制,目前的想法是:
  ·固定值比如目前的String: test、Integer和boolean: 0、1
  · 测试者使用配置模版,比如txt文件包含keyValue对
  · 使用Faker,对于name、email、phone这种特定倾向的数据进行特色自动生成
  自动分支测试,这一块的想法目前主要针对if来做,需要一定的时间。

  六、 写在最后
  对于代码自动生成,还是有很多东西可以做的,但有些问题还尚待解决,希望能尽最大努力解放我们的双手,也能提高我们单元测试的质量。
  已在我们项目中使用此模式增加135个测试用例(除去mock的单模块达到70%):速度比集成测试(pandora、spring等)提升一个等级。代码的覆盖率相对可观。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号