- PVSM.RU - https://www.pvsm.ru -
Я буду писать unittest'ы…
Я буду писать unittest'ы…
Я буду писать unittest'ы…
Данная статья является до неприличности упрощенным изложением документации к Python, расположенной по ссылке docs.python.org/2/library/unittest.html [1] и позволяет быстрее приступить к работе, не вникая глубоко.
Unittest, который также иногда называют PyUnit — это python-версия JUnit'а, используемого в Java для разработки unit-тестов. Java, в свою очередь, взяла общие идеи этого модуля у SmallTalk'а.
Основные термины, которые надо запомнить:
TestCase, как не сложно догадаться, представлен классом TestCase. Для TestCase можно (но необязательно) перегружать 2 метода:
Test fixture представлена классом FunctionTestCase. Если вы видите, что вам приходится делать много копирований/вставок setUp()'а, значит скорее всего вам пора написать Test fixture. Или если вы предполагаете, что эти же предварительные настройки потребуются для остальных тестов.
Test Suite (сюрпрайз!) реализован в классе TestSuite. Он может запускать как отдельные тесты, так и другие TestSuite'ы.
Объект 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'у вторым аргументом.
Я пишу тесты.
Я продолжу писать тесты.
(повторять перед сном про себя)
Автор: xSkyFoXx
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/33045
Ссылки в тексте:
[1] docs.python.org/2/library/unittest.html: http://docs.python.org/2/library/unittest.html
[2] Источник: http://habrahabr.ru/post/177943/
Нажмите здесь для печати.