使用Pytest时将主数据库更改为Test

问题描述 投票:0回答:1

帮我解决问题

这是我的设置.py:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": ENV.MYSQL_DSN.path.lstrip("/"),
        "USER": ENV.MYSQL_DSN.user,
        "PASSWORD": ENV.MYSQL_DSN.password,
        "HOST": ENV.MYSQL_DSN.host,
        "PORT": ENV.MYSQL_DSN.port,
    },
    'test': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'test_db',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

这是我的test_api.py:

import json

import pytest
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APIClient


@pytest.fixture
def api_client():
    return APIClient()


def test_proxys(api_client):
    url = reverse("gelet")
    response = api_client.get(url)

    assert response.status_code == status.HTTP_200_OK
    assert response["Content-Type"] == "text/html; charset=utf-8"
    assert b"<html>" in response.content


@pytest.mark.django_db
def test_generate_report(api_client):
    url = reverse("generate_report")
    data = {
        "dates": "01/01/2021 - 03/01/2021",
        "ip": "127.0.0.1",
    }
    response = api_client.post(
        url,
        data=json.dumps(data),
        content_type="application/json",
    )

    assert response.status_code == status.HTTP_200_OK
    assert response.json() == {"status": "started"}

如何强制自动测试使用测试数据库测试? 对我来说,了解哪种方法有效很重要。请指教一下。

例如,如果有单独创建 Postgres 数据库的选项,这也是一个合适的选项

我尝试通过直接在程序代码中创建来使用sqlite3,但有些东西没有成功

import sqlite3


def run_sql(sql):
    conn = sqlite3.connect(':memory:')
    cur = conn.cursor()
    cur.executescript(sql)
    conn.commit()
    conn.close()


@pytest.fixture(scope='session')
def django_db_setup():
    run_sql('''
        CREATE TABLE IF NOT EXISTS my_table (
            id INTEGER PRIMARY KEY,
            name TEXT,
            age INTEGER
        )''')
    settings.DATABASES['default']['NAME'] = 'the_copied_db'
    settings.DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql'
    settings.DATABASES['default']['NAME'] = 'test_db'
    settings.DATABASES['default']['USER'] = 'username'
    settings.DATABASES['default']['PASSWORD'] = 'password'
    settings.DATABASES['default']['HOST'] = 'localhost'
    settings.DATABASES['default']['PORT'] = '5432'
    yield
python django pytest
1个回答
0
投票

通常,您要做的是创建一个额外的设置文件,例如

test_settings.py
,它会从
settings.py
文件重新导入所有项目,然后更改一些设置,例如:

# test_settings.py

from settings import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': ENV.MYSQL_DSN.path.lstrip('/'),
        'USER': ENV.MYSQL_DSN.user,
        'PASSWORD': ENV.MYSQL_DSN.password,
        'HOST': ENV.MYSQL_DSN.host,
        'PORT': ENV.MYSQL_DSN.port,
        'TEST': {
            'NAME': ENV.MYSQL_DSN.path.lstrip('/'),
        },
    }
}

然后您可以使用以下命令运行测试:

python manage.py test --settings=path.to.test_settings

话虽如此,当你的生产数据库是 MySQL 时,我发现在 PostgreSQL 数据库上运行测试有点奇怪。虽然 Django ORM 的目标是方言不变,但它并不完全如此,因此数据库技术可以对查询产生影响,因此使用不同的数据库对其进行测试可能会隐藏错误或引入不在生产中的错误。

© www.soinside.com 2019 - 2024. All rights reserved.