使用pytest-django的自定义测试套件运行器

时间:2014-12-03 20:14:01

标签: python django pytest

我想切换我的Django(版本1.6x)应用程序以使用pytest-django进行测试。 因此我通过pip安装了最新的pytest-django并获得了这些版本:

pytest==2.6.4
pytest-django==2.7.0

使用常规django测试,我正在使用扩展DjangoTestSuiteRunner的自定义测试套件运行器,我在settings.py中配置:

settings.py:

TEST_RUNNER = "dcmanager.tests.runner.ManagedModelTestRunner"

runner.py:

import unittest

from django.conf import settings
from django.db.models import get_app, get_apps
from django.test.simple import DjangoTestSuiteRunner, build_test, build_suite, runner


class ManagedModelTestRunner(DjangoTestSuiteRunner):
    """
    Test runner that automatically makes all unmanaged models in
    project managed for the duration of the test run and patches VStorage model,
    so that one doesn't need to execute the SQL manually to create them.
    """
    IGNORE_TESTS = ['django', 'rest_framework', 'rest_framework_swagger']

    def build_suite(self, test_labels, extra_tests=None, **kwargs):
        suite = unittest.TestSuite()

        if test_labels:
            for label in test_labels:
                if '.' in label:
                    suite.addTest(build_test(label))
                else:
                    app = get_app(label)
                    suite.addTest(build_suite(app))
        else:
            ignore_list = []
            for app in get_apps():
                app_name_parts = app.__name__.split('.')
                for index, _ in enumerate(app_name_parts):
                    app_part_name = '.'.join(app_name_parts[0:index])
                    if app_part_name and app_part_name in self.IGNORE_TESTS:
                        ignore_list.append(app.__name__)
                        break
                if app.__name__ not in ignore_list:
                    suite.addTest(build_suite(app))

        if extra_tests:
            for test in extra_tests:
                suite.addTest(test)

        return runner.reorder_suite(suite, (unittest.TestCase,))

    def setup_test_environment(self, *args, **kwargs):
        if settings.STAGE == 'TEST':
            from django.db.models.loading import get_models
            self.unmanaged_models = [m for m in get_models()
                                     if not m._meta.managed]
            for m in self.unmanaged_models:
                m._meta.managed = True

        super(ManagedModelTestRunner, self).setup_test_environment(*args,
                                                                   **kwargs)

    def teardown_test_environment(self, *args, **kwargs):
        super(ManagedModelTestRunner, self).teardown_test_environment(*args,
                                                                      **kwargs)
        # reset unmanaged models
        for m in self.unmanaged_models:
            m._meta.managed = False

如何告诉pytest-django使用我的自定义测试套件转轮?

2 个答案:

答案 0 :(得分:2)

py.test根本不使用单元测试运行器

我担心你必须在py.test

中重做自定义集合

答案 1 :(得分:0)

正如罗尼(Ronny)所述,py.test没有跑步者,但是您可以通过在测试套件中使用conftest.py文件中的各种内容来获得相同的功能。

对于数据库设置,您可以使用django_db_setup固定装置:https://pytest-django.readthedocs.io/en/latest/database.html#django-db-setup

对于更一般的东西,您可以在conftest中使用函数pytest_configure

conftest.py

@pytest.fixture
def django_db_setup():
    # db setup

def pytest_configure(config):
    # other pytest stuff