【问题标题】:Run Unittest On Main Django Database在主 Django 数据库上运行单元测试
【发布时间】:2013-12-17 16:53:34
【问题描述】:

我正在寻找一种在 django 测试期间运行完整 celery 设置的方法,在 other SO question 中询问

经过考虑,我想我可以满足于运行一个单元测试(它更像是一个集成测试),在其中我针对主 Django(开发)数据库运行测试脚本。有没有办法编写单元测试,用鼻子运行它们并针对主数据库这样做?我想这将是告诉 Nose(或任何其他框架)有关 django 设置的问题。

我查看了django-nose,但无法找到一种方法来告诉它使用主数据库而不是测试数据库。

【问题讨论】:

    标签: python django testing celery nose


    【解决方案1】:

    我不知道鼻子,但这里是如何使用 django (1.6) 单元测试运行现有数据库。

    from django.test.runner import DiscoverRunner
    from django.db import transaction
    
    class ExistingDBTestRunner(DiscoverRunner):
    
        def run_tests(self, test_labels, extra_tests=None, **kwargs):
            self.setup_test_environment()
            suite = self.build_suite(test_labels, extra_tests)
            #old_config = self.setup_databases()
            result = self.run_suite(suite)
            #self.teardown_databases(old_config)
            self.teardown_test_environment()
            return self.suite_result(suite, result)
    

    然后在settings.py中

    if 'test' in sys.argv:
         TEST_RUNNER = '<?>.ExistingDBTestRunner'
         # alternative db settings?
    

    在旧版本的 django 中会有所不同。此外,您可能需要在测试用例中覆盖 _fixture_setup 和 _fixture_teardown 才能通过。

    上面的代码将连接到一个预先存在的数据库,但由于每个测试都包装在一个事务中,因此其他连接(如 celery worker)将无法使用这些更改。禁用事务的最简单方法是从unittest.TestCase 继承而不是django.test.TestCase

    【讨论】:

    • 约书亚,谢谢,这是一个好的开始。两个问题。首先,我会将测试运行程序代码放到哪里。使用 Django 1.5.1。有什么办法让它工作吗? pypi.python.org/pypi/django-discover-runner 似乎可能会有所帮助,但我现在并不想改变我所有测试的运行方式,或者至少尽量减少重新编写旧测试的必要性,不确定这是否是一个公平的假设。
    • 在 Django 1.5 子类 'django.test.simple.DjangoTestSuiteRunner' 中,基本上做同样的事情(删除测试数据库的设置和拆卸)。您也可能无法依赖保存点回滚,因为 django 直到 1.6 才真正做到这一点。
    • 如您所说,集成现有测试将很困难。您可以编写一个新的测试套件作为管理命令。看看这个答案:stackoverflow.com/a/1648881/426600
    • 如此接近!我尝试通过安装 django-discover-runner 并用前者提供的替换 django 1.6 DiscoverRunner 来实现它。虽然它运行顺利,但它似乎并没有写入主数据库。如果我在测试中创建一个对象,放入 pdb,然后从另一个 python shell 尝试检索它,它无处可寻。有什么想法吗?
    • 我猜这是因为没有提交事务。你在使用 TransactionMiddleware 吗?
    【解决方案2】:

    你看过django-nose吗?看来这将是适合这项工作的工具。

    【讨论】:

    • 对,我看过了。你知道让 django-nose 使用主数据库而不是创建测试数据库的方法吗?
    • 看看 django_nose/runner.py 因为有一种方法可以在每次运行时不创建数据库。也许您可以在 _get_test_db_name() 函数中连接真实的数据库名称并使用 REUSE_DB 环境变量?
    猜你喜欢
    • 2010-12-11
    • 2020-07-02
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2020-08-19
    • 2011-08-20
    相关资源
    最近更新 更多