Как заставить django unittest TestLoader найти и запустить мои doctests?

В Django мои тесты представляют собой набор test_foo.py файлов внутри my_django_app/tests/, каждый из которых содержит TestCase подкласс, который django автоматически находит и запускает.

У меня есть несколько служебных модулей с простыми тестами, которые я хотел бы включить в свой набор тестов. Я пробовал использовать doctest.DocTestSuite() для определения наборов тестов в my_django_app/tests/test_doctests.py, но средство запуска тестов django не находит новые тесты в этом модуле.

Есть ли способ создать класс TestCase, который вызывает мои doctests, или как-то иначе определить новый tests/test_foo.py модуль, который будет запускать эти тесты?


person Taylor Hughes    schedule 06.10.2015    source источник


Ответы (2)


Автоматическое обнаружение unittests Django ищет load_tests функцию в вашем модуле test_foo и запускает ее. Таким образом, вы можете использовать это, чтобы добавить свои тесты в набор тестов ...

import doctest
import module_with_doctests

def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(module_with_doctests))
    return tests

Кроме того, из-за ошибки (?) В unittest ваша load_tests функция не будет запущена, если ваш test_foo модуль также не определит класс, производный от TestCase, например:

class DoNothingTest(TestCase):
    """Encourage Django unittests to run `load_tests()`."""
    def test_example(self):
        self.assertTrue(True)
person hobs    schedule 11.11.2015

Я решил это, создав новый модуль my_django_app/tests/test_doctests.py, который выглядит так:

import doctest
import unittest

# These are my modules that contain doctests:
from util import bitwise
from util import text
from util import urlutil
DOCTEST_MODULES = (
  bitwise,
  text,
  urlutil,
)

# unittest.TestLoader will call this when it finds this module:
def load_tests(*args, **kwargs):
  test_all_doctests = unittest.TestSuite()
  for m in DOCTEST_MODULES:
    test_all_doctests.addTest(doctest.DocTestSuite(m))
  return test_all_doctests

Django использует встроенный unittest TestLoader, который во время тестирования discovery, вызовет load_tests () в вашем тестовом модуле. Итак, мы определяем load_tests, который создает набор тестов из всех тестов.

person Taylor Hughes    schedule 06.10.2015