微服务时代金字塔测试已经过时!


Martin Fowler的测试金字塔已经过时,在前端使用“Testing Trophy(测试奖杯)”;在后端使用Spotify工程模型中的“测试蜂窝testing honeycomb”。
您听到的有关软件测试的几乎所有建议都是不好的:它要么表面不好,要么导致糟糕的结果,要么因为专注于错误的事物(通常是工具)而分心。
人们喜欢辩论写测试中某种类型的的百分比,但这很分散注意力。几乎有没有团队能编写具有表现力的测试:这些测试能确定明确的界限,快速可靠地运行,并且仅出于有用的原因而失败。
 
金字塔测试
大多数人都熟悉著名的测试金字塔。

长期以来,这是组织测试的非常有效的方法。在微服务世界中,这可能是有害的。微服务中最大的复杂性不在于服务本身,而在于其与其他人的交互方式,这一点值得特别注意。
微服务中的单元测试unit test数量太多,这会限制微服务的“无需更改测试即可更改代码”的方式。由于必须更改测试,这对迭代的速度产生了负面影响。
  
后端的测试蜂窝testing honeycomb
在微服务体系结构中,对于每个微服务而言,拥有数量太多的单元测试并不是最佳选择。每个微服务都具有单个业务功能,而不是整个业务。这可能只是业务范围的一小部分,因此不值得为微服务编写太多的单元测试用例。构造我们的微服务测试的更好方法是通过测试蜂窝,如下图所示:

如上图所示,集成部分比其他部分更大,这意味着我们的主要重点将放在集成测试。
 
前端的测试奖杯Testing Trophy
Testing Trophy(测试奖杯)是一种从上到下的专业方法,用于测试Web应用程序。这是关于编写足够的测试-正确的测试。这不是要达到100%的覆盖率。
由Kent C. Dodds推出的测试奖杯在前端测试中越来越受欢迎。奖杯的顺序是:

  • -端到端测试
  • -集成测试
  • -单元测试
  • -静态测试


通过使用这种行之有效的测试方法,您将分层使用以下技术:
1. 静态测试:使用静态类型系统和linter捕获诸如拼写错误和语法之类的基本错误。
工具 :
  • 代码格式化程序,例如Prettier;
  • 像ESLint;
  • 类型检查器,例如TypeScript和Flow。

2.单元测试:编写针对应用程序的关键行为和功能的有效单元测试。单元测试可验证棘手的算法是否正常工作。
工具:Jest.
单元测试是测试单个代码单元,例如函数或React组件。您不需要浏览器或数据库即可运行单元测试,因此它们非常快速。
3.集成测试:集成测试使您确信应用程序的所有功能都能按预期运行。开发集成测试,以全面审核您的应用程序,并确保所有内容和谐地正常工作。
工具:Jest and Enzyme 或 react-testing-library.
集成测试可验证大型功能甚至整个页面,而无需任何后端,数据库或浏览器。
4.端到端测试:端到端测试可确保您的应用程序整体上正常工作:前端和后端以及数据库和其他所有内容。对关键路径进行自动点击测试,而不是依赖用户为您完成此操作。
工具:Cypress.
端到端测试主要对应于金字塔中的UI测试。
这四层自动化测试为您提供信心,快速,省钱地交付专业的JavaScript应用程序。