在运行Django测试之前,如何加载测试yaml文件?

时间:2019-01-30 17:13:27

标签: python django python-3.x unit-testing fixtures

我正在使用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

我试图改变文件名的东西,它根本不存在,看看如果我得到一个不同的错误,但我不知道。所以,我不认为这“灯具”约定的所有工作。我如何才能运行我的测试我的测试数据加载?

2 个答案:

答案 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命令的信息,您会发现这是一个非常有用的工具。