我想知道一些关于为您的测试提供数据的最佳实践的事情。
来自文档
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时,每个单独的测试都根据文档在事务中运行。但是数据库中不存在来自我的的数据。我在调试器中运行它,并连接到临时数据库并检查它。
当使用django.utils.unittest.TestCase时,数据是存在的。唉,这个方法是聚合数据,因为它是为每个单独的测试运行的。
我理解为什么unittest.TestCase会因为不刷新数据库而聚合数据。我不理解的是为什么在使用django.test.TestCase时数据不存在。即使在setUp()方法的末尾,它仍然是空白的。
django.test.TestCase不应该保存任何数据还是我做了什么完全错误的事情?
编辑1:用这个做了一个干净的项目,它开始工作了,正如我所怀疑的那样。django.test.TestCase为每个单独的运行填充了setup()方法中的数据,所以我想我的设置肯定有一些可疑之处。我会使用奥卡姆剃须刀,看看我能不能找出它是什么。
编辑2:清除模型和测试文件,并再次运行测试。将调试器设置为在setUp()之后停止,但数据库中仍然没有任何内容。这些对象确实有一个pk,并且可能会保存到数据库中。检查继承到Model的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}但当添加:
print Animals.objects.all().count()
2我得到的答复是,实际上有可用的对象。但他们在哪里?我必须承认,现在我对此有点痴迷了。
我现在可以继续,但仍然没有一个令人满意的答案。
发布于 2015-10-23 09:06:59
Django的django.test.TestCase不提交事务,因此它从未出现在数据库中。整个测试用例都是执行在一个大的事务的,这样您就不能从外部检查数据库发生了什么(因为在事务提交之前,数据库实际上什么也没有发生,这是从来没有发生的)
发布于 2013-11-18 11:56:02
django.test.TestCase为您做了几件事,其中之一是创建测试数据库(并在测试完成后将其销毁)。这里记录了这一点:https://docs.djangoproject.com/en/stable/topics/testing/overview/#the-test-database
https://stackoverflow.com/questions/20044290
复制相似问题