×Закрыть

Тестирование по-пайтоновски. Углубление.

Продолжение. Начало находится тут.

В целом, тесты выполняются по следующей «схеме».

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

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

👍НравитсяПонравилось0
В избранноеВ избранном0
Подписаться на автора
LinkedIn

Похожие статьи



Нет комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Подписаться на комментарии