Организация кода и запуск Unittest в Python

Содержание

Организация кода

Если у вас несколько модулей, вы можете создать тестовые модули и разместить их в одном каталоге.

На практике у вас может быть множество модулей, организованных в пакеты. Поэтому важно поддерживать более организованные код разработки и тестовый код. Рекомендуется хранить код разработки и тестовый код в отдельных каталогах. И вам следует поместить тестовый код в каталог под названием 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
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *