← Назад к вопросам

Написать тест на pytest

2.2 Middle🔥 171 комментариев
#Теория тестирования

Условие

Напишите автотест на pytest для проверки функции калькулятора.

Требования

  • Покрыть операции сложения, вычитания, умножения, деления
  • Использовать параметризацию
  • Добавить fixture для инициализации калькулятора
  • Обработать деление на ноль

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Структура тестирования с pytest

pytest — современный фреймворк для автоматизации тестирования на Python с поддержкой fixtures и параметризации.

Реализация калькулятора

# calculator.py

class Calculator:
    """Класс калькулятора с базовыми операциями"""
    
    def add(self, a, b):
        return a + b
    
    def subtract(self, a, b):
        return a - b
    
    def multiply(self, a, b):
        return a * b
    
    def divide(self, a, b):
        if b == 0:
            raise ValueError("Деление на ноль невозможно")
        return a / b

Тесты на pytest

# test_calculator.py

import pytest
from calculator import Calculator


@pytest.fixture
def calculator():
    """Fixture для инициализации калькулятора"""
    return Calculator()


class TestCalculator:
    """Набор тестов для калькулятора"""
    
    @pytest.mark.parametrize("a,b,expected", [
        (2, 3, 5),
        (0, 0, 0),
        (-1, 1, 0),
        (-5, -3, -8),
        (0.5, 0.5, 1.0),
    ])
    def test_add(self, calculator, a, b, expected):
        """Параметризованный тест сложения"""
        assert calculator.add(a, b) == expected
    
    @pytest.mark.parametrize("a,b,expected", [
        (5, 3, 2),
        (0, 0, 0),
        (10, -5, 15),
        (-5, -3, -2),
        (1.5, 0.5, 1.0),
    ])
    def test_subtract(self, calculator, a, b, expected):
        """Параметризованный тест вычитания"""
        assert calculator.subtract(a, b) == expected
    
    @pytest.mark.parametrize("a,b,expected", [
        (2, 3, 6),
        (0, 100, 0),
        (-2, 3, -6),
        (-2, -3, 6),
        (2.5, 2, 5.0),
    ])
    def test_multiply(self, calculator, a, b, expected):
        """Параметризованный тест умножения"""
        assert calculator.multiply(a, b) == expected
    
    @pytest.mark.parametrize("a,b,expected", [
        (6, 2, 3),
        (10, -2, -5),
        (1, 2, 0.5),
        (-8, 2, -4),
        (0, 5, 0),
    ])
    def test_divide(self, calculator, a, b, expected):
        """Параметризованный тест деления"""
        assert calculator.divide(a, b) == expected
    
    def test_divide_by_zero(self, calculator):
        """Тест деления на ноль"""
        with pytest.raises(ValueError, match="Деление на ноль"):
            calculator.divide(10, 0)
    
    def test_divide_by_zero_with_negative(self, calculator):
        """Тест деления отрицательного числа на ноль"""
        with pytest.raises(ValueError):
            calculator.divide(-5, 0)
    
    def test_add_large_numbers(self, calculator):
        """Тест сложения больших чисел"""
        result = calculator.add(1e10, 1e10)
        assert result == 2e10
    
    def test_multiply_by_zero(self, calculator):
        """Тест умножения на ноль"""
        assert calculator.multiply(100, 0) == 0
        assert calculator.multiply(0, -50) == 0

Команды для запуска

# Все тесты с подробным выводом
pytest test_calculator.py -v

# Конкретный тест
pytest test_calculator.py::TestCalculator::test_add -v

# С покрытием кода
pytest test_calculator.py --cov=calculator

# Только тесты деления
pytest test_calculator.py -k "divide" -v

# С показом print-выводов
pytest test_calculator.py -v -s

Ключевые возможности

  • @pytest.fixture: инициализация объектов перед каждым тестом
  • @pytest.mark.parametrize(): множественные наборы тестовых данных
  • pytest.raises(): проверка исключений
  • assert: простая проверка результатов
  • -v флаг: подробный вывод тестов
Написать тест на pytest | PrepBro