← Назад к вопросам
Написать тест на 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 флаг: подробный вывод тестов