Django test.TestCase vs unittest.TestCase

时间:2013-11-18 09:30:54

标签: django unit-testing testing

我想知道有关为测试提供数据的最佳实践的一些事项。

来自docs

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夹具,但我宁愿在代码中创建透明度,因为它很少见。

当我使用django.test.TestCase时,根据文档,每个单独的测试都在一个事务中运行。但数据库中存在来自setUp()无数据。我在调试器中运行它并连接到临时数据库并检查它。

使用django.utils.unittest.TestCase时,数据存在。唉,该方法聚合数据,因为它为每个单独的测试运行。

我理解为什么unittest.TestCase由于没有刷新数据库而聚合数据。我不明白的是使用django.test.TestCase时数据不存在的原因。即使在setUp()方法的最后,它仍然是空白的。

django.test.TestCase是不是应该保存任何数据,还是我做错了什么?

编辑1: 做了一个干净的项目,它开始工作,因为我怀疑它应该。对于每次运行,django.test.TestCasesetup()方法中的数据填充数据库,所以我想我的设置必须是非常可疑的。我会使用Occam的剃须刀,看看我能不知道它是什么。

编辑2: 清理模型并测试文件并再次运行测试。将调试器设置为在setUp()之后暂停,但数据库中仍然没有任何内容。对象确实有pk,并且可以保存到数据库中。检查继承到ModelState的{​​{1}}对象,并根据保存到数据库的Model属性。

将此调试代码添加到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}

我得到了实际上有可用对象的响应。但他们在哪里?对此我有点痴迷,我必须承认=)。

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

2 个答案:

答案 0 :(得分:2)

Django' django.test.TestCase不提交事务,因此它永远不会出现在数据库中。整个测试用例是执行inside a big事务,因此您无法从外部检查数据库发生了什么(因为在事务提交之前实际上没有任何事情发生在数据库中,这种情况从未发生过)

答案 1 :(得分:1)

django.test.TestCase为你做了几件事,其中一个是创建一个测试数据库(并在测试完成后销毁它)。这在此处记录:https://docs.djangoproject.com/en/stable/topics/testing/overview/#the-test-database