Как сделать библиотеку покрытия 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)