Mik*_*zur 8 database django unit-testing
Django(1.2 beta)将在每个运行的测试之间重置数据库,这意味着每个测试都在空DB上运行.但是,数据库不会刷新.刷新数据库的一个影响auto_increment是重置计数器.
考虑通过主键从数据库中提取数据的测试:
class ChangeLogTest(django.test.TestCase):
def test_one(self):
do_something_which_creates_two_log_entries()
log = LogEntry.objects.get(id=1)
assert_log_entry_correct(log)
log = LogEntry.objects.get(id=2)
assert_log_entry_correct(log)
Run Code Online (Sandbox Code Playgroud)
这将通过,因为只创建了两个日志条目.但是,如果添加了另一个测试ChangeLogTest并且它恰好在之前 运行test_one,则日志条目的主键不再是1和2,它们可能是2和3.现在test_one失败.
这实际上是一个两部分问题:
./manage.py test在每个测试用例之间刷新数据库?是否可以强制./manage.py测试在每个测试用例之间刷新数据库?
看看django.core.management.commands.flush.py命令的实现.
您可以从测试调用内部调用flush命令(可能在TestCase.setUp中):
management.call_command('flush')
Run Code Online (Sandbox Code Playgroud)
也许有充分的理由.有人知道吗?
是的,有:加速.刷新并从json重新加载许多数据需要一段时间......
也许你应该看看TransactionTestCase
答案是,不要以依赖于特定键值的方式编写测试.例如,您的测试可以更好地编写:
def test_one(self):
do_something_which_creates_two_log_entries()
logs = LogEntry.objects.all()
assert_log_entry_correct(log[0])
assert_log_entry_correct(log[1])
Run Code Online (Sandbox Code Playgroud)