我们需要多少测试人员

在工作中,我们经常会遇到这样的情况:甲方希望开发一个简单的小程序。不同乙方公司的报价却存在显著差异,比如有的公司将测试工时占到一半,而有的公司几乎不包含测试工时。同样的项目,为什么各公司的报价能相差如此之大呢?测试工时少了,能否保证质量?测试工时多了,就一定能保证质量吗?

实际上,对于一个项目需要多少测试人员,并没有一个固定的标准答案。对于业务逻辑简单、规模较小的项目,可能并不需要专职的测试人员。而对于规模较大,尤其是涉及多个团队共同协作的项目,专职的测试人员是必不可少的,有时甚至需要一个专门的测试团队。

不同公司对测试人员的配置往往有所不同。有些敏捷团队里,一个团队可能只有一个专职的测试人员,甚至没有专职的测试人员。有些公司则会设有与开发团队并行的独立测试团队。还有一些公司会根据人数比例来配备测试人员,通常开发人员和测试人员的比例为二比一或三比一。

总体来说,测试人员的配置应该根据项目的具体需求来决定。盲目减少测试工时可能会影响项目质量,而增加测试工时也不能完全保证质量,还需要合理的测试流程和工具的支持。

测试工作是必需的

首先,无论需要多少测试人员,测试都是软件开发周期中不可或缺的环节。如果某个乙方声称他们优秀到不需要测试,这显然是不负责任的。在我看来,软件中的 Bug 主要来源于两方面:

  • 开发人员失误造成的 Bug:例如敲错变量名、用错参数、使用错误函数等。这类 Bug 可以通过开发人员自身识别并修复。
  • 开发人员对需求理解错误造成的 Bug:软件开发是在对现实世界建模过程中进行的,开发人员将自己理解的需求实现为代码,其中难免会有理解错误。这类 Bug 通常开发人员无法自行识别,需要测试人员或甲方验收测试时发现。

对于第一种 Bug,一个成熟的团队或开发人员可以借助代码静态扫描、单元测试等技术手段来避免基本上不会产出这类错误。

而第二种 Bug 则与项目的复杂程度密切相关。对于业务逻辑简单、小规模的项目,一个优秀的开发人员就能确保没有 Bug。但在业务逻辑复杂的项目中,仅靠单个开发人员很难全面理解需求,甚至一些项目庞大到需要多个团队协作完成。更多的协作人员极大地增加了项目的沟通复杂度,超出了开发人员自身的管理范围。在这种情况下,专职的测试人员是必需的。

我曾与一位旅居日本的前辈交流过,他所在的团队开发了一款性能优异的数据库,甚至在竞标中击败了 IBM。他们的老板信奉精英主义,团队成员不写代码注释,也不设专职测试人员,却仍能保证出色的代码质量。能够加入这个团队的无疑都是顶尖人才。

然而,开发业务系统和开发单一功能的中间件是不同的。业务系统也许技术难度低,但通常庞大且需求多变,中间需要大量的沟通和协作。若开发人员花费过多时间在验证 Bug 或者配合联调上,会非常浪费时间。因此,在开发业务系统时,应该合理配置测试人员,以确保项目质量和开发效率。

多少测试人员才合适

现在我们知道,对于某些项目来说,专职的测试人员是必需的。那么,回到最初的问题,究竟需要多少测试人员才合适呢?这还要从测试的金字塔模型说起。

test model

传统的人工测试方式往往需要测试人员不断进行回归测试。为了确保系统的稳定性,测试人员需要对系统细节有非常深的了解,有时甚至针对一个小改动需要重复运行许多业务流程。这对于一些功能耦合度高的大型系统来说,非常耗费人力资源。而且,即使如此,也可能会发生漏测情况,因为很多边界情况的人工模拟成本非常高。因此,人工测试不仅成本高,效率也低。

测试金字塔模型根据测试工作的成本和效率进行了分层,自下而上分别是单元测试、集成测试和端到端测试:

  • 单元测试:单元测试针对代码的最小可测试部分,如函数、方法或类。它们通常由开发人员编写,并在代码变更时快速运行,以确保每个单元独立地工作正常。单元测试运行速度快、覆盖面广,维护成本低。在金字塔的最底层,数量最多。我们前面提到的第一种Bug,大多数都可以在这一层被发现。
  • 集成测试:集成测试用于验证多个单元模块之间的交互,包括数据库、外部服务和其他依赖。此类测试确保不同组件协同工作时能正确执行。在金字塔的中间层,数量居中,成本居中,效率居中。我们前面提到的第一种Bug基本到这一层都可以被发现,同时也可以发现相当一部分的第二种Bug。
  • 端到端测试:端到端测试模拟用户操作,往往对完整的用户故事进行测试,确保系统在实际使用中的行为与预期一致。端到端测试时间最长,成本最高,在金字塔的最上层,数量最少。很多第二类Bug只能在这一层发现。

显然,单元测试和集成测试是非常容易自动化的,应该由开发人员编写。通过这两层测试已经可以修正相当一部分的 Bug。大部分团队已将编写这两种测试作为开发人员工作的一部分。

端到端的自动化测试往往需要借助 Selenium、Playwright 等自动化测试框架,要求测试人员具备一定的编码能力。虽然很多团队仍采用人工测试,但越来越多的公司,特别是头部大公司,已经实现了自动化的端到端测试。而且随着自动化端到端测试的普及,大家发现,既然都写代码,为什么还要分业务代码和测试代码,将开发团队再分为开发人员和测试人员的做法正在变得不再有意义。例如,微软的很多团队已经将开发工程师和测试工程师合并,每个开发人员负责自己全部的自动化测试。

有些团队认为编写自动化测试代码需要额外的时间,只要开发人员在编码时进行了手动测试,也可以保证质量。这其实是一个误区。软件的可维护性也是软件质量的重要属性之一。自动化测试不仅可以保证软件的长期可持续维护,还能确保后续变更的快速响应和质量。每次变更后的手动测试既难以保证质量,又是对人力资源的浪费。

总结

所以,我们可以看到,测试人员的数量不仅与项目类型有关,也与开发团队的自动化能力密切相关。很多项目中,开发人员和测试人员之间按二比一或三比一的比例分配,其实是一种无奈的经验办法。

将大部分测试工作通过自动化的单元测试和集成测试来实现,同时保留少量的人工端对端测试,是目前大多数团队的最佳实践。对于甲方来说,根据自己的项目情况,合理地投入适当的测试工时费用是必要的。对于长期项目,更应该避免依赖纯人工的测试工时,尽量提高自动化测试的比例,以确保项目的质量和可维护性。

总之,通过优化测试策略,提升自动化测试的覆盖率,不仅能提高测试效率,还能显著降低测试成本,从而保证软件质量的一致性和持久性。