你好,我是茹炳晟。
今天这篇文章是“答疑解惑”系列文章的第二期,我还是选取了五个问题。这五个问题来自于第6~11篇这6篇文章,其中第9和第10篇这两篇文章中的两个问题被我合并为了一个问题,并且我会针对这个问题,再次为你简单梳理一条学习路径。
然后,我还会选择这6篇文章下的精彩留言,为你稍作解答、分析。
在这篇文章中,我依旧为你添加了每篇文章的链接,并用一句话概括了这篇文章的主要内容,你也可以再次回到这篇文章中,回忆一下第一次阅读后的想法,看看第二次阅读又有了哪些新的感想。欢迎你继续给我留言,我仍在关注着你的问题、反馈,希望可以为你提供更多的帮助。
现在,我们就开始今天的五个问题吧。
## 问题一:你在使用代码覆盖率工具的时候,遇到过哪些“坑”?
在专栏第6篇文章[《你真的懂测试覆盖率吗?》](https://time.geekbang.org/column/article/10759)中,我针对代码覆盖率这个主题,和你分享了代码覆盖率的的价值、局限性,并结合JaCoCo分析了代码覆盖率工具的实现原理。这也是这个专栏中第一篇为你讲解某种测试工具实现原理的文章,希望你可以认真体会。
通过阅读这篇文章,我希望你回顾一下曾用过的代码覆盖率工具,并说说你的使用感受和遇到的“坑”。
留言中,我也看到了一些留言很精彩,提到了自己使用代码覆盖率工具的一些实践。所以,也很感谢你们的分享。
接下来,我再和你分享下,在使用代码覆盖率工具时可能面临的两个最大的问题:
1. **测试覆盖率越往后越难。**
统计代码覆盖率的根本目的是,指导用户的测试用例设计。也就是说,我们要通过代码覆盖率的结果去发现哪些代码没有被执行到,以此为依据再去设计有针对性的测试用例。
在这个过程中,你会发现前期达到一个不错的覆盖率指标(比如70%)还是比较容易的,但是越往后就越难提高了。
因为,后期没有覆盖到的代码往往都是一些出错异常分支的处理,为了能够覆盖这部分内容,往往需要构造特殊的数据和环境。很多时候,这些数据和环境并不好得到,就不得不采用各种Mock的手段来实现。
因此,在实际项目中,到底要不要一定到达很高的覆盖率,就应该根据项目情况结合风险驱动的概念来综合分析了。
1. **推行代码覆盖率的初期阶段,很难要求很高的覆盖率指标。**
代码覆盖率的挑战并不是来自于技术本身,而是来自于管理。很多公司在刚刚推行覆盖率统计的时候,会发现各个模块和项目的覆盖率普遍较低,有些甚至还不到20%。这时,我们就不应该依靠行政手段来强行规定高的代码覆盖率。
因为这会在短时间内增加很多工作,一来会引起开发人员的抵触与反感,二来会耽误项目本身的进度。此时最好的做法是采用持续改进的策略,也就是随着迭代更新,代码覆盖率不允许出现下降的趋势,至少保持持平或者逐渐增长的态势。
## 问题二:你在填写软件缺陷报告时,还有哪些好的实践值得分享呢?
在专栏第7篇文章[《如何高效填写软件缺陷报告?》](https://time.geekbang.org/column/article/10936)中,我分享了想要把发现的缺陷准确无歧义地表达清楚,一份高效的软件缺陷报告应该包括的内容,以及需要注意的问题。
在这篇文章最后,我希望你分享一下自己在填写软件缺陷报告时,还有哪些好的实践。
在这里,我想再和你分享另外一个观点。你在实际提交软件缺陷的时候,有没有感觉这个过程很繁琐。对于缺陷的重现规律和步骤需要做很多尝试,然后写文档时还有很多工作量,比如需要考虑措辞和语句的组织,这往往会花费你不少时间。那有没有什么好方法可以减少写文档的工作量吗?
其实,对于传统软件的开发流程来讲,这种重量级的缺陷报告是必须的。特别是对于一些大公司来说,开发人员和测试人员可能散布在全球不同时区的地域,这种严格的缺陷文档就很有必要了。
但是,现在的很多互联网企业,尤其是国内的互联网企业,所有的工程技术人员都在一个办公室,而且普遍采用敏捷开发的模式,此时面对面地沟通软件缺陷的效果将远远好于文档描述,而缺陷报告本身的作用也会退化成一条简单的记录。
所以,**缺陷报告的详细程度应该在很大程度上取决于团队特征。**
另外,我发现读者在文章的留言中也提出了很多建设性的方法。比如,下面这位昵称为“卫宣安”的读者,提出了让开发人员主动来认领缺陷的方式。如果说所有的开发人员都具有很强的责任心,同时系统规模也不是太大,或者说报告的缺陷数量不是很多的情况下,这的确是解决问题的一个好思路。但是,当团队规模比较大,缺陷数量也比较多的时候,要求每个开发人员都去挨个查看所有缺陷的效率就会很低。
那么,在这种情况下,我们是否有更好的方法来解决这个问题呢?答案就是,采用基于AI和机器学习的缺陷分类方法。我们可以通过缺陷的特征值提取,并结合分类算法对缺陷应该归属的团队进行自动分类。
在eBay的自动化测试体系中,就有专门的系统对失败用例和缺陷做自动进行分类。
## 问题三:你觉得在实际工程项目中,一份高效的测试计划应该包括哪些内容?
在第8篇文章[《以终为始,如何才能做好测试计划?》](https://time.geekbang.org/column/article/11063)中,我和你分享了虽然在敏捷开发模式下,软件测试不再局限于厚重的、正式的计划文档,但是测试计划的重要性丝毫没有发生变化。一份成功的测试计划,依旧必须要清楚地描述出测试范围、测试策略、测试资源、测试进度和测试风险预估这五个最重要的方面。
而在读完这篇文章之后,我希望你思考的是,在一份测试计划中,除了这五个最最关键的内容外,你觉得在实际工程项目中还需要再增加的内容,以及是不是所有的项目都需要有很详实的测试计划。
其实很多时候, 你会发现计划的速度远远赶不上变化,尤其是互联网产品的开发。就像下面这两位用户在留言中描述的现象,相信你在实际的工作中一定遇到过类似的场景。

所以,这个时候,**你有没有反问过自己一个问题,此时文档化的详细测试计划还真的有必要吗?或者说有没有可能采用轻量级的测试计划。**
首先,轻量级的测试计划并不是说没有计划,而是指计划的文档化表现形式应该尽可能简单,只是用一些关键词来描述纲领性的东西。这样做,一来可以降低测试计划本身的写作时间;二来当测试计划由于各种原因发生变化的时候,也可以非常快速灵活地进行修改和更新。
其实,目前的敏捷开发模式(比如Scrum模式)下的测试计划就会在每个Sprint最开始的时候,以非常轻量级的方式来确定测试计划,有些时候甚至可以没有文档化的测试计划。这时,关于测试范围、测试策略和测试设计之类的内容都在测试人员的脑子中。
注意,这时候虽然没有书面的测试计划,但并不代表说没有测试计划。
## 问题四:软件测试工程师的高效进阶路径是什么?
我在第9篇文章[《软件测试工程师的核心竞争力是什么?》](https://time.geekbang.org/column/article/11325)和第10篇文章[《软件测试工程师需要掌握的非测试知识有哪些?》](https://time.geekbang.org/column/article/11453)中,分别和你分享了一个软件测试工程师需要具备的核心竞争力,以及需要掌握的非测试专业知识。看到这两篇文章后面,有很多用户留言说:觉得很迷茫,抓不住自己要重点培养的能力、要怎么快速学习。
虽然今年7月6日我在极客时间做直播时回答过这个问题,但这里为了帮助你快速找到一条适合自己的道路,我就再简单为你梳理下。
首先,我把在软件测试岗位上工作了0~5(或者0~3)年的工程师,划分为初级测试人。为什么有这个划分呢?因为0-5年工作经验的测试工程师往往工作的中心都还是在软件产品测试本身,还没有将测试上升到质量工程的高度。当然了,我这里说的测试指的是广义上的测试,包括功能测试、自动化测试、性能测试等各个方面。
然后,我把初级测试人可以进阶的方向,归纳为了三类: