Как загрузить мой тестовый файл yaml до запуска теста Django? - PullRequest
0 голосов
/ 30 января 2019

Я использую Django и Python 3.7.Я хотел бы загрузить некоторые тестовые данные перед выполнением моих тестов.Я думал, что указание элемента «fixtures» в моем тесте сделает это, но, похоже, он не загружен.Я создал файл mainpage / fixtures / 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

Я попытался изменить имя файла на что-то, чего вообще не существует, чтобы увидеть, получаю ли я другоеошибка, но я неТак что я не думаю, что это соглашение "Fixtures" работает вообще.Как загрузить данные теста до его запуска?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы должны (как @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')

, но при таком подходе вам потребуется откатить любые изменения, внесенные в загруженные данные.если вам, что использовать в последующих тестах.

Правильный путь

Из документации по тестированию Django в разделе Светильники в модульных тестах вы можете прочитать:

Большая вещь, которую тестовый набор Django делает для вас в отношении приборов, состоит в том, что он поддерживает согласованное состояние для всех ваших тестов.Перед каждым тестом база данных сбрасывается, возвращая ее в первоначальное состояние (как после вашей первой syncdb).Затем ваш прибор загружается в БД, затем вызывается setUp (), затем запускается ваш тест, а затем вызывается tearDown (). Хранение ваших тестов в изоляции друг от друга невероятно важно, когда вы пытаетесь создать хороший набор тестов .

Вот почему вы должны использовать django.test.TestCase.

У вас хорошо работают приборы?

Еще один важный совет: вы можете использовать команду testserver, чтобы увидеть, хороши ли ваши приборы:

$ django-admin testserver mydata.json

это запустит сервер разработки Django (как в runserver), используя данные из данного прибора (ов).Вы можете прочитать о команде testserver , и вы обнаружите, что это очень полезный инструмент.

0 голосов
/ 05 февраля 2019

Чтобы использовать приборы таким образом, необходимо установить TransactionTestCase.fixtures. 1

Волшебство загрузки приборов происходит в TransactionTestCase.Это делает так, чтобы тестовые классы, которые подклассы TransactionTestCase, например, django.test.TestCase, также загружали приборы, указанные в атрибуте fixtures. 2

Текущий TestModels подкласс тестового класса unitest.TestCase и, следовательно, ничего не делает с настройкой приборов. 3

from django.test import TestCase

class TestModels(TestCase):
    fixtures = ['test_data.yaml',]

Обычно очень просто установить имя файла фикстуры, а не полный путь к файлу фикстуры.Если вам нужно установить пользовательскую папку для приборов, которые будут обнаружены, это можно указать, установив FIXTURE_DIRS 4

...