You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何通过python manage.py test --parallel并行运行测试?

Django test --parallel 并行测试的底层原理、生命周期及示例

底层实现原理

Django的并行测试依赖Python标准库的multiprocessing模块实现核心逻辑,核心思路是通过进程隔离避免测试间的副作用,具体细节如下:

  • 进程池调度:主进程会创建一个进程池,默认进程数等于CPU核心数,也可以通过--parallel N手动指定。每个子进程独立运行,互不干扰。
  • 测试用例分片:主进程先收集所有待运行的测试用例(包括各个app里的TestCase子类和测试方法),然后将这些用例均匀分配给每个子进程,确保负载均衡。
  • 独立测试数据库:每个子进程会创建属于自己的测试数据库,数据库名会带上唯一后缀(比如test_myapp_4567),彻底避免不同进程的测试数据互相污染。测试结束后,每个进程会自行销毁对应的数据库(除非用--keepdb参数保留)。
  • 环境完全隔离:每个子进程拥有独立的Python解释器实例,全局变量、模块状态等都不会在进程间共享,从根源上杜绝了测试用例之间的隐式依赖。

并行测试的生命周期

整个流程分为主进程和子进程两个维度:

主进程生命周期

  1. 解析命令行参数,确定并行进程数、目标测试范围等配置。
  2. 扫描所有app,收集全部测试用例并分组,每组分配给一个子进程。
  3. 启动进程池,将测试组分发到各个子进程。
  4. 等待所有子进程完成测试,收集并汇总各进程的测试结果(成功、失败、跳过的用例数)。
  5. 统一清理全局资源(如果有),输出最终测试报告。

子进程生命周期

  1. 接收主进程分配的测试用例组。
  2. 初始化Django测试环境:加载项目配置、创建专属测试数据库、执行数据库迁移。
  3. 依次运行分配的每个测试用例,记录每个用例的执行结果。
  4. 测试完成后,销毁自己的测试数据库(如果没指定--keepdb)。
  5. 将测试结果返回给主进程,然后退出。

示例说明

假设我们有一个books app,包含模型和视图的测试用例:

测试用例代码(books/tests.py)

from django.test import TestCase
from .models import Book

class BookModelTest(TestCase):
    def setUp(self):
        # 每个测试方法执行前初始化测试数据
        Book.objects.create(title="Django实战", author="张三")

    def test_book_author(self):
        book = Book.objects.get(title="Django实战")
        self.assertEqual(book.author, "张三")

class BookListViewTest(TestCase):
    def setUp(self):
        Book.objects.create(title="Python入门", author="李四")

    def test_list_view_status(self):
        response = self.client.get("/books/")
        self.assertEqual(response.status_code, 200)

    def test_list_view_content(self):
        response = self.client.get("/books/")
        self.assertContains(response, "Python入门")

运行并行测试

# 使用默认进程数(等于CPU核心数)运行所有测试
python manage.py test --parallel

# 指定3个进程,只运行books app的测试
python manage.py test books --parallel 3

# 保留测试数据库,加速后续测试
python manage.py test --parallel --keepdb

注意事项

  • 测试用例必须是无状态的,不能依赖其他测试用例的执行结果,也不能使用全局共享的可变资源(比如全局变量、未加锁的文件)。
  • 如果测试需要访问外部资源(比如Redis、文件系统),需要自己实现锁机制,避免进程间的资源竞争。
  • 不是所有测试都适合并行:比如涉及全局状态修改、需要严格执行顺序的测试,并行可能导致结果不稳定。

内容的提问来源于stack exchange,提问作者Abhinav Prakash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:17:24