Метод TestCase.tearDown() запускается всякий раз после каждого метода TestCase[47].
Все имена тестов должны начинаться со слова test, иначе они не запустятся.
В одном тестовом случае может быть несколько тестов, но каждый из них должен тестировать что-то одно.
Если вы хотите внести вклад в Tablib, первое, что можете сделать после клонирования репозитория, — запустить набор тестов и убедиться, что все работает как полагается. Это можно сделать так:
(venv)$ ### внутри каталога высшего уровня, tablib/
(venv)$ python — m unittest test_tablib.py
……………………………………………………..
---
Ran 62 tests in 0.289s
OK
В версии Python 2.7 метод unittest также содержит собственный механизм обнаружения тестов, который доступен с помощью параметра discover в командной строке:
(venv)$ ### *above* the top-level directory, tablib/
(venv)$ python — m unittest discover tablib/
……………………………………………………..
---
Ran 62 tests in 0.234s
OK
После того как вы убедитесь, что все тесты проходят, вы: а) найдете тестовый случай, связанный с изменяемой частью проекта, и будете часто запускать его при изменении кода; б) напишете новый тестовый случай для функциональности, которую хотите добавить, или для ошибки, которую отслеживаете, и будете часто запускать его при изменении кода. Рассмотрим в качестве примера следующий сниппет:
(venv)$ ### внутри каталога высшего уровня, tablib/
(venv)$ python — m unittest test_tablib.TablibTestCase.test_empty_append
.
---
Ran 1 test in 0.001s
OK
Как только ваш код начнет работать, снова задействуйте весь набор тестов перед тем, как отправить его в репозиторий. Поскольку вы часто запускаете тесты, они должны быть максимально быстрыми. Более подробную информацию о том, как использовать метод unittest, смотрите в документации по адресу http://bit.ly/unittest-library.
Пакет Requests использует py.test. Чтобы увидеть его в действии, откройте терминальную оболочку, перейдите во временный каталог, клонируйте Requests, установите все зависимости и запустите файл py.test, как показано здесь:
$ git clone — q https://github.com/kennethreitz/requests.git
$
$ virtualenv venv — q — p python3 # dash — q for 'quiet'
$ source venv/bin/activate
(venv)$
(venv)$ pip install — q — r requests/requirements.txt # 'quiet' again…
(venv)$ cd requests
(venv)$ py.test
========================= test session starts =================================
platform darwin — Python 3.4.3, pytest-2.8.1, py-1.4.30, pluggy-0.3.1
rootdir: /tmp/requests, inifile:
plugins: cov-2.1.0, httpbin-0.0.7
collected 219 items
tests/test_requests.py………………………………………………..
X……………………………………..
tests/test_utils.py..s…………………………………………….
========= 217 passed, 1 skipped, 1 xpassed in 25.75 seconds ===================
Другие популярные инструменты
Инструменты для тестирования, перечисленные здесь, используются не так часто, но все еще достаточно популярны.
pytest (http://pytest.org/latest/) — это нешаблонная альтернатива модуля стандартной библиотеки Python. Это означает, что для него не требуется создавать временные платформы для тестовых случаев и, возможно, даже не нужны методы установки и очистки. Для установки запустите команду pip в обычном режиме:
$ pip install pytest
Несмотря на то что инструмент тестирования имеет множество возможностей и его можно расширять, синтаксис остается довольно простым. Создать набор тестов так же просто, как и написать модуль с несколькими функциями:
# содержимое файла test_sample.py
def func(x):
····return x + 1
def test_answer():
····assert func(3) == 5
После этого вам лишь нужно вызвать команду py.test. Сравните это с работой, которая потребуется для создания эквивалентной функциональности с помощью модуля unittest:
$ py.test
=========================== test session starts ============================
platform darwin — Python 2.7.1 — pytest-2.2.1
collecting… collected 1 items
test_sample.py F
================================= FAILURES =================================
_______________________________ test_answer ________________________________
····def test_answer():
> ····assert func(3) == 5
E ····assert 4 == 5
E ····+ where 4 = func(3)
test_sample.py:5: AssertionError
========================= 1 failed in 0.02 seconds =========================
47
Обратите внимание, что метод unittest.TestCase.tearDown не будет запущен, если в коде есть ошибки. Это может удивить вас, если вы использовали функциональность unittest.mock для того, чтобы изменить реальное поведение кода. В Python 3.1 был добавлен метод unittest.TestCase.addCleanup(). Он помещает функцию очистки и ее аргументы в стек, и эта функция будет вызвана либо после метода unittest.TestCase.tearDown(), либо в любом случае независимо от того, был ли вызван метод tearDown(). Для получения более подробной информации обратитесь к документации метода unittest.TestCase.addCleanup() (см. http://docs.python.org/3/library/unittest.html#unittest.TestCase.addCleanup).