关于质量保证的探讨

什么是质量?

系统质量,首先保证系统的正常运行,包括功能正确、系统稳定性。其次,要保证系统的健壮性,包括系统的容错能力、报警能力、自恢复能力。还要保证系统的可维护性和可扩展性,包括系统功能增加/修改的难易程度、系统横向扩展的能力。

我们主要关注哪些点?

  1. 保证正确的业务逻辑

任意一个功能都是符合业务预期的,覆盖业务所需要的所有场景。

  1. 保证可维护性

考虑功能规划,确保在之后的新业务需求开发时,能流程地接入系统,而不是做trick兼容。

新老功能的替换时,确保在数据转换上的可实施。

在新老功能替换时,确保平滑迁移。

  1. 保证容错性(健壮性)

确保程序有充分的错误处理机制,不会出现程序崩溃宕机的情况。

确保有明确的监控指标和告警措施,能在程序出现问题时第一时间感知。

确保有明确的应急方案,例如流量切换,降级、熔断,feature toggle等方案

  1. 保证可扩展性

程序的设计尽量是无状态的,可以水平扩展的。

如果无法做到无状态,就要做到分治,最终达到可以无限扩展的能力。

  1. 保证性能

选择合适的处理流程,能够异步处理的尽量异步,尽量保证主流程上没有较大的阻塞操作。

尽量保证程序逻辑层面的不冗余,再保证代码结构设计层面的性能优化。

由于数据库往往是最终瓶颈,因此要始终保持sql的高效,主要是 分页、批量、索引、独立 几个方式。

  1. 安全性?

如何保证:

  1. 代码规范(命令规范、职责单一、分层清晰等)
  2. 写代码时的高标准(设计模式、面向对象、依赖注入、结构清晰)
  3. 复杂问题的方案设计与review
  4. 代码质量保证工具(如sonar、go vet)
  5. 测试(单元测试、接口测试、集成测试、e2e测试、性能测试)
  6. 不断重构(小步持续性重构)

如何执行:

  1. [代码规范] => 有规范、有review
  2. [高要求] => 梳理流程、整理文档、先设计再执行、拉人探讨
  3. [方案设计与review] => 有文档、有review流程
  4. [代码质量工具] => CI/CD 步骤
  5. [不断重构] => 每个月自查代码问题
  6. [测试] => 见下方

单元测试的要求

  1. 所有库方法,必须有正确性单元测试用例。
  2. 复杂的库方法,需要有多种边界情况测试用例。
  3. 单元测试用例管理直接在当前模块下的 xxx_test.go 文件中。

接口测试要求

目的:保证单个接口的输入输出的正确性

主要内容: 1. 输入值的边界参数传入。 2. 确保输出值的schema。

集成测试要求

目的:从用户行为的角度,保证功能的正确性。

主要内容:

  1. 从场景出发,进行数据准备。
  2. 实际测试,对返回值进行断言。

e2e测试要求

  1. 重要流程的场景测试,例如,登录、注册、创建team、创建project、打开文档等。
  2. 可以考虑基于图片对比的测试。(视觉感知测试)

性能测试要求

  1. 单服务性能测试
  • 将所有服务拆分,对其进行性能测试。
  • 将服务的依赖项进行拆分,mock。
  1. 集成服务性能测试
  • 全链路数据压测,数据准备与压测。
  • 数据来源可采用流量录制。
  1. 数据库性能测试
  • 对业务场景进行数据库操作过程排查
  • 对单个sql语句进行查询分析

计划

服务质量的保证主要应当从

  1. 团队开发人员意识培养
  2. 团队质量保证规范与流程
  3. 测试

这三个方面入手。

我当前从 测试 入手,主要有以下几个方面的内容:

完成 api 接口测试框架搭建与开发

super-test 项目,目标是让团队成员写 接口测试 的难度降低,现在已经做到:

  1. 使用 json 配置文件进行测试
  2. 具有简单的测试触发页面

考虑 websocket 的功能测试

[TODO]

考虑 性能测试 框架

  1. 项目性能
  2. 中间件性能
  3. 数据库性能

文档直通车:
质量保证梳理


A man’s growth is seen in the successive choirs of his friends
Ralph Waldo Emerson