我们所做的是覆盖默认的 test_runner,这样它就不会创建一个新的数据库来进行测试。这样,它就可以针对我们当前本地数据库的外观运行测试。但是,如果您使用此方法,请务必小心,因为您在测试中对数据所做的任何更改都将是永久性的。我确保我们所有的测试都将任何更改恢复到其原始状态,并将我们数据库的原始版本保存在服务器上并进行备份。
所以要做到这一点,你需要将 run_test 方法从 django.test.simple 复制到你项目中的一个位置——我把我的放在 myproject/test/test_runner.py
然后对该方法进行以下更改:
// change
old_name = settings.DATABASE_NAME
from django.db import connection
connection.creation.create_test_db(verbosity, autoclobber=not interactive)
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
connection.creation.destroy_test_db(old_name, verbosity)
// to:
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
确保在顶部进行所有必要的导入,然后在您的设置文件中设置设置:
TEST_RUNNER = 'myproject.test.test_runner.run_tests'
现在,当您运行 ./manage.py test 时,Django 将针对您的数据库的当前状态运行测试,而不是根据您当前的模型定义创建一个新版本。
您可以做的另一件事是在本地创建数据库的副本,然后检查新的 run_test() 方法,如下所示:
if settings.DATABASE_NAME != 'my_test_db':
sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME)
这样就没有针对您的主数据库运行测试的危险。