测试与验证
测试报告是绿的、覆盖率达标、压测曲线平稳,这些都是测量结果,而测量本身会出错。这个专题不讲某个测试工具怎么用,讲的是这些数字在什么情况下不代表它们看起来代表的意思:没有检查结果的覆盖率、被重跑掩盖的失败、自动减压的压测,以及压测流量泄漏到正式数据里。
文章
01覆盖率 100%,一个断言都没有同一个函数的三套测试覆盖率都是 100%,变异测试分别杀死 17 个变异体中的 2、14、16 个;等价变异体,以及不在分母里的未实现需求→02判题结果对哪一组输入有效结果绑定候选与判据的摘要;墙钟、CPU、地址空间与输出限制各挡什么,同样的 -9 分不清是哪个限制→03从行为到场景到断言四种断言的失败信息、分组断言、参数化显示名;重构后测行为的测试通过、校验调用次数的失败;准备数据分三类→04替身证明了什么any() 让缺陷通过、严格桩暴露参数错误;内存替身不守仓储契约;录制响应是证据不是契约→05Spring 测试事务的失真同一组断言:测试事务里唯一约束不报错、懒加载读得到,通知不发、其他线程看不到;REQUIRES_NEW 写入残留;替换 Bean 新建上下文→06这个风险该由哪一层测试发现先列风险,在包含必要真实组件的最低一层发现它;单接口与跨步骤状态;每个替身让哪些风险不可见→07拆分测试时覆盖责任去了哪里用桩的规则测试发现不了接线缺陷、变异检验、名不副实的测试、动态测试共享 @BeforeEach→08TDD 的三步各防什么红:因为正确的原因失败;绿:最小通过,用新例子迫使实现通用;重构:在测试保护下保持行为→09用 requests 写接口测试自己拼查询串被 & 拆错、data 与 json、默认无超时、500 不抛异常、Session 的 Cookie 与连接复用→10测试 WebSocket 接口推送与乱序响应下按 id 匹配、recv 没有超时、握手鉴权、关闭码与连接清理→11重跑一次就过了,这个缺陷去哪了失败重跑让构建成功而缺陷还在;每次 30% 概率失败的缺陷重跑 2 次后只有 2.6% 的构建拦得住;偶发失败的三种来源与 failOnFlakeCount→12单独跑能过,一起跑就红固定数据相撞、整表断言、跨测试清理与前次残留;运行标识、事务回滚和每进程一个数据库的隔离范围→13固定 10 个并发压测,服务卡了 2 秒,报告里只有 10 个慢请求闭合模型在服务变慢时自动减压,p99 是 11 毫秒;开放模型下是 1.9 秒;计时起点、发压方瓶颈与目标速率的来源→14压测流量的标记,过了线程池就没了ThreadLocal 标记在线程池、异步回调、定时任务与消息边界上丢失,InheritableThreadLocal 把正常订单写进影子表;包装任务、ScopedValue 与拒绝无标记写入→
相关专题
- 关注点分离与可测试性 — 代码怎样拆,测试才不需要启动整个世界
- 线程池参数怎么定 — 压测找拐点之前,先知道线程池和下游容量各是多少
- 可观测性 — 压测与线上都要回答的问题:延迟分布怎么看