Python 在Django主数据库上运行Unittest

Python 在Django主数据库上运行Unittest,python,django,testing,celery,nose,Python,Django,Testing,Celery,Nose,我正在寻找一种在django测试期间运行完整芹菜设置的方法,这篇文章中问道 考虑过之后,我想我可以满足于运行一个单元测试(更像是一个集成测试),在这个测试中,我对主Django(开发)数据库运行测试脚本。有没有一种方法可以编写单元测试,用Nose运行它们,并对主数据库执行这些操作?我想这将是一个告诉Nose(或任何其他框架)django设置的问题 我已经查看了django nose,但是没有找到一种方法告诉它使用主数据库而不是测试数据库 你看过吗?它似乎是这项工作的合适工具。我不知道nose,但

我正在寻找一种在django测试期间运行完整芹菜设置的方法,这篇文章中问道

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


我已经查看了django nose,但是没有找到一种方法告诉它使用主数据库而不是测试数据库

你看过吗?它似乎是这项工作的合适工具。

我不知道nose,但下面是如何使用django(1.6)单元测试运行现有的db

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?
如果sys.argv中有“测试”:
TEST_RUNNER='.ExistingDBTestRunner'
#其他数据库设置?
在django的旧版本中会有一些不同。此外,您可能需要覆盖测试用例中的_fixture_setup和_fixture_teardown以通过测试


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

对,我已经看过了。您知道让django nose使用主数据库而不是创建测试数据库的方法吗?请查看django_nose/runner.py,因为有一种方法可以在每次运行时不创建数据库。也许您可以在_get_test_db_name()函数中连接真正的db名称,并使用重用_dbenv var?joshua,谢谢,这是一个好的开始。两个问题。首先,我将把测试运行程序代码放入何处。使用Django 1.5.1。有办法让它工作吗?看起来这可能会有所帮助,但我现在不想改变我所有测试的运行方式,或者至少减少重新编写旧测试的次数,不确定这是否是一个合理的假设。在Django 1.5子类“Django.test.simple.DjangoTestSuiteRunner”中,基本上做同样的事情(删除测试数据库的安装和拆卸)。您也可能无法依赖于保存点回滚,因为django在1.6之前并没有真正做到这一点。正如您所说,集成现有的测试将很困难。您可以编写一个新的测试套件作为管理命令。看看这个答案:如此接近!我尝试实现它,安装了django discover runner,并用前者提供的版本替换了django 1.6 DiscoverRunner。尽管它运行顺利,但似乎没有写入主数据库。如果我在测试中创建一个对象,放到pdb中,然后从另一个python shell中尝试检索它,那么就找不到它了。有什么想法吗?我猜这是因为没有提交事务。您正在使用TransactionMiddleware吗?