测试数据是测试里最容易写、也最容易让人读不懂和让测试变脆的部分。这篇把四种常见写法都跑了:依赖现在、依赖随机、依赖默认值、依赖大而全的数据,量出各自什么时候会坏、坏多少。
共 731 天
夹具 now().minusDays(30),断言“相差不到 1 个月”:失败 300 天;集中在 {MARCH=60, MAY=60, JULY=60, OCTOBER=60, DECEMBER=60};例如 [2024-03-01, 2024-03-02, 2024-03-03]
夹具 now().minusDays(1),断言“相差 1 个工作日”:失败 208 天;按星期 {SATURDAY=104, SUNDAY=104};例如 [2024-01-06, 2024-01-07, 2024-01-13]
同样两个测试改用固定日期 2025-04-16(星期三):失败 0 + 0 天种子 1..1000 各跑一次:失败 41 次(4.1%);前 5 个失败种子 [53, 57, 68, 72, 140] 记录下失败种子 53 后重放 10 次:失败 10 次(每次数量都是 97) 每个测试用全新随机种子,连续跑 1 次发现 bug 的概率 3.8%;连续跑 3 次发现 bug 的概率 10.8%;连续跑 10 次发现 bug 的概率 34.2%;连续跑 50 次发现 bug 的概率 87.8%;连续跑 100 次发现 bug 的概率 98.1%;
基线:A 失败 [],B 失败 [] 国内运费 1000 → 1200:A 失败 4 个 [A1, A2, A3, A6];B 失败 0 个 [] 默认国家 CN → DE:A 失败 4 个 [A1, A2, A3, A6];B 失败 0 个 [] 默认商品额 10000 → 12000:A 失败 5 个 [A1, A2, A3, A5, A6];B 失败 0 个 [] 默认等级 STANDARD → SILVER:A 失败 5 个 [A1, A3, A4, A5, A6];B 失败 1 个 [B3]
5000 个测试各构造一次(7 轮取中位数):重夹具每次 8.9 微秒(共 44 ms),轻夹具每次 0.01 微秒(共 0.0 ms),约 973 倍 按 2 万个测试估算:重夹具 178 ms,轻夹具 0 ms(只是对象构造,不含数据库或文件)