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

в 10:48, , рубрики: python, 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 — прекратить выполнение при первом же фейле.

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

Автор: xSkyFoXx

Источник

Поделиться

* - обязательные к заполнению поля