我正在使用Django和Python 3.7。我想在运行测试之前加载一些测试数据。我想指定在我的测试会做这样的“夹具”的元素,但它似乎并没有被加载。我创建的文件,炫魅/装置/ test_data.yaml,与此内容
model: mainpage.website
pk: 1
fields:
path: /testsite
model: mainpage.article
pk: 1
fields:
website: 1
title: 'mytitle'
path: '/test-path'
url: 'http://www.mdxomein.com/path'
created_on:
type: datetime
columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP
model: mainpage.articlestat:
pk: 1
fields:
article: 1
elapsed_time_in_seconds: 300
hits: 2
我在下面的测试文件中指定夹具...
from django.test import TestCase
from mainpage.models import ArticleStat, Article
import unittest
class TestModels(unittest.TestCase):
fixtures = ['/mainpage/fixtures/test_data.yaml',]
# Test saving an article stat that hasn't previously
# existed
def test_add_articlestat(self):
id = 1
article = Article.objects.filter(id=id)
self.assertTrue(article, "A pre-condition of this test is that an article exist with id=" + str(id))
articlestat = ArticleStat(article=article,elapsed_time_in_seconds=250,votes=25,comments=15)
articlestat.save()
article_stat = ArticleStat.objects.get(article=article)
self.assertTrue(article_stat, "Failed to svae article stat properly.")
但它不会出现任何的测试数据被加载时,我的测试运行...
(venv) localhost:mainpage_project davea$ cd /Users/davea/Documents/workspace/mainpage_project; source ./venv/bin/activate; python manage.py test
test activated!
Creating test database for alias 'default'...
/Users/davea/Documents/workspace/mainpage_project/venv/lib/python3.7/site-packages/django/db/models/fields/__init__.py:1421: RuntimeWarning: DateTimeField Article.front_page_first_appeared_date received a naive datetime (2019-01-30 17:02:31.329751) while time zone support is active.
RuntimeWarning)
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_add_articlestat (mainpage.tests.TestModels)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/davea/Documents/workspace/mainpage_project/mainpage/tests.py", line 15, in test_add_articlestat
self.assertTrue(article, "A pre-condition of this test is that an article exist with id=" + str(id))
AssertionError: <QuerySet []> is not true : A pre-condition of this test is that an article exist with id=1
----------------------------------------------------------------------
Ran 1 test in 0.001s
我试图改变文件名的东西,它根本不存在,看看如果我得到一个不同的错误,但我不知道。所以,我不认为这“灯具”约定的所有工作。我如何才能运行我的测试我的测试数据加载?
答案 0 :(得分:0)
为了以这种方式使用灯具,需要设置TransactionTestCase.fixtures
。
1
加载夹具的魔力发生在TransactionTestCase
中。这样可以使TransactionTestCase
的子类的Test类成为子类。 django.test.TestCase
还将加载在fixtures属性中指定的fixture。
2
当前的TestModels
测试类是unitest.TestCase
的子类,因此对夹具设置不起作用。 3
from django.test import TestCase
class TestModels(TestCase):
fixtures = ['test_data.yaml',]
通常,只需为灯具文件设置名称,而不是为灯具文件的整个路径设置名称就可以了。
如果您需要为要在其中发现灯具的灯具设置一个自定义文件夹,可以通过设置FIXTURE_DIRS
4
答案 1 :(得分:0)
您应该(如@OluwafemiSule所述)在他的回答中使用django.test.TestCase
进行说明,以便考虑到类属性fixtures
。
unittest.TestCase
来实现测试和加载夹具吗?尽管不建议您使用setUp
方法以编程方式加载灯具,如下所示:
from django.core.management import call_command
def setUp(self):
call_command('loaddata', 'initial_data.yml', app_label='myapp')
但是这种方法将要求您回滚对加载的数据所做的任何更改(如果要在后续测试中使用它的话)。
从Fixtures in Unit Tests部分的Django测试文档中,您可以阅读:
关于夹具,Django Testcase为您做的一件大事是它为所有测试保持一致的状态。在运行每个测试之前,将刷新数据库:将数据库返回到原始状态(例如在您的第一个syncdb之后)。然后将您的装置加载到数据库中,然后调用setUp(),然后运行测试,然后调用tearDown()。 在尝试建立一个好的测试套件时,保持测试之间的相互隔离非常重要。
这就是为什么您应该使用django.test.TestCase
。
另一个重要提示是,您可以使用命令testserver来查看您的灯具是否良好:
$ django-admin testserver mydata.json
这将使用给定夹具中的数据运行Django开发服务器(与runserver中一样)。您可以阅读有关testserver命令的信息,您会发现这是一个非常有用的工具。