测试里怎么让数据库每个用例都是干净的?drop_all、TRUNCATE、事务回滚各有多快?应用代码里的 commit 会不会破坏回滚?这篇用真实的 PostgreSQL 与 pytest 把三种做法的隔离与耗时量出来。
不清理 1 failed, 1 passed in 0.09s 每个测试 drop_all + create_all 2 passed in 0.08s 每个测试之后 TRUNCATE 2 passed in 0.08s 外层事务 + 保存点,测试结束回滚 2 passed in 0.07s
上一篇:Fixture 与测试应用工厂;下一篇:测试 Session。
每个测试 drop_all + create_all 100 passed in 0.43s | 总耗时 0.77 秒 每个测试之后 TRUNCATE 100 passed in 0.35s | 总耗时 0.70 秒 外层事务 + 保存点回滚 100 passed in 0.25s | 总耗时 0.59 秒
测试里应用代码 commit 过之后,数据库里实际留下的行数: 0
数据库是自己起的 PostgreSQL(非默认端口)。