Я буду писать unittest’ы… уже сегодня

от автора

Я буду писать unittest’ы…
Я буду писать unittest’ы…
Я буду писать unittest’ы…

Данная статья является до неприличности упрощенным изложением документации к Python, расположенной по ссылке docs.python.org/2/library/unittest.html и позволяет быстрее приступить к работе, не вникая глубоко.

Введение

Unittest, который также иногда называют PyUnit — это python-версия JUnit’а, используемого в Java для разработки unit-тестов. Java, в свою очередь, взяла общие идеи этого модуля у SmallTalk’а.

Основные термины

Основные термины, которые надо запомнить:

  • test case — собственно, сам тест;
  • test fixture — коллекция подготовительных мер для запуска теста;
  • test suite — коллекция case’ов, которые должны запускаться вместе;
  • test runner — компонент, управляющий выполнением тестов и выводящий результаты тестирования (да-да, результат можно перенаправить, например, по e-mail’у).

Test case

TestCase, как не сложно догадаться, представлен классом TestCase. Для TestCase можно (но необязательно) перегружать 2 метода:

  • setUp() — действия, которые будут выполнены перед запуском тестов. Это может быть запуск какого-то дополнительного ПО, создание записей в БД и т.п.;
  • tearDown() — действия, которые будут выполнены сразу после завершения теста, вне зависимости от результат. По аналогии с предыдущем пунктом, это может быть удаление ранее созданных записей в БД, остановка работы какого-то ПО и т.п.
Test fixture

Test fixture представлена классом FunctionTestCase. Если вы видите, что вам приходится делать много копирований/вставок setUp()’а, значит скорее всего вам пора написать Test fixture. Или если вы предполагаете, что эти же предварительные настройки потребуются для остальных тестов.

Test suite

Test Suite (сюрпрайз!) реализован в классе TestSuite. Он может запускать как отдельные тесты, так и другие TestSuite’ы.

Test runner

Объект Test runner’а принимает на вход либо TestCase либо TestSuite. Возвращает объект результат — экземпляр класса TestResult. Если ранер не определять, то по умолчанию используется TextTestResult, который выводит результаты тестирования в консоль. Можно выводить в БД, в графический интерфейс, в письмо, да вообще куда вздумается, перенаправляя потоки вывода.

Пример

Предположим, что у нас есть метод вычисления налога на доходы физ.лиц (13%), сохраненный в файл fee.py:

def fee(income):     try:         income = float(income)         return income*0.13     except ValueError:         return False     return False 

TestCase, сохраненный в файле test.py, для данной функции будет выглядить следующим образом:

# -*- coding: utf-8 -*-    import unittest import random    from fee import fee    class FeeTestCase(unittest.TestCase):   	def test_number_income(self):   		"""Проверяет, корректноли ли будет работать метод, если на входе число. """   		income = random.randint(0,10000)   		income_fee = income*0.13   		self.assertTrue(income_fee == fee(income), "Fee function returns incorrent value.")       	def test_not_number_income(self):   		"""Проверяет, корректноли ли будет работать метод, если на входе не число. """   		income = random.randint(0,10000)     		str_income = "Text string"   		self.assertFalse(str_income == fee(income), "Fee function returns incorrent value when string is income.")  

Запускаем тестирование в консоли:

$python -m unittest test 

Полагаю, что результаты тестирование, а также проверка, что происходит, когда тест не проходит, вы с интересом и легкостью сможете проверить и увидеть самостоятельно.

Пример успешного прохода по тестам:

$ python -m unittest test .. ---------------------------------------------------------------------- Ran 2 tests in 0.000s      OK 

Разбор примера

Если в TestCase’е имя метода начинается со слова test_, то это воспринимается как конкретный тест. Любой test_ в своем теле должен реализовывать какой-то из assert’ов. В приведенном примере это assertTrue и assertFalse (с полным списком можно ознакомиться в документации к стандартной библиотеке). Если assert выполняется, тогда тест считается пройденным успешно. Иначе — выполненным с ошибкой и выводом на экран сообщения, которое передается assert’у вторым аргументом.

Некоторые важные флаги запуска

  • -c при нажатии на ctrl+c дождаться завершения текущего теста, а затем завершить выполнение и показать результат;
  • -v — вывод результатов с пояснением;
  • -f — прекратить выполнение при первом же фейле.

Я пишу тесты.
Я продолжу писать тесты.
(повторять перед сном про себя)

ссылка на оригинал статьи http://habrahabr.ru/post/177943/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *