Включение doc tests в сессию unit tests

Как включить doctests в сессию unittests

Иногда бывает очень удобно использовать doctest. Я это делаю в тех ситуациях, когда пример использования становится одновременно самым удачным тестом.

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

Чтобы устранить это неудобство мы можем добавить doc-tests в сессию unit-tests.

import doctest
from os.path import dirname, basename, isfile
from glob import glob
from importlib import import_module

import mypackage
PACKAGES = [mypackage]  # list of packages where to find doc-tests

PY_EXT = '.py'  # in what files we will look for doc-tests


def load_tests(loader, tests, ignore):
    for package in PACKAGES:
        for module_file in glob(dirname(package.__file__) + f'/*{PY_EXT}'):
            if isfile(module_file) and not module_file.endswith('__init__.py'):
                tests.addTest(doctest.DocTestSuite(
                    import_module(f'{package.__name__}.{basename(module_file)[:-len(PY_EXT)]}')
                ))
    return tests

Мы используем load_tests protocol. И добавляем к unit tests также создаваемые нами unit-test обертки для doc tests.

В итоге результат тестовой сессии unit test будет для всех тестов сразу, как обычных unit tests так и doc tests.

Еще одно получаемое нами преимущество - более структурированный отчет о тестах.