金无足赤,人无完人。在软件行业里,想要开发出一件没有bug的产品简直是天方夜谭,甚至开发出一款高质量的产品也会难于上青天。但是实践出真知,一些开发者总结平时项目开发经验,通过提高测试覆盖率和使用一些质量工具来提高产品质量。
当项目经理开始着手一个大型软件项目时,就得思考产品质量问题了,并且从测试就要开始关注。然而并非所有的测试都是一样的,下面提供一些常见的测试类型:
- 单元测试
- 不变条件测试(断言等)
- 功能测试
- 压力测试
- 性能测试
- 可伸缩测试
- 基于用户的负载测试
- 场景测试
下面,本文将讨论提升测试覆盖率以及如何使用力量倍增器(force multipliers:对现有测试套件进行改进,再以新的方式测试产品)来成功测试长尾浮现的稀有bug( the long tail of rarely surfaced bugs)。
把测试计划写在纸上:测试矩阵
编写测试时,最困难的事情之一莫过于决定测试什么?当产品有很多功能的时候,大家都可以随意用,真正关键的难题是你如何将这些功能有系统的组织(串联)起来。
大家可以编写测试矩阵,最后把所有的功能大小都写下来,并且汇总到一个大的电子表格中,然后再移交到工程团队。
投资一个测试执行系统
你可能会编写许多测试,但集成测试允许开发者排除陷入瘫痪的异常来做出更深的修改。这样的集成应该做到快速、可伸缩,你需要stellar测试基础设施来自动执行添加、管理以及运行测试等操作。一个构建良好的执行系统,其执行功能测试的速度会安全快速地提升。
构建一个良好的测试基础设施类似于为开发团队编写消费类产品。一个完美的测试执行系统在每次推送后,会运行整个测试套件。
Psyduck平台可以运行任何测试子集,并且无需担心代码的版本问题。此外,如果你想运行本地不断变化的代码,Psyduck可以打补丁,所以,一般在运行Psyduck之前都会执行如下代码:
去年夏天,一个MemSQL的实习生创建了一个名为Liveduck的实时虚拟化层。下面这个界面显示了所有正在运行的和最近刚完成测试的元数据,比如相关工程师、通过/失败数:
一个优秀的测试系统所具备的一个特性是,无论在开发者电脑上还是在平台上,每次的运行情况都应该是一样的。此外,每个测试都应该是独立的,以至于它需要零安装。这也有助于测试套件的维护,并且加快故障排查。
力量倍增器(Force Multipliers)
下面列出了一些力量倍增器清单,使用其中的任意一个技巧都可以把MemSQL带到一个新的水平。
1. Transforms
MemSQL拥有许多Transforms,这里列了几个:
- 复制Transform
- 子查询Transform
- 备份恢复Transform
2. 随机生成查询
这里有一些力量倍增器用来随机生成查询:
- 产生许多不同的查询,但结果一样。
- 创建智能生成器,来逐步增加生成测试的复杂性。
- 发现bug后会自动降低查询的复杂性,并且创建一个最小的可再生测试用例。
3. Functional Stress
4. 堆栈散列器
5. 生成故障
6. 通过代码审查来提高透明度和代码质量
使用一个好的代码审查工具乃是必须的,比如像Phabricator,它可以集成工作流,并且使用起来非常轻松有趣。
总结
在开发一个大型项目时,为了提高产品质量来投资测试基础设施是完全值得的,并且你会收获到许多意想不到的惊喜:
- 使用stellar工具和力量倍增器可以减轻许多人力劳动,并且对长尾bug的测试非常有帮助。
- 要时刻意识到当前产品所处的质量状态
- 快速稳定的运送产品