1. google 测试分层理论

谷歌三篇论文 Google File System、Google Bigtable、Google MapReduce 引领了大数据整个领域。
Google 软件测试之道 引领了软件测试行业。
测试金字塔,测试分层是这本书两个基本的理论(图片截取自书中):

书中大部分总结都来自谷歌在 2010 年前后谷歌的实践,参考https://testing.googleblog.com/
现在是 2020-07-12,云原生的基础设施和编排能力已经成为企业的标配,结合书中的理论,我们需要重新思考具体业务实践。

2. 单元测试依赖数据库

单元测试要尽量的减少依赖,其中包括对数据库的依赖。表 2.2 中小型测试中推荐使用 Mock 的方式来进行数据库相关的测试。
为什么要减少对外界的依赖?
因为依赖会带来:
依赖构建成本高,不确定性,不稳定性,耗时高等因素,这些因素对小型测试是有害的。

在微服务和代码结构分层的前提下(存储服务 || DAO 层),存储层代码如何进行单元测试呢?
他们通常采用内存数据库作为单元测试数据库,如:H2

步骤:

  <!-- h2测试库配置 -->
  <environment id="pre">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
      <property name="driver" value="org.h2.Driver"/>
      <property name="url" value="jdbc:h2:mem:test;INIT=runscript from nit.sql'\;"/>
      <property name="username" value=""/>
      <property name="password" value=""/>
      <property name="poolPingEnabled" value="true"/>
      <property name="poolPingQuery" value="SELECT 1+1"/>
      <property name="poolPingConnectionsNotUsedFor" value="0"/>
      <property name="poolMaximumActiveConnections" value="150"/>
      <property name="poolMaximumIdleConnections" value="150"/>
      <property name="poolMaximumCheckoutTime" value="20000"/>
      <property name="poolTimeToWait" value="20000"/>
    </dataSource>
  </environment>
</environments>

3. 云原生和 DevOps

这 10 年我们经历了什么?

我们有条件快速、低成本、便捷的构建环境

我们的方案:
抛弃内存数据库,单元测试直接依赖 MySQL、Redis 等数据基础设施
以依赖 MySQL 数据库的单元测试为例:

收益:

4. 思考

4.1 复杂度来源

程序要解决的是业务复杂度问题,微服务技术并没有降低业务复杂度,甚至因为微服务之间的依赖提高了复杂度。
真正的业务并不会像迭代 0 中代码编写的那样纯粹,按照文件夹区分单元测试、模块间测试、接口测试。复杂度使得我们在做金字塔底层测试时需要进行很多 Mock

过早进行集成测试测试的成本会很高

4.2 云原生体系下该如何做测试

本文不是挑战测试分层和测试金字塔理论,主要是通过在项目中的一些实践,引发一些思考,欢迎拍砖,一起讨论


↙↙↙阅读原文可查看相关链接,并与作者交流