首页  编辑  

单元测试注意事项

Tags: /Java/   Date Created:
单元测试注意事项:
  • 一定要写断言 assert,没有断言的单测是无用的单测;
  • 单元测试应该写明 given when then
  • 如果有了流水线Pipeline,应该使用门禁系统,保证代码提交前必须通过质量门禁,保证一定的分支覆盖率才允许合并到分支当中
  • PoJo类,可以写入白名单,不要求单测或者覆盖率
  • 断言禁止永真断言,例如 assertTrue(true);
  • 优先考虑分支覆盖率而不是代码行覆盖率,分支覆盖率越高,质量越好,缺陷越少,100%行覆盖不代表就没有问题;同样100%分支覆盖率也不代表没有缺陷,因为只有比较完备的异常用例覆盖到了才能保证没有错误。例如判断日期的代码 if day >= 1 and day <= 31 不代表日期就是对的,必须结合月份和闰年,才能保证没有问题,所以测试用例要覆盖闰年和不同月份的情况。
  • 单元测试要注意并发的处理,默认单测运行的时候会是多线程,所以单测里面尽量不要用field变量,因为同一个测试类的Field变量会被所有 @Test 方法共享,如果并发的时候可能导致问题,尤其是有写入的情况下。
  • 单元测试无需人工干预,必须全自动运行,例如不应该使用system.out.print打印输出来人工检查,请使用断言
  • 单测用例,必须覆盖正常用例、边界用例和异常用例,并使用断言来判定
  • 单测失败,应该优先考虑修复代码,而不是更改单测绕过去
  • 发现失败的单测,若是程序问题,要修复问题,不要遗留
  • 若某些功能输出不确定的数据,应该想办法用mock来实现固定输出并用断言判断,例如计算时间相差几个小时,不要用当前时间去取值,而应该用固定已知两个差值的日期数据去判断
  • 单元测试的@Test的方法,不应该有依赖性,例如不应该先运行@Test method1,然后 @Test method2 依赖 method1先运行。原因是 @Test 默认是并发运行的或者由测试框架如JUnit/TestNG等调度的,先后顺序无法控制。
  • 单测建议使用Jacoco来测试Coverage,保证满足一定的分支覆盖率