项目一般在单元测试或集成测试阶段统计代码覆盖率,统计代码覆盖率的根本目的是找出潜在的遗漏用例,并有针对性的进行补充。本文旨在纠正研发工程师对覆盖率数据的一些误解,以期大家都能写出高质量高场景覆盖率的单元测试。
以下对覆盖数据进行一些解读:
- 行 vs 可执行代码行
行覆盖率中的"行"是指可执行代码行,而不是源文件中所有的行。特别的:注释,该行只包含标点符号,Import, 声明, 定义时的方法(函数)名;被拆分为多行代码块中的非首行;都会被覆盖率工具忽略
- 可执行行 vs 语句
由于覆盖率工具最小维度是行,代码执行到本行,即表示命中覆盖。但有些语言支持多个语句放在同一行,或者支持三目运算符的语言,需要确保流程控制的每个边界情况(即分支)都被执行(覆盖)
- 可执行覆盖 vs 用例集覆盖
一个谬论:我们知道,拥有未覆盖的代码意味着我们的测试可能遗漏了重要的场景,但反过来并不成立。实际上,经过充分测试的代码 ≠ 高覆盖率。
对于100%命中覆盖的行, 需要考虑是扩展用例集覆盖(有效等价类,无效等价类, 边界)
以下都为100%代码行覆盖率的单测用例。若只关注行覆盖 ,则导致部分场景未被覆盖到 bug流露到生产环境。
总结
让单测用例尽可能全面,但不要考虑行覆盖率。这意味着编写尽可能多的测试用例,而不仅仅实现最大行覆盖率的最小测试用例集。即:
以上是我在公司宣传的质量内建系列的第五期内容。
后续的每一期内容我都会及时发布在掘金的工程师质量文化专栏,欢迎大家关注,共同进步。 若需要原始海报资料,可以在文章下边评论留言,或是私信我获取。
最后,照例给大家看下我们在公司张贴的海报吧~