每一种测试规模带来了一些益处,从测试的规模来说可以分为三种小型,中型,大型三类,如下图。不同规模的测试对测试者的信息成正比,越是大规模的测试对整个系统信息越高,越是规模大依赖性越高,速度越慢。每种测试规模的优点和缺点也都进行罗列,仅供参考和比较。
一、大型测试
大型测试的优点和缺点包括如下:
测试最根本最重要的:在考虑外部系统的情况下应用系统是如何工作的。
由于对外部系统有依赖,因此它们是非确定性的。
很宽的测试范畴意味着如果测试运行失败,寻找精准失败根源就会比较困难。
测试数据的准备工作会非常耗时。
大型测试是较高层次的操作,如果想要走到特定的代码路径区域是不切实际的,而这一部分却是小型测试的专长。
二、中型测试
中型测试的优点和缺点包括如下:
由于不需要使用 mock 技术,且不受运行时刻的限制,因此该测试是从大型测试到小型测试之间的一个过渡。
因为它们运行速度相对较快,所以可以频繁地运行它们。
它们可以在标准的开发环境中运行,因此开发人员也可以很容易运行它们。
它们依赖外部系统。
由于对外部系统有依赖,因此它们本身就有不确定性。
它们的运行速度没有小型测试快。
三、小型测试
小型测试的优点和缺点包括如下:
为了更容易地就被测试到,代码应清晰干净、函数规模较小且重点集中。为了方便模拟,系统之间的接口需要有良好的定义。
由于它们可以很快运行完毕,因此在有代码变更发生的时候就可以立刻运行,从而可以较早地发现缺陷并提供及时的反馈。
在所有的环境下它们都可以可靠地运行。
它们有较小的测试范围,这样可以很容易地做边界场景与错误条件的测试,例如一个空指针。
它们有特定的范畴,可以很容易地隔离错误。
不要做模块之间的集成测试,这是其他类型的测试要做的事情(中型测试)。
有时候对子系统的模拟是有难度的。
使用 mock 或 fàake 环境,可以不与真实的环境同步。
小型测试带来优秀的代码质量、良好的异常处理、优雅的错误报告;大中型测试带来整体产品质量和数据验证。单一的测试类型不能解决所有项目需求。正是由于这个原因,某些公司的项目维护着一个不同测试类型之间的健康比例。对于一个项目,如果全部使用大型的端到端自动化测试是错误的,全部使用小型的单元测试同样也是错误的。
小型测试带来优秀的代码质量、良好的异常处理、优雅的错误报告;大中型测试会带来整体产品质量和数据验证。
检验一个项目里小型测试、中型测试和大型测试之间的比率是否健康,一个好办法是使用代码覆盖率。测试代码覆盖率可以针对小型测试、中大型测试分别单独产生报告。覆盖率报告会针对不同的项目展示一个可被接受的覆盖率结果。如果中大型测试只有 20%的代码覆盖率,而小型测试有近 100%的覆盖率,则说明这个项目缺乏端到端的功能验证。如果结果数字反过来了,则说明这个项目很难去做升级扩展和维护,由于小型测试较少,就需要大量的时间消耗在底层代码调试査错上。测试开发工程师可以使用构建与运行测试时使用的工具,来产生并查看测试覆盖率结果,只需要在命令行中额外增加一个选项即可。覆盖率结果会存储在云端,任何工程师在公司内网络环境下都可以通过浏览器查看这些报告。
有些大厂有许多不同类型的项目,这些项目对测试的需求也不同,小型测试、中型测试和大型测试之间的比例随着项目团队的不同而不同。这个比例并不是固定的,总体上有一个经验法则,即 70/20/10 原则:70%是小型测试,20%是中型测试,10%是大型测试。如果一个项目是面向用户的,拥有较高的集成度,或者用户接口比较复杂,他们就应该有更多的中型和大型测试;如果是基础平台或者面向数据的项目,例如索引或网络爬虫,则最好有大量的小型测试,中型测试和大型测试的数量要求会少很多。