В этом разделе вы узнаете о модульном тестировании в Python, используя модули unittest, чтобы в дальнейшейшем лучше понимать как использовать модульное тестирование в Django.
Что такое модульный тест
Модульный тест — это автоматизированный тест, который:
- Проверяет небольшой фрагмент кода, называемый модулем. Модуль может быть функцией или методом класса.
- Выполняется очень быстро.
- Выполняется изолированно.
Идея модульного тестирования состоит в том, чтобы проверить каждую маленькую часть вашей программы, чтобы убедиться, что она работает правильно.
Оно отличается от интеграционного тестирования, которое проверяет, хорошо ли работают вместе разные части программы.
Цель юнит-теста — найти ошибки. Кроме того, модульный тест может помочь реорганизовать существующий код, чтобы сделать его более тестируемым и надежным.
Python предоставляет вам встроенный модуль unittest, который позволяет эффективно проводить модульное тестирование.
Пример модульного тестирования Python
Предположим, у вас есть класс Square с вызываемым свойством lengthи методом area(), возвращающим площадь квадрата.
Класс Square находится в модуле square.py:
class Square:
def __init__(self, length) -> None:
self.length = length
def area(self):
return self.length * self.length
Чтобы протестировать класс Square, вы должны создать новый файл с именем test_square.py и импортировать модуль unittest следующим образом:
import unittest
Поскольку test_square.py необходимо получить доступ к классу Square, вы должны импортировать его из square.py модуля:
import unittest
from square import Square
Чтобы создать тестовый пример, вы определяете новый класс TestSquare, который наследуется от класса TestCase модуля unittest:
class TestSquare(unittest.TestCase):
pass
Чтобы протестировать метод area(), вы добавляете метод test_area() в класс TestSquare следующим образом:
import unittest
from square import Square
class TestSquare(unittest.TestCase):
def test_area(self):
square = Square(10)
area = square.area()
self.assertEqual(area, 100)
В методе test_area():
- Сначала создайте новый экземпляр класса
Squareи инициализируйте его длину числом 10.
- Во-вторых, вызовите метод
area(), возвращающий площадь квадрата.
- В-третьих, вызовите метод
assertEqual(), чтобы проверить, равен ли результат, возвращаемый методомarea()ожидаемой площади100.
Если площадь равна 100, то тест assertEqual() пройден. В противном случае тест assertEqual() провалится.
Перед запуском теста необходимо вызвать функцию main() модуля unittest следующим образом:
import unittest
from square import Square
class TestSquare(unittest.TestCase):
def test_area(self):
square = Square(10)
area = square.area()
self.assertEqual(area, 100)
if __name__ == '__main__':
unittest.main()
Чтобы запустить тест, вы открываете терминал, переходите в папку и выполняете следующую команду:
python test_square.py
Он выведет следующее:
Вывод показывает, что один тест пройден, обозначенный точкой ..
Если тест не пройден, вы увидите букву F вместо точки.
Чтобы получить более подробную информацию о результате теста, вы передаёте в функцию unittest.main() аргумент verbosity со значением 2:
import unittest
from square import Square
class TestSquare(unittest.TestCase):
def test_area(self):
square = Square(10)
area = square.area()
self.assertEqual(area, 100)
if __name__ == '__main__':
unittest.main(verbosity=2)
Если вы снова запустите тест:
python test_square.py
вы получите подробную информацию:
В выходном списке тестовый пример с результатом ok на этот раз вместо точки ..