【问题标题】:Django test.TestCase vs unittest.TestCaseDjango test.TestCase 与 unittest.TestCase
【发布时间】:2013-12-01 09:31:27
【问题描述】:

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

来自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() 方法中的数据填充数据库,每次运行时,我想我的设置肯定有一些问题。我会应用奥卡姆剃刀,看看我能不能找出它是什么。

编辑 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

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

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

【问题讨论】:

    标签: django unit-testing testing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我也浏览了该文档。不过,关于这个问题并没有变得更明智。我将单独设置一个单独的测试。
      • @Gesias:我看到你编辑了你的问题。我只能说,在使用 setUp 填充数据库的测试中,我从来没有遇到过这样的问题。也许您的数据库设置中有事务?
      • 我正在处理一个潜在客户。可能归结为这台机器上的数据库中的异常情况。明天我会回复我可能找到的任何解决方案。为抽出时间干杯!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 2013-10-05
      • 1970-01-01
      相关资源
      最近更新 更多