什么是单元测试的“覆盖率”
1. 先搞清楚“覆盖率”是啥?
打个比方,你写完作业(代码),老师(测试)要检查是不是每道题都做对了。覆盖率就是说老师检查了多少题。比如:
- 行覆盖率:老师看了你作业的每一行字吗?
- 分支覆盖率:遇到选择题(比如
if/else
),每个选项都检查了吗? - 方法覆盖率:作业里的每道大题(比如数学的应用题、语文的作文)都批改了吗?
覆盖率低?说明老师偷懒,没检查到位!
2. 怎么让老师(测试)更负责?
➀ 别只测“好学生”,也得盯“差生”
- 例子:你写了个算数方法
add(2,3)
,测试了正常情况,结果是对的。但如果有傻子传了个负数呢?或者传了个超大数字? - 怎么办:
就像老师不能只看学霸的作业,得故意出点刁钻题:@Test void testAdd() {// 正常情况assertEquals(5, calculator.add(2, 3));// 刁钻情况:负数、零、超大数assertEquals(-1, calculator.add(2, -3));assertEquals(0, calculator.add(0, 0));assertEquals(2147483647, calculator.add(2147483647, 0)); }
➁ 别放过“如果...就...”这种选择题
- 例子:代码里有个
if(成绩>=60)
发奖状,else
叫家长。你只测了考 80 分的同学,那刚及格的和不及格的呢? - 怎么办:
就像老师得把考 59、60、90 分的学生都叫来办公室溜一圈:@Test void testScore() {// 考了59分(叫家长)assertEquals("叫家长", teacher.checkScore(59));// 考了60分(发奖状)assertEquals("发奖状", teacher.checkScore(60));// 考了90分(发奖状)assertEquals("发奖状", teacher.checkScore(90)); }
➂ 别以为“出错代码”不会被执行!
- 例子:代码里有个
try-catch
处理报错,但测试时一直走正常流程,导致catch
里的代码像个摆设。 - 怎么办:
就像老师得假装把墨水洒在作业本上,看学生会不会正确处理(比如拿纸巾擦):@Test void testError() {// 模拟一个会报错的操作(比如网络断开)when(mockDatabase.connect()).thenThrow(new NetworkException());// 看程序会不会自己擦“墨水”(比如记录日志、回滚操作)assertTrue(logger.hasError()); }
3. 用 IDEA 当“雷达”,扫出漏网之鱼
- Step 1:在 IDEA 里右键点测试类,选 Run with Coverage(就像打开“作业批改雷达”)。
- Step 2:看代码左边会出现颜色标记:
- 绿色:老师检查过这行,没问题!
- 红色:老师根本没看这行!(赶紧补测试!)
- 黄色:老师看了但没仔细查(比如
if
只检查了true
,没查false
)。
4. 偷懒小技巧
- 技巧 1:遇到简单代码(比如自动生成的
getter/setter
),直接忽略!别为了覆盖率而测试。 - 技巧 2:用 IDEA 的 Generate 功能(
Ctrl+Enter
)快速生成测试方法骨架,省得手打。 - 技巧 3:如果死活测不到某行代码(比如
private
方法),别硬刚,可能这代码根本没用,直接删掉!
5. 千万别踩的坑!
- 坑 1:为了覆盖率强行凑数。
@Test void test() {calculator.add(1,1); // 没写断言!就像老师看了作业但不打分 }
- 坑 2:测了一堆无关紧要的代码(比如
main
方法),核心逻辑却没测。 - 坑 3:测完一次就再也不管了,结果代码改了,测试全废。
总结
提高覆盖率就像让老师认真批改作业:
- 查缺补漏:用 IDEA 的“雷达”找到没检查的代码。
- 专挑刺儿:多测边界值、异常情况。
- 别当强迫症:关键代码覆盖到位就行,鸡毛蒜皮的别纠结!
虽然说,测试是为了少加班修 Bug,但是加班提高单元测试覆盖率的xx企业也是大有人在。