「数据库」没经过这些测试,你的微服务架构也敢进入生产环境?


微服务架构是指将应用程序拆分为一系列较小、且直接用于解决具体问题的组件的实践方案 。 以此为基础 , 架构中的每一个组件都将通过各类常规协议(例如 HTTP 或者更轻量化的 TCP)相互通信 。 说到这里 , 大家可能会好奇 , 对于微服务架构来说 , 测试真的很重要吗?
答案当然是重要!测试的重要性是体现在多方面的 , 不过比较重要的是以下几点:

  • 节约金钱与时间
  • 更安全
  • 强化生产质量(减少 bug 与错误数量)
  • 提升客户满意度
  • 最重要的是 , 夜里能睡得更安稳
【「数据库」没经过这些测试,你的微服务架构也敢进入生产环境?】随时出 Bug、动不动就宕机的应用程序 , 没人会喜欢 , 而且往往这种应用程序的安全漏洞很多 , 如果黑客想从中窃取凭证或者抢劫资金 , 简直易如反掌 。 如果我们想要开发一款具备一定复杂性的应用程序 , 那么测试是一定需要的 。
使用什么测试方法? 目前软件测试的种类比较多 , 大致可以分为功能测试和非功能测试两大类 。 其中功能测试类包括单元测试、集成测试、通烟测试、回归测试、健全测试、Beta/ 验收测试和端到端(e2e)测试 , 而非功能测试则包括了性能测试、负载测试、压力测试、安全测试、合规测试和可用性测试 。
一般来说 , 应用程序的复杂度越高 , 需要使用的测试类型也就越多 。 不过 , 有几个测试是所有应用程序都不可或缺的:
  • 单元测试
  • 集成测试
  • E2E 测试、回归测试与安全测试相结合
整体流程应该是 , 先编写程序来检查应用中各个层面是否在按照预期设计运作 , 若应用已经上线 , 那么就需要进一步编写测试来检查代码更新是否会对原有功能造成破坏 。 如果是微服务架构 , 那么除了以上的基础测试之外 , 可能还需要编写专门的测试 , 例如负载测试 , 用于检查系统在正常与预期峰值负载条件下的运行状况 。
少说话 , 多编码 接下来 , 我们一起探讨一下如何在微服务架构当中实现上述基础软件测试类型 。 微服务架构使用 TCP 协议实现组件间的通信 , 并利用 Nest Framework 以 Node.JS 编写而成 。
很多人可能不太了解 NestJS , 我们先简单介绍一下 , 官方 GitHub repo 是这样描述 Nest 的:
Nest 是一款框架 , 用于构建高效且可扩展的 Node.js 服务器端应用程序 。 它利用现代 JavaScript 的特性 , 由 TypeScript 构建而成(保留纯 JavaScript 兼容性) , 同时结合有 OOP(面向对象编程)、FP(函数编程)以及 FRP(函数响应式编程)的元素 。 从底层来看 , Nest 不仅能够使用 Express , 同时也兼容其他多种库 , 包括 Fastify , 旨在轻松使用大量现有第三方插件 。 ”
在示例中 , 我们将使用一个简单的模块 name:user 配合一个简单函数 createUser , 在数据库内创建一个新用户 。
该模块的文件夹结构如下所示:
「数据库」没经过这些测试,你的微服务架构也敢进入生产环境?
本文插图

我们设了一个监听 create_user 消息的控制器 。 在利用 ValidationPipe 进行验证之后 , 它会在服务之内调用一个具有相同名称的函数 。
「数据库」没经过这些测试,你的微服务架构也敢进入生产环境?
本文插图

「数据库」没经过这些测试,你的微服务架构也敢进入生产环境?
本文插图

在服务之内 , 我们会对用户密码进行哈希处理 。 接下来 , 使用 TypeORM 将新用户保存在数据库内 。
「数据库」没经过这些测试,你的微服务架构也敢进入生产环境?
本文插图

对这个模块 , 我们使用 TypeORM 作为链接至表 User 的 ORM;同时 , 利用名为 UtilsModule 的另一个模块实现某些辅助功能:


推荐阅读