Django使用--parallel参数并行测试时能否仅使用1个数据库?
Django 并行测试复用同一数据库相关问题解答
能否仅使用同一个数据库运行 --parallel 并行测试
技术层面可以通过自定义测试数据库配置、修改测试路由规则强制所有并行进程指向同一个测试库,但Django原生没有提供支持该场景的官方配置,需要自行修改测试逻辑实现,同时要额外处理多进程同时操作数据库的冲突问题。
该做法属于明确的不良实践,核心原因如下:
- 测试结果不可复现:并行运行的测试用例如果同时对同一张表做增删改查操作,会出现严重的数据竞态问题:比如A用例刚插入待校验的测试数据,就被B用例的清理逻辑删除,或者多个用例同时插入同主键数据引发报错,最终会出现大量随机失败的测试用例,排查定位成本极高。
- 数据库层面冲突频发:Django默认使用事务回滚的方式清理单条测试的运行数据,多个进程同时对同一份数据开启事务操作时,极易触发死锁、事务回滚失败、数据库连接被强制断开等问题,甚至会损坏测试库的基础表结构。
- 完全丧失并行测试的优势:如果要规避上述问题,需要给所有测试的数据库操作加全局分布式锁,最终测试运行速度反而远低于单线程测试,完全违背了使用
--parallel参数提升测试效率的初衷。
内容的提问来源于stack exchange,提问作者Martin Faucheux
相关产品推荐
相关产品推荐

