Django py.test在真实数据库上运行?

时间:2016-05-29 07:46:34

标签: python django pytest

py.test建立一个测试数据库。

我想使用settings.py文件中设置的真实数据库 (因为我已经在有测试数据的测试机上)

有可能吗?

3 个答案:

答案 0 :(得分:3)

我认为Ederson Badeca是对的,你不应该将project_db用作test_db。相反,我建议在数据库设置上创建当前project_db的副本,然后针对它运行测试。在django测试中,您需要创建自定义测试运行器才能这样做。但是在py.test中有一个名为db的夹具,它可以完成所有数据库设置/拆除逻辑。因此,您需要创建可以执行所需操作的自定义数据库夹具。这是默认数据库夹具的来源 https://github.com/pytest-dev/pytest-django/blob/master/pytest_django/db_reuse.py

P.S。如果您仍想在project_db上运行测试。

我只在django默认测试中使用自定义runner bellow(django 1.6版,未在其他版本中测试过)完成此操作

# coding: utf-8

from __future__ import unicode_literals, absolute_import

from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.core.management import call_command
from django.db import connection
from django.test.runner import DiscoverRunner, setup_databases
from django.test.testcases import connections_support_transactions

# configure(default_settings=settings, 
settings.DEBUG = True
settings.TEMPLATE_DEBUG = True


class KeepDatabaseTestRunner(DiscoverRunner):
    """
    Skips creating test database and uses default database for tests.
    """

    def setup_databases(self, **kwargs):
        """Setups databases to run and migrate on settings.DATABASES['default']['TEST']['NAME']"""
        old_name = settings.DATABASES['default']['NAME']
        try:
            test_name = settings.DATABASES['default']['TEST']['NAME']
        except KeyError:
            raise ImproperlyConfigured("TEST NAME is not defined in settings.DATABASES['default']")
        connection.settings_dict["NAME"] = test_name
        connection.settings_dict['SUPPORTS_TRANSACTIONS'] = connections_support_transactions()
        call_command('syncdb')
        call_command('migrate')
        return [connection, old_name, False], []

    def teardown_databases(self, old_config, **kwargs):
        """Will not do anything"""
        pass

<强>更新

好的,这是你如何做到这一点的基本想法。首先,您必须完全重载默认db fixiture。您要查找的代码行是https://github.com/pytest-dev/pytest-django/blob/master/pytest_django/fixtures.py#L39。这是py.test在test_db名称中分配_get_test_db_name的地方。所以基本上你需要创建自定义_get_test_db_name,在其中你应该提供你的project_db的路径。此后,您还必须在运行测试时使用--reuse-db

P.S。您还可以使用project_db的转储填充test_db,然后使用--reuse-db运行测试,py.test将针对test_db中最近的project_db版本运行测试。

答案 1 :(得分:0)

是的,你可以覆盖setUp上的设置  为测试设置真正的数据库并加载你的数据库夹具..但我认为,这不是一个好的实践,因为你想运行你的测试而不修改你的&#34;真正的&#34; app env。

你应该试试pytest-django。

使用此lib,您可以重用,创建删除数据库测试。

答案 2 :(得分:0)

here中记录了使用现有外部数据库的信息,尽管我同意Ederson的观点:使用固定装置是一种更好的做法,这样您的测试就可以在包括生产在内的所有环境中运行。