Как сделать библиотеку покрытия Python включающей doctests

По поиску и экспериментам, кажется, питона coverage библиотека не включает в свои расчеты doctests. Есть ли способ сделать это?

Я искал документы ( https://coverage.readthedocs.io/en/coverage-4.4.1/) и не нашел упоминаний о doctests, но это кажется настолько странным, что у него не было бы никакого способа включить их, что я чувствую, что я должен что-то упустить.

Если я прав, и покрытие не будет включать их, как я могу измерить свое тестовое покрытие, не превращая все мои тесты в юнит-тесты с unittest (что я не хочу делать)?

2 ответа

Решение

На ум приходят два способа: либо импортировать сам модуль, либо загружать модуль из другого модуля.

Пусть модуль импортирует сам

В файле a.py:

def linear(a, b):
    ''' Solve ax + b = 0

        >>> linear(3, 5)
        -1.6666666666666667

    '''
    if a == 0 and b != 0:
        raise ValueError('No solutions')
    return -b  / a

if __name__ == '__main__':
    import doctest
    import a

    print(doctest.testmod(a))

В командной строке:

$ coverage run a.py
$ coverage annotate
$ cat a.py,cover

Это производит:

> def linear(a, b):
>     ''' Solve ax + b = 0

>         >>> linear(3, 5)
>         -1.6666666666666667

>     '''
>     if a == 0 and b != 0:
!         raise ValueError('No solutions')
>     return -b  / a

> if __name__ == '__main__':
>     import doctest
>     import a

>     print(doctest.testmod(a))

Запустите тесты из отдельного модуля

Кроме того, вы можете переместить import и testmod() из a.py и поместите их в отдельный модуль.

В файле b.py

import doctest
import a

print(doctest.testmod(a))

В командной строке:

$ coverage run b.py
$ coverage annotate
$ cat a.py,cover

Это производит:

> def linear(a, b):
>     ''' Solve ax + b = 0

>         >>> linear(3, 5)
>         -1.6666666666666667

>     '''
>     if a == 0 and b != 0:
!         raise ValueError('No solutions')
>     return -b  / a

Докуты модуля могут быть преобразованы в тестовый набор юниттеста

import mymodule
suite = doctest.DocTestSuite(mymodule)
Другие вопросы по тегам