一只肥羊的思考

Go 语言项目测试最佳实践

自动化测试对于一个产品的快速迭代是非常关键的一环,这篇文章主要关注的就是有关自动化测试方面的一些最佳实践,已经在 Go 语言项目中有关测试代码上的一些具体的最佳实践。

测试包含哪几种

常见的测试类型主要包括

  • 单元测试
  • 集成测试
  • E2E 测试

几种,不同的测试具备不同的特质,也适用于不同的目的。

首先,「单元测试」根据定义指的是针对代码中的某个独立单元,(比如一个类,一个方法)的测试方法。可见这种测试的优势就在于

  • 编写简单
  • 定位错误精准

但是缺陷也显而易见

  • 测试范围有限

再看「集成测试」,集成测试要比单元测试的范围更大一点,一般涉及到多个模块之间的配合测试,自然而然,他的编写难度也要比单元测试难一些。但是他可以很好的快速发现多个模块单独测试没有问题,但是一起协同工作出现问题的场景。

另外 kubernetes 社区对于集成测试的约束也很有意思,他认为集成测试还应该满足所有测试需要的服务都应该在一台机器上启动。

最后「E2E 测试」,E2E 测试则更多的是模拟用户的行为对整个产品进行整体测试,比如开发一款 app,E2E 测试可能会模拟一个用户,注册,登录,点击产品等等一系列行为。所以这种测试方法的优势在于

  • 快速确认产品是否存在 bug,并且 bug 是真实用户会感知的

虽然能够确认有 bug ,但是由于 bug 可能是 E2E 测试中涉及到的多个组件中的任何一个,所以它的缺陷也很明显

  • 无法快速定位问题代码
  • 编写难度也是最大的

所以也正是基于上述不同测试的优缺点,Google 也总结出针对这几种测试的比例的最佳实践。

As a good first guess, Google often suggests a 70/20/10 split: 70% unit tests, 20% integration tests, and 10% end-to-end tests.

也就是说一个稳定的项目,它的单元测试,集成测试,E2E 测试的数量应该以 7:2:1 的比例分布,形成一个金字塔的形状,塔底是大量的单元测试,塔顶是少量的 E2E 测试。

下面我们也将通过单独的博文分别介绍,单元测试,集成测试,E2E 测试各自的最佳实践。