如何在Django中用SQLite运行pytest测试(规避PlanetScale付费升级)
问题描述
个人开发实验室管理软件(Django后端),默认使用PlanetScale的MySQL数据库,但免费版无法创建测试库,因此希望改用SQLite运行pytest测试。通过Dockerfile执行pytest时,所有测试报错,系统仍尝试访问MySQL,提示“create database is not supported”。
解决方案
方案1:动态切换数据库配置(推荐)
修改settings.py,根据运行环境自动切换测试用的SQLite数据库:
import os import sys # 生产/开发环境的PlanetScale配置 DATABASES = { 'default': { 'ENGINE': 'django_psdb_engine', 'NAME': os.getenv('DB_NAME'), 'HOST': os.getenv('DB_HOST'), 'PORT': os.getenv('DB_PORT'), 'USER': os.getenv('DB_USER'), 'PASSWORD': os.getenv('DB_PASSWORD'), 'OPTIONS': { 'ssl': {'ca': os.getenv('MYSQL_ATTR_SSL_CA')}, 'charset': 'utf8mb4', }, } } # 检测测试环境,切换为SQLite # 当执行pytest时,sys.argv会包含'test';或者通过环境变量强制切换 if 'test' in sys.argv or os.getenv('TEST_ENV') == 'true': DATABASES['default'] = { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:', # 内存数据库,测试速度更快 }
方案2:通过Docker环境变量触发切换
修改Dockerfile,在运行pytest时设置测试环境变量,确保settings切换到SQLite:
FROM python:3.11-alpine ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /code COPY requirements.txt /code/ RUN apk update \ && apk add --virtual build-deps gcc python3-dev musl-dev \ && apk add --no-cache mariadb-dev RUN pip install -r requirements.txt RUN apk del build-deps COPY . /code/ # 设置TEST_ENV=true,触发settings里的数据库切换 RUN TEST_ENV=true pytest -v
方案3:使用测试专用的settings文件
创建settings_test.py,专门用于测试环境:
# 导入基础配置 from api.settings import * # 覆盖数据库配置为SQLite DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:', } }
然后修改pytest.ini,指定测试用的settings:
DJANGO_SETTINGS_MODULE = api.settings_test python_files = tests.py test_*.py *_tests.py addopts = --nomigrations --cov=. --cov-report=html
修改完成后直接运行pytest -v即可,无需额外环境变量。
验证修改
重新构建Docker镜像并运行测试,此时系统会使用SQLite内存数据库,不再尝试连接PlanetScale的MySQL,测试可正常执行。
内容的提问来源于stack exchange,提问作者Desmond Gilmour
相关产品推荐
相关产品推荐

