Организация кода и запуск Unittest в Python
- Организация кода
- Запуск модульных тестов
- 1) Запуск всех тестов
- 2) Запуск одного тестового модуля
- 3) Запуск одного тестового класса
- 4) Запуск одного метода тестирования
Организация кода
Если у вас несколько модулей, вы можете создать тестовые модули и разместить их в одном каталоге.
На практике у вас может быть множество модулей, организованных в пакеты. Поэтому важно поддерживать более организованные код разработки и тестовый код. Рекомендуется хранить код разработки и тестовый код в отдельных каталогах. И вам следует поместить тестовый код в каталог под названием test, чтобы сделать его очевидным.
В демонстрационных целях мы создадим пример проекта со следующей структурой:
D:\python-unit-testing ├── shapes | ├── circle.py | ├── shape.py | └── square.py └── test ├── test_circle.py ├── test_square.py └── __init__.py
- Сначала создайте каталоги shapes и test в папке проекта (python-unit-testing).
- Во-вторых, создайте три модуля shape.py, Circle.py и Square.py и поместите их в каталог shape.
shape.py
from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area() -> float: pass
Класс Shape — это абстрактный класс, имеющий метод area(). Это базовый класс классов Circle и Square.
круг.py
import math from .shape import Shape class Circle(Shape): def __init__(self, radius: float) -> None: if radius < 0: raise ValueError('The radius cannot be negative') self._radius = radius def area(self) -> float: return math.pi * math.pow(self._radius, 2)
Класс Circle также наследуется от класса Shape. Он реализует метод area(), который возвращает площадь круга.
Square.py
import math from .shape import Shape class Square(Shape): def __init__(self, length: float) -> None: if length < 0: raise ValueError('The length cannot be negative') self._length = length def area(self) -> float: return math.pow(self._length, 2)
Как и класс Circle, класс Square имеет метод area(), который возвращает площадь квадрата.
- В-третьих, создайте тестовые модули test_circle.py и test_square.py и поместите их в папку тестов:
test_circle.py
import unittest import math from shapes.circle import Circle from shapes.shape import Shape class TestCircle(unittest.TestCase): def test_circle_instance_of_shape(self): circle = Circle(10) self.assertIsInstance(circle, Shape) def test_create_circle_negative_radius(self): with self.assertRaises(ValueError): circle = Circle(-1) def test_area(self): circle = Circle(2.5) self.assertAlmostEqual(circle.area(), math.pi * 2.5*2.5)
Модуль test_circle использует круг и форму из тестовых модулей круга и формы в пакете фигур.
test_square.py
import unittest from shapes.square import Square from shapes.shape import Shape class TestSquare(unittest.TestCase): def test_create_square_negative_length(self): with self.assertRaises(ValueError): square = Square(-1) def test_square_instance_of_shape(self): square = Square(10) self.assertIsInstance(square, Shape) def test_area(self): square = Square(10) area = square.area() self.assertEqual(area, 100)
Модуль test_square использует классы Square и Shape из модулей Square и Shape в пакете shape.
Важно создать файл __init__.py и поместить его в тестовую папку. В противном случае команды в следующем разделе не будут работать должным образом.
Запуск модульных тестов
Модуль unittest предоставляет вам множество способов запуска модульных тестов.
1) Запуск всех тестов
Чтобы запустить все тесты в каталоге тестов, вы выполняете следующую команду из папки каталога проекта(python-unit-testing):
python -m unittest discover -v
Discover — это подкоманда, которая находит все тесты в проекте.
Выход:
test_area(test_circle.TestCircle) ... ok test_circle_instance_of_shape(test_circle.TestCircle) ... ok test_create_circle_negative_radius(test_circle.TestCircle) ... ok test_area(test_square.TestSquare) ... ok test_create_square_negative_length(test_square.TestSquare) ... ok test_square_instance_of_shape(test_square.TestSquare) ... ok ---------------------------------------------------------------------- Ran 6 tests in 0.002s OK
2) Запуск одного тестового модуля
Чтобы запустить один тестовый модуль, используйте следующую команду:
python -m unittest test_package.test_module -v
Например, следующие команды выполняют все тесты в модуле test_circle тестового пакета:
python -m unittest test.test_circle -v
Выход:
test_area(test.test_circle.TestCircle) ... ok test_circle_instance_of_shape(test.test_circle.TestCircle) ... ok test_create_circle_negative_radius(test.test_circle.TestCircle) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
3) Запуск одного тестового класса
Тестовый модуль может иметь несколько классов. Чтобы запустить один тестовый класс в тестовом модуле, вы используете следующую команду:
python -m unittest test_package.test_module.TestClass -v
Например, следующая команда проверяет класс TestSquare из модуля test_square тестового пакета:
python -m unittest test.test_circle.TestCircle -v
Выход:
test_area(test.test_square.TestSquare) ... ok test_create_square_negative_length(test.test_square.TestSquare) ... ok test_square_instance_of_shape(test.test_square.TestSquare) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.001s OK
4) Запуск одного метода тестирования
Чтобы запустить один тестовый метод тестового класса, вы используете следующую команду:
python -m unittest test_package.test_module.TestClass.test_method -v
Например, следующая команда проверяет метод test_area() класса TestCircle:
python -m unittest test.test_circle.TestCircle.test_area -v
Выход:
test_area(test.test_circle.TestCircle) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.001s OK