什么是单元测试的“覆盖率”

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:测完一次就再也不管了,结果代码改了,测试全废。


总结

提高覆盖率就像让老师认真批改作业:

  1. 查缺补漏:用 IDEA 的"雷达"找到没检查的代码。
  2. 专挑刺儿:多测边界值、异常情况。
  3. 别当强迫症:关键代码覆盖到位就行,鸡毛蒜皮的别纠结!

虽然说,测试是为了少加班修 Bug,但是加班提高单元测试覆盖率的xx企业也是大有人在。

相关推荐
叶落无痕523 天前
Electron应用自动化测试实例
前端·javascript·功能测试·测试工具·electron·单元测试
汽车仪器仪表相关领域3 天前
工况模拟精准检测,合规减排赋能行业 ——NHASM-1 型稳态工况法汽车排气检测系统项目实战经验分享
数据库·算法·单元测试·汽车·压力测试·可用性测试
码农水水3 天前
大疆Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·面试·职场和发展·单元测试·php
卓码软件测评3 天前
CMA-CNAS软件测评报告机构【Apifox动态Mock响应处理复杂业务逻辑设计】
测试工具·性能优化·单元测试·测试用例
孙琦Ray3 天前
GitHub开源项目日报 · 2026年1月7日 · 本期热门开源全景
单元测试·开源·前端调试·浏览器自动化·知识管理·ai代理·跨语言序列化
程序员三藏3 天前
单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
卓码软件测评4 天前
CMA/CNAS双资质软件测评机构【Apifox高效编写自动化测试用例的技巧和规范】
测试工具·ci/cd·性能优化·单元测试·测试用例
回眸&啤酒鸭4 天前
【回眸】Tessy 单元测试软件使用指南(五)进阶报错之解决指南(含泪整理)
单元测试
小二·4 天前
前端测试体系完全指南:从 Vitest 单元测试到 Cypress E2E(Vue 3 + TypeScript)
前端·typescript·单元测试
无心道人c4 天前
SonarQube7.6实现C#自定义规则
单元测试·自动化·sonar