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

在Django中用Pytest写测试用例时,如何加载指定目录下所有JSON Fixture

解决Django pytest自动加载目录下所有Fixture的问题

为什么直接用通配符无效?

Django的loaddata命令不会解析shell风格的通配符(比如*.json),它会把带通配符的字符串当作完整的文件名去查找,自然找不到对应的文件,所以手动逐个指定路径能生效,但通配符不行。

解决方案

方案1:用Python的glob/pathlib动态获取所有Fixture路径

这是最直接的方法,通过Python内置的文件匹配工具获取目标目录下所有JSON文件的路径,再传给loaddata:

使用glob模块:

import glob
import os
from django.core.management import call_command
import pytest

@pytest.fixture(scope='session')
def load_admin_data(django_db_setup, django_db_blocker):
    # 构建Fixture目录的绝对路径,根据你的项目结构调整
    fixture_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'fixtures_for_tests', 'admin')
    # 匹配目录下所有JSON文件
    fixtures = glob.glob(os.path.join(fixture_dir, '*.json'))
    
    with django_db_blocker.unblock():
        call_command('loaddata', *fixtures)

使用pathlib(更简洁的路径处理):

from pathlib import Path
from django.core.management import call_command
import pytest

@pytest.fixture(scope='session')
def load_admin_data(django_db_setup, django_db_blocker):
    # 基于当前文件路径定位Fixture目录
    fixture_dir = Path(__file__).parent / 'fixtures_for_tests' / 'admin'
    # 获取所有JSON文件的路径列表
    fixtures = list(fixture_dir.glob('*.json'))
    
    with django_db_blocker.unblock():
        call_command('loaddata', *fixtures)

方案2:利用Django的Fixture目录配置加载整个目录

Django允许将Fixture目录添加到FIXTURE_DIRS设置中,之后loaddata可以直接加载整个目录下的所有Fixture:

  1. 修改测试环境的settings(比如tests/settings.py):
from your_project.settings import *

# 将Fixture根目录加入配置
FIXTURE_DIRS += [BASE_DIR / 'fixtures_for_tests']
  1. 在pytest fixture中直接加载目录:
from django.core.management import call_command
import pytest

@pytest.fixture(scope='session')
def load_admin_data(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        # 直接指定admin子目录(因为fixtures_for_tests在FIXTURE_DIRS中)
        call_command('loaddata', 'admin')

也可以直接传入目录的绝对路径,无需修改FIXTURE_DIRS:

call_command('loaddata', '/absolute/path/to/fixtures_for_tests/admin')

注意事项

  • 确保路径正确:无论是用glob还是直接指定目录,都要保证路径指向正确的Fixture目录,避免因相对路径导致文件找不到。
  • 加载顺序:如果Fixture之间有依赖关系,glob/pathlib的文件顺序可能是按文件名排序的,若需要特定加载顺序,可能需要手动调整列表顺序,或者给文件名加前缀(比如01_data.json、02_data.json)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:40:34