关于质量保证的探讨
什么是质量?
系统质量,首先保证系统的正常运行,包括功能正确、系统稳定性。其次,要保证系统的健壮性,包括系统的容错能力、报警能力、自恢复能力。还要保证系统的可维护性和可扩展性,包括系统功能增加/修改的难易程度、系统横向扩展的能力。
我们主要关注哪些点?
- 保证正确的业务逻辑
任意一个功能都是符合业务预期的,覆盖业务所需要的所有场景。
- 保证可维护性
考虑功能规划,确保在之后的新业务需求开发时,能流程地接入系统,而不是做trick兼容。
新老功能的替换时,确保在数据转换上的可实施。
在新老功能替换时,确保平滑迁移。
- 保证容错性(健壮性)
确保程序有充分的错误处理机制,不会出现程序崩溃宕机的情况。
确保有明确的监控指标和告警措施,能在程序出现问题时第一时间感知。
确保有明确的应急方案,例如流量切换,降级、熔断,feature toggle等方案
- 保证可扩展性
程序的设计尽量是无状态的,可以水平扩展的。
如果无法做到无状态,就要做到分治,最终达到可以无限扩展的能力。
- 保证性能
选择合适的处理流程,能够异步处理的尽量异步,尽量保证主流程上没有较大的阻塞操作。
尽量保证程序逻辑层面的不冗余,再保证代码结构设计层面的性能优化。
由于数据库往往是最终瓶颈,因此要始终保持sql的高效,主要是 分页、批量、索引、独立 几个方式。
- 安全性?
如何保证:
- 代码规范(命令规范、职责单一、分层清晰等)
- 写代码时的高标准(设计模式、面向对象、依赖注入、结构清晰)
- 复杂问题的方案设计与review
- 代码质量保证工具(如sonar、go vet)
- 测试(单元测试、接口测试、集成测试、e2e测试、性能测试)
- 不断重构(小步持续性重构)
如何执行:
- [代码规范] => 有规范、有review
- [高要求] => 梳理流程、整理文档、先设计再执行、拉人探讨
- [方案设计与review] => 有文档、有review流程
- [代码质量工具] => CI/CD 步骤
- [不断重构] => 每个月自查代码问题
- [测试] => 见下方
单元测试的要求
- 所有库方法,必须有正确性单元测试用例。
- 复杂的库方法,需要有多种边界情况测试用例。
- 单元测试用例管理直接在当前模块下的 xxx_test.go 文件中。
接口测试要求
目的:保证单个接口的输入输出的正确性
主要内容: 1. 输入值的边界参数传入。 2. 确保输出值的schema。
集成测试要求
目的:从用户行为的角度,保证功能的正确性。
主要内容:
- 从场景出发,进行数据准备。
- 实际测试,对返回值进行断言。
e2e测试要求
- 重要流程的场景测试,例如,登录、注册、创建team、创建project、打开文档等。
- 可以考虑基于图片对比的测试。(视觉感知测试)
性能测试要求
- 单服务性能测试
- 将所有服务拆分,对其进行性能测试。
- 将服务的依赖项进行拆分,mock。
- 集成服务性能测试
- 全链路数据压测,数据准备与压测。
- 数据来源可采用流量录制。
- 数据库性能测试
- 对业务场景进行数据库操作过程排查
- 对单个sql语句进行查询分析
计划
服务质量的保证主要应当从
- 团队开发人员意识培养
- 团队质量保证规范与流程
- 测试
这三个方面入手。
我当前从 测试 入手,主要有以下几个方面的内容:
完成 api 接口测试框架搭建与开发
super-test 项目,目标是让团队成员写 接口测试
的难度降低,现在已经做到:
- 使用 json 配置文件进行测试
- 具有简单的测试触发页面
考虑 websocket 的功能测试
[TODO]
考虑 性能测试 框架
- 项目性能
- 中间件性能
- 数据库性能
文档直通车:
质量保证梳理
A man’s growth is seen in the successive choirs of his friends
— Ralph Waldo Emerson
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!