在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:
- 修改测试环境的settings(比如
tests/settings.py):
from your_project.settings import * # 将Fixture根目录加入配置 FIXTURE_DIRS += [BASE_DIR / 'fixtures_for_tests']
- 在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
相关产品推荐
相关产品推荐

