Django test.TestCase与unittest.TestCase的区别

3

我想了解一些关于测试数据提供的最佳实践问题。

文档中获取。

from django.test import TestCase
from myapp.models import Animal

class AnimalTestCase(TestCase):
    def setUp(self):
        Animal.objects.create(name="lion", sound="roar")
        Animal.objects.create(name="cat", sound="meow")

    def test_animals_can_speak(self):
        """Animals that can speak are correctly identified"""
        lion = Animal.objects.get(name="lion")
        cat = Animal.objects.get(name="cat")

与上面的示例相似,我想在测试用例的setUp方法中保存一些模型,以便稍后在特定的测试用例中使用。我当然可以为此提供一个json fixture,但这次我希望通过代码创建模型以保证透明度,因为数量很少。
根据文档,当我使用django.test.TestCase时,每个单独的测试都在事务中运行。但是我的setUp()中没有任何数据存在于数据库中。我在调试器中运行并连接到临时数据库,并进行了检查。
当使用django.utils.unittest.TestCase时,数据存在。但是,该方法由于在每个单独的测试中运行而“聚合数据”。
我理解为什么unittest.TestCase会聚合数据,因为它不清除数据库。但是我不理解为什么使用django.test.TestCase时数据不存在。即使在setUp()方法的结尾,它仍然是空白的。 django.test.TestCase不应该保存任何数据吗?还是我做错了什么?
编辑1:创建了一个干净的项目,它开始按照我的预期工作。对于每个单独的运行,django.test.TestCase将数据库填充了setup()方法中的数据,因此我猜我的设置必须有某些问题。我将应用奥卡姆剃刀原理,看看能否找出是什么问题。
编辑2:清除了模型和测试文件,并再次运行了测试。将调试器设置为在setUp()之后停止,但数据库中仍然没有任何内容。对象确实具有pk并且应该保存到数据库中。检查继承到ModelModelState对象,根据adding属性,它已经保存到了数据库中。
setUp()方法中添加了这段调试代码:
from django.db import connections
    print connections.databases

{'default': {'ENGINE': 'django.db.backends.mysql', 
'NAME': 'test_DATABASE_temp', 'TEST_CHARSET': None, 
'TEST_COLLATION': None, 'HOST': 'localhost', 'USER': 'user', 
'TEST_NAME': None, 'PASSWORD': 'password}

但是当添加:

print Animals.objects.all().count()

2

我收到了回复,确认确实有可用的对象。但是它们在哪里呢?我必须承认,我现在有点痴迷了=)。

我现在可以继续进行,但仍然缺乏一个令人满意的答案。

2个回答

2
Django的django.test.TestCase不会提交事务,因此它永远不会出现在数据库中。整个测试用例在一个大的事务中执行,因此您无法从外部检查数据库中正在发生的情况(因为在事务提交之前实际上根本没有任何事情发生,而这永远不会发生)。

1

是的,我也仔细研读了那份文档。不过对于这个问题并没有更多的理解。我会在隔离环境中设置一个单独的测试。 - Gesias
@Gesias:我看到你编辑了你的问题。我只能说,我从来没有遇到过使用setUp填充数据库的测试出现这样的问题。也许是你的数据库设置中涉及了事务处理? - bruno desthuilliers
我正在处理一项线索。可能涉及到这台机器数据库的不规则性。如果我找到任何解决方案,明天我会再次发布。感谢您抽出时间! - Gesias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接