Я буду писать 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 — прекратить выполнение при первом же фейле.
Я пишу тесты.
Я продолжу писать тесты.
(повторять перед сном про себя)
Автор: xSkyFoXx