<audio id="audio" title="33 | 测试工具：为什么不应该通过QQ/微信/邮件报Bug？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ee/18/eef93fa56e6924da738e900b4113eb18.mp3"></audio>

你好，我是宝玉。十多年前，当我还是个野路子程序员时，我在外面接私活做项目，客户在使用过程中遇到了Bug，直接就截个图，或者是用Word文档整理在一起，从QQ或者邮件上把Bug信息发送给我，我收到后再修复更新上线。

而现在正规的软件项目已经不会再用这种原始的方式来报Bug了，而是会借助测试工具来帮助报告和跟踪Bug，即使你偶尔能看到有项目还在采用原始方式报Bug，你肯定也会觉得这样做不专业。

但不知道你有没有仔细想过这个问题，为什么现在不通过QQ/微信/邮件报Bug，又有哪些测试工具可以帮助你更好地发现、报告和跟踪软件中的Bug呢？今天我们来展开讨论这个问题。

## Bug跟踪工具

我想你对于Bug这个词一定不陌生，它是我们软件中的缺陷或错误。这个词的诞生也很有意思。

> 
1947年9月9日，一只小飞蛾钻进了哈佛大学的一台计算机电路里，导致系统无法工作，操作员把飞蛾贴在计算机日志上，写下了“首个发现Bug的实际案例”。


[<img src="https://static001.geekbang.org/resource/image/79/3c/796010fd083207b660547887bbc5893c.png" alt="" title="图片来源：WikiPedia">](http://en.wikipedia.org/wiki/Software_bug)

虽然Bug的历史已经有60多年了，然而Bug跟踪工具却没有出现太久。软件项目中最早也是通过邮件、即时通讯等原始方式报告Bug，直到1992年才有第一个专业的Bug跟踪软件[GNATS](http://www.gnu.org/software/gnats/)。

在这之后才逐步有了像Bugzilla、Jira、MantisBT等专业的Bug跟踪工具。而现在，Bug跟踪工具已经成为软件项目中必不可少的工具之一。

那么，Bug跟踪工具是怎么逐步替代QQ、邮件等方式来处理Bug的呢？

#### 为什么要使用Bug跟踪工具？

我们在上一节学习了软件测试相关的理论知识，软件测试的主要工作就是发现Bug、报告Bug和跟踪Bug。测试人员发现Bug只是第一步，还需要报告Bug让开发人员可以知晓和定位，并且跟踪整个Bug修复的过程。

用QQ或者邮件报Bug的这种方式，看起来快捷简单，但是问题很多：

- Bug不能有效被跟踪，不知道一个Bug是不是已经被修复了；
- 效率很低，开发人员频繁的被这样的报Bug的消息打断，不得不停下手头的工作去甄别Bug；
- 不能直观的了解当前项目的Bug状态，比如说：修复了多少，还有多少没有修复，近期Bug数量是增加了还是减少了。

不难看出，通过QQ等方式报告的Bug，都是文字配合图片等信息，很难检索和分类，**而Bug跟踪工具，采用结构化的数据来定义Bug，每一个Bug都有一些关键的信息可以对Bug进行分类和检索。**

在Bug跟踪工具使用中，一个基本的Bug信息包括：

- 标题；
- 描述（包括期望结果、实际结果和重现步骤等关键信息）；
- 优先级；
- 指派人；
- 状态（New、Open、 Rejected、Fixed等）；
- 其他。

那这样的话，就很容易的对Bug进行分类和检索，比如说：

- 张三想查看所有分配给他的Bug，那只要列出所有指派人是张三的Bug；
- 想列出所有未解决的Bug，只要列出所有状态不是Close或Rejected的Bug即可。

这样对于开发人员来说，可以直观的看到自己有哪些Bug需要处理，Bug的描述信息也可以帮助重现Bug、快速定位到Bug的原因；对于项目经理或者测试人员来说，可以直观的看到哪些Bug还没解决，及时了解项目进展。

另外，我在《[12 | 流程和规范：红绿灯不是约束，而是用来提高效率](http://time.geekbang.org/column/article/87129)》这篇文章中提到了项目中的流程和规范，**在软件项目中，要把好的实践流程化，把好的流程工具化。Bug跟踪工具则很好的贯彻了这一点，将Bug的解决过程流程化。**

你平时在Bug跟踪系统中看到的Bug状态，看起来只是一个有限的状态列表，但背后其实是一套解决Bug的流程。就像下面这张图表示的这样，一个Bug从创建到最后结束，其实是有一个完整的流程的。

<img src="https://static001.geekbang.org/resource/image/4f/dd/4f56bf4d43b652ab2b92318775a850dd.png" alt="">

通过这样的流程，开发人员就可以集中对Bug进行分配、按照优先级分别解决，而测试人员则可以第一时间知道Bug处理的状态变化，及时验证，方便跟踪整个过程。

#### 使用Bug跟踪工具的注意事项

报告Bug的目的是为了能跟踪Bug，以及帮助开发人员重现直到解决问题。要想做到测试和开发高效协作，这里面有一些需要注意的事项。

首先，所有的Bug都应该通过Bug跟踪系统管理和跟踪，不应该再通过QQ/微信/邮件的方式跟踪Bug。如果客户、同事通过Bug跟踪系统之外的其他途径反馈Bug，应该统一提交到Bug跟踪系统管理跟踪起来。

然后，不能把多条Bug合并成一条，一个Bug创建一个独立的Ticket。我遇到过有些测试为了省事，把几条Bug合并成一个Ticket来报，导致的问题就是，必须这几条Bug都修复了，这个Ticket才能改变状态，如果其中一个Bug没有验证通过，需要Reopen整个Ticket。

再有，描述清楚如何重现Bug非常重要。一个Bug如果无法重现，也没有日志、截图等辅助信息，那是非常难以定位的，会浪费很多开发人员定位Bug的时间。

最后，不要把Bug跟踪系统当成讨论板用。在项目中一个常见的场景是，一个Ticket下面，跟讨论版一样添加了很多留言，开发认为不是Bug，测试认为是一个Bug，开发又觉得是产品设计没定义清楚，应该让产品经理来讲清楚，皮球踢来踢去，最后问题还没解决。

Bug跟踪系统的主要功能是用来跟踪Bug的，不是用来讨论和扯皮的。遇到上面的情况，其中一方就应该主动一点，拉上相关人面对面讨论，当面确认清楚这个Bug到底是什么问题，然后马上解决掉。

## 自动化测试工具

除了Bug跟踪工具，软件测试中还有很重要的一个工具就是自动化测试工具，虽然我在《[29 | 自动化测试：如何把Bug杀死在摇篮里？](http://time.geekbang.org/column/article/93405)》中已经有了较多篇幅说明，但这里还是想继续提一下，因为我觉得，**未来自动化测试会占据越来越多的比例，很多手工测试的工作会逐步被自动化测试代替。**

像美国Facebook、Google、Amazon这些大厂，单纯的手工测试职位在减少，一些手工执行测试用例检查的工作外包到了人力成本更低的像中国、印度、罗马尼亚等国家，而美国本土主要招聘的都是能写自动化测试的软件测试人员，或者直接就是开发人员来写这些自动化测试代码。

这就意味着对于软件测试人员来说，要求越来越高了，不仅要会设计测试用例，还要能写自动化测试脚本。同时对于开发人员来说，不仅要写功能代码，还需要实现一定量的自动化测试代码。

这些年自动化测试工具的快速发展，也降低了自动化测试的实现难度，可以方便地搭建自动化测试环境，通过简单的脚本语言就可以模拟人工操作。

但很多团队还是不愿意投入在自动化测试的开发上面，宁可雇佣更多的初级测试人员手工测试。

其实这个问题还是要整体来看，这就像修路，如果你从一个地方到另一个地方（类比测试所有用例），偶尔走几次，那么可以不修路（手动测试），如果你未来一段时间需要频繁的在两个地方通行（反复测试），那么最好现在就开始修建高速公路（自动化测试），这样可以节约你大量通行的时间(测试时间)。

当然更多的情况其实是团队不知道该如何实施自动化测试，比如说测试人员不会写程序，开发人员太忙，或者开发人员不会写测试用例，或者不知道该选择什么样的自动化测试工具。

对于这种情况，我的建议是：

测试人员可以学习一些基本的编程知识，尝试自己实现自动化测试。自动化测试所需要的技术，主要是对API的调用，并不需要复杂的逻辑，其实学习门槛并不高，而且这种技术在工作效率、薪资、个人职业发展等方面的投资回报都是巨大的。

从项目的角度，应该加大对自动化测试的投入，让开发人员参与到自动化测试代码的开发中。增加自动化测试代码的覆盖，对于提升软件质量是有明显好处的，通过自动化测试可以提升测试效率，及时发现软件质量问题。

对于开发人员来说，如果已经有了测试用例，完成自动化测试并不复杂，这个投入其实比做一些重要性不高的功能回报更高。

自动化测试工具的选择，需要根据你的软件的特点，去找出来适合你软件自动化测试的几款，然后自己搭建环境试用一下。在本文后面的附录中，我会列出一些自动化测试工具供参考。

## 其他帮助发现Bug的测试工具

软件测试的一个主要工作就是发现Bug，而要发现Bug，就需要对软件的各个领域进行测试，比如说有性能、安全性、兼容性等领域。

这些不同领域的测试，要求也不一样，比如说性能测试要求能测试出软件是否有性能瓶颈，能达到多少用户的访问量，需要模拟大量用户并发访问；安全性测试则要求对软件可能存在的安全漏洞进行扫描、验证；兼容性测试则要针对不用环境不同设备，对软件进行测试，以确保不会因为环境不一致导致功能不正常。

这些测试要么人工很难完成，例如模拟大量用户并发访问；要么需要很深的专业知识，例如安全性测试；要么需要大量的设备和巨大的工作量，比如做兼容性测试。所以这些领域的测试，就需要借助工具的帮助才能进行测试，从而发现问题。

应用这些测试工具其实并不难，毕竟都有很成熟的API，网上也有很多教程，真正需要的是去执行。另外如果想要最大化工具的价值，及时发现问题，还要考虑将测试工具的应用自动化，加入到你的持续集成流程中去。

以压力测试为例，你用Jmeter完成了压力测试脚本后，还可以考虑和CI集成，在每次构建时，运行一遍压力测试代码，可以在构建完成后看到直观的图表，还可以设置性能数据的阈值，如果性能指标低于阈值，会导致构建失败，这样就可以第一时间发现性能问题，缩小问题范围，并及时解决。

在这里，我也帮助搜集了一些相关的测试工具供参考，具体可以查看附录。

## 附录

#### Bug跟踪工具

在项目管理工具那一篇文章中，我已经给你介绍了一些任务跟踪系统，比如说[Jira](http://www.atlassian.com/software/jira)、[禅道](http://www.zentao.net)、[TAPD](http://www.tapd.cn)、[云效](http://cn.aliyun.com/product/yunxiao)等，都可以用来跟踪Bug。

- Bugzilla

[Bugzilla](http://www.bugzilla.org) 是由Mazilla公司提供的一款开源免费的bug跟踪系统。这是一款历史很悠久的产品。

- MantisBT

[MantisBT](http://mantisbt.org) 是一个简单但功能强大的开源bug跟踪系统，可以通过各种插件来扩展其功能。

- Redmine

[Redmine](http://www.redmine.org) 是一款开源的综合性的项目管理工具，不仅可以用于Bug跟踪，还可以用来跟踪项目进度。

#### 自动化测试工具

除了传统的桌面应用外，现在移动设备的普及，要测试的终端也越来越多。借助一些自动化测试工具，可以帮助简化多设备的测试。下面简单介绍几个自动化测试工具。

- Selenium

[Selenium](http://www.seleniumhq.org) 是一个 Web 端的自动化测试工具，直接运行在浏览器中，用来模拟用户操作。类似的还有[WebDriverIO](http://webdriver.io) 和 [Nightwatch.js](http://nightwatchjs.org) ，支持Javascript，API更简单更方便。

- Appium

[Appium](http://appium.io) 是一个开源、跨平台的自动化测试工具，用于测试移动原生应用，支持 iOS, Android系统。

- Macaca

[Macaca](http://macacajs.com/zh/) 是阿里巴巴开源的一款面向多端的自动化测试工具，支持桌面端、Web、移动端、真实设备和模拟器。

更多自动化测试工具可以参考：《[Best Automation Testing Tools for 2019 (Top 10 reviews)](http://medium.com/@briananderson2209/best-automation-testing-tools-for-2018-top-10-reviews-8a4a19f664d2)》([中文版](http://segmentfault.com/a/1190000012016234))。

#### 压力测试工具

很多软件在上线后，需要面对巨大的用户访问量，但如果等到上线后才发现程序性能不行，访问量一大就会导致服务崩溃，那就太晚了。所以最好是在测试阶段，就能测试出来程序的性能如何，瓶颈在哪里，然后在发布前对程序进行优化，确保能满足性能要求。

对程序性能的测试，就需要借助压力测试工具来模拟大量用户并发访问的场景。下面简单介绍一下几款常用的性能测试工具。

- Apache JMeter

[JMeter](http://jmeter.apache.org) 是一款开源的压力测试工具，纯Java应用程序。

- LoadRunner

[LoadRunner](http://www.microfocus.com/en-us/products/loadrunner-load-testing/overview) 是惠普旗下的一款商业自动负载测试工具，可以通过录制的方式制作测试脚本，上手容易功能强大，可以方便的监控和分析性能测试结果。

- 阿里云性能测试 PTS

阿里云性能测试[ PTS](http://cn.aliyun.com/product/pts) 是基于云端的压力测试服务，可以模拟从全国各地域运营商网络发起的流量，真实地反映使用情况，生成有价值的性能测试报告。

- WebPageTest

[WebPageTest](http://www.webpagetest.org) 是一个可以用来测试和分析网页性能的在线工具，支持不同浏览器，支持API。可参考《[WebPagetest H5性能测试工具入门详解](http://blog.csdn.net/qq_24373725/article/details/80091044)》。

更多性能测试工具介绍可以参考：《[10大主流压力/负载/性能测试工具推荐](http://zhuanlan.zhihu.com/p/26671961)》。

#### 安全性测试工具

软件的安全性是非常重要的指标，有时候开发人员缺乏安全意识，就可能会导致程序存在安全漏洞。安全领域也是开发和测试之外的一个技术领域，中小公司一般不会有自己专业的安全团队，就需要借助一些安全性测试工具来帮助对软件进行安全性检测。

- HP Fortify On Demand

[Fortify On Demand](http://www.microfocus.com/en-us/products/application-security-testing/overview) 是惠普旗下的一款安全检测工具，可以通过分析源代码、二进制程序或者应用程序URL检测程序安全漏洞。

- Sqlmap

[Sqlmap](http://sqlmap.org)是一款开源免费的检测SQL注入的工具。

- IBM Application Security APPScan

[APPScan](http://www.ibm.com/us-en/marketplace/appscan-standard) 是IBM旗下的一款漏洞扫描工具，支持网站和移动App。

更多安全性测试工具介绍可以参考：《 [11款常用的安全测试工具 ](http://blog.csdn.net/lb245557472/article/details/88572607)》《[安全测试工具篇（开源&amp;商业）](http://codeshold.me/2016/09/security_tolls.html)》《[最受欢迎的软件安全性测试工具有哪些？](http://mp.weixin.qq.com/s/OZp7Q8Jq_voTAkHj3CAMMQ)》。

#### 浏览器兼容性测试工具

网站开发最苦恼的问题之一就是浏览器兼容问题，不仅要兼容Chrome、IE/Edge、Firefox三大主流浏览器，还得考虑桌面设备和移动设备上的不同表现。如果人工对所有浏览器做兼容性测试，工作量比较大。好在也有一些不错的工具可以帮助做兼容性测试。

- Browsera

[Browsera](http://www.browsera.com) 可以对不同浏览器下的布局提供报告，包括截图和Javascript错误。

- Browslering

[Browslering](http:////www.browserling.com) 可以针对不同浏览器进行测试，它在虚拟机中运行真实桌面浏览器，还可以人工进行交互。

更多浏览器兼容性测试工具可参考《[10个免费的顶级跨浏览器测试工具](http://blog.sae.sina.com.cn/archives/4515)》

- 测试用例管理工具

我们在上一篇里面已经学习了，设计测试用例是软件测试很重要的工作，有专业的工具帮助管理测试用例，也可以起到事半功倍的效果。

- TestRail

[TestRail](http://www.gurock.com/testrail) 是TestRail是一个专注于管理测试用例的工具，可以用它来创建测试用例和用例集，跟踪测试用例的执行和生成报告。

- 飞蛾

[飞蛾](http://feie.work/) 是Coding旗下的测试管理工具，对中文支持好，界面美观。

更多测试用例管理工具可以参考：《[有哪些比较好的测试用例管理工具？](http://www.zhihu.com/question/26898212)》

## 总结

今天，我带你一起学习了软件测试工具的相关知识。软件测试，主要工作就是发现Bug、报告Bug和跟踪Bug。软件测试工具，也是围绕这三方面来帮助我们提高效率的。

Bug跟踪工具，不仅可以方便的报告Bug和跟踪Bug，更可以帮助开发人员将Bug的解决过程流程化。

自动化测试工具是发展趋势，未来自动化测试会占据越来越多的比例，很多手工测试的工作会逐步被自动化测试代替。

除了Bug跟踪工具和自动化测试工具，软件测试中还有性能测试工具、安全性测试工具、兼容性测试工具等，这些工具都可以更好的帮我们发现软件中的质量问题。

如果想要最大化工具的价值，及时发现问题，还要考虑将测试工具的应用自动化，加入到你的持续集成流程中去。

## 课后思考

你的项目中使用了哪些软件测试工具？看完本文，你觉得还可以在哪些方面加强对软件测试工具的应用？欢迎在留言区与我分享讨论。

感谢阅读，如果你觉得这篇文章对你有一些启发，也欢迎把它分享给你的朋友。
