Тестирование по-пайтоновски. Углубление.
Продолжение. Начало находится тут.
В целом, тесты выполняются по следующей «схеме».
if has_setup_fixture(test): run_setup(test) try: run_test(test) finally: if has_teardown_fixture(test): run_teardown(test)
При наличии кода инициализации и завершения у модулей и пакетов тестов, этот код также выполняется, но один раз перед началом выполнения всех тестов модуля и после их завершения соответственно.
Кроме того, выполняются следующие правила.
— Если код инициализации выполняется с ошибкой, тест не выполняется, равно как и код завершения.
— Если код инициализации отсутствует, то код финализации также не выполняется.
— Код финализации выполняется всегда, независимо от результатов теста
— Тесты исполняются все, независимо от результатов
Утилита nosetests позволяет конфигурировать выполнение тестов с помощью параметров командной строки, вот основные из них.
-w Указывает рабочий каталог, в котором будет осуществляться поиск тестов, этот ключ можно указывать несколько раз, если необходимо задать более одного рабочего каталога
nosetests -w foo/ -w bar/
-s Не перехватывать stdout. По-умолчинию, nose перехватывает все что тесты выводят на экран, и печатает вывод только «провалившихся» тестов. Данный ключ отменяет подобное поведение.
-v Выводить более детальную информацию про выполнение тестов. Выводятся имена выполняемых тестов.
-vv Еще больше подробной информации. Выводится информация о логике поиска тестов и их загрузке.
Также nose можно указать имя выполняемого теста в следующем формате имя_файла:имя_теста. Например:
nosetests tests/test_it.py:test_math
Следующей замечательной особенностью nose является поддержка т.н. doctests.
Doctests позволяют совместить тесты и документацию для функции. Вот пример такой функции.
def multiply(a, b):
"""
'multiply' multiplies two numbers and returns the result.
>>> multiply(5, 10)
50
>>> multiply(-1, 1)
-1
>>> multiply(0.5, 1.5)
0.75
"""
return a*b
Если запустить nosetests с ключем —with-doctest, то будет осуществлен поиск и выполнение тестов из описания функций. Следует обратить внимание, что поиск доктестов будет осуществляться только в тех процедурах, которые nose не распознал как свои собственные тесты. Если же необходимо осуществлять поиск во всех процедурах, необходимо использовать ключ —doctest-tests.
Если тестов у вас стало слишком много, и запускать надо только некоторые из них, тут на помощь придет модуль attrib. Он позволяет очень гибко запускать выбранные тесты. Допустим, у нас есть такой тестовый модуль:
def test_foo():
assert True
test_foo.tags = ['a', 'b']
def test_bar():
assert 1
test_bar.tags = ['a', 'c']
Тогда вызов
nosetests -a tags=a
Приведет к тому что будут выполнены оба теста. А вызов
nosetests -a tags=b
Вызовет только test_foo(). Следует заметить, что атрибуты тестов могут носить любые имена, удобные для разработчика.
Возможны и более сложные варианты «тегирования». Возьмем, например наш первый тест-класс и доработаем его:
class TestExample:
our_tag = True
def test_char(self):
assert 'z' == 'z'
def test_str(self):
assert 'zzz' == 'zzz'
test_str.our_tag = False
В данном случае при запуске nosetests с ключем —a our_tag будет выполнен test_char(), так как our_tag определен для всего тестового класса как истинный, а test_str() выполнен не будет, так как для него our_tag переопределен на ложный. Для вызова test_str() надо использовать вызов с инвертированием атрибута: -a \!our_tag
Ну, и последнее что следует отметить — это возможность использования nose в своих программах. Сделать это очень просто:
import nose
### настроить его
nose.run()
Подробнее это описано в документации самого пакета.
Вот собственно те основы, которые нужны для удобной эксплуатации данного замечательного фреймворка.
По материалам сайтов
ivory.idyll.org/articles/nose-intro.html
somethingaboutorange.com/mrl/projects/nose
Немає коментарів
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.