Текст задания из LMS
Auto QA: Домашнее задание 1
Создайте файл simple_math.py и напишите в нём следующий класс:
# simple_math.py
class SimpleMath:
"""Класс с простыми математическими операциями."""
def square(self, x):
"""Возвращает квадрат числа."""
return x * x
def cube(self, x):
"""Возвращает куб числа."""
return x * x * x
- Цель: написать unit-тесты для класса
SimpleMath. -
Инструкция:
- Создайте файл
test_simple_math.py. - Напишите в нём тесты для методов
squareиcube. - Проверьте корректность работы методов для разных входных значений (положительных, отрицательных и нуля).
- Создайте файл
-
Пример ожидаемого поведения:
- Метод
square(2)должен возвращать4. - Метод
cube(-3)должен возвращать-27.
- Метод
- В качестве ответа приложить ссылку на репозиторий в git.
Подготовка окружения
Шаг 1: Создание проекта и виртуального окружения
# PowerShell — создайте папку для проекта
mkdir homework_01
cd homework_01
# Создайте виртуальное окружение
python -m venv venv
# Активируйте окружение (PowerShell)
.\venv\Scripts\Activate.ps1
# Если PowerShell запрещает скрипты — выполните один раз:
# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Установите pytest
pip install pytest
# Проверьте версию
pytest --version
Шаг 2: Инициализация git-репозитория
# Инициализация
git init
# Создайте .gitignore
# .gitignore
venv/
__pycache__/
*.pyc
.pytest_cache/
Шаг 3: Структура файлов
homework_01/
├── venv/
├── simple_math.py # Тестируемый класс (дан в задании)
├── test_simple_math.py # Ваши тесты
├── pytest.ini # Конфигурация (необязательно)
└── .gitignore
Пошаговое решение
Шаг 1: Создайте файл simple_math.py
Это файл, данный в условии задания — копируйте как есть.
# simple_math.py
class SimpleMath:
"""Класс с простыми математическими операциями."""
def square(self, x):
"""Возвращает квадрат числа."""
return x * x
def cube(self, x):
"""Возвращает куб числа."""
return x * x * x
Шаг 2: Создайте файл test_simple_math.py
Логика: нужно покрыть тремя группами значений — положительные числа, отрицательные числа и ноль.
# test_simple_math.py
import pytest
from simple_math import SimpleMath
@pytest.fixture
def math():
"""Фикстура — создаёт экземпляр SimpleMath для каждого теста."""
return SimpleMath()
# =============================================
# Тесты метода square(x) — возвращает x * x
# =============================================
def test_square_positive(math):
"""Квадрат положительного числа."""
assert math.square(2) == 4
def test_square_positive_large(math):
"""Квадрат большего положительного числа."""
assert math.square(5) == 25
def test_square_negative(math):
"""Квадрат отрицательного числа — результат положительный."""
assert math.square(-3) == 9
def test_square_zero(math):
"""Квадрат нуля равен нулю."""
assert math.square(0) == 0
def test_square_one(math):
"""Квадрат единицы равен единице."""
assert math.square(1) == 1
# =============================================
# Тесты метода cube(x) — возвращает x * x * x
# =============================================
def test_cube_positive(math):
"""Куб положительного числа."""
assert math.cube(2) == 8
def test_cube_positive_large(math):
"""Куб числа 3 равен 27."""
assert math.cube(3) == 27
def test_cube_negative(math):
"""Куб отрицательного числа — результат отрицательный."""
assert math.cube(-3) == -27
def test_cube_zero(math):
"""Куб нуля равен нулю."""
assert math.cube(0) == 0
def test_cube_one(math):
"""Куб единицы равен единице."""
assert math.cube(1) == 1
Шаг 3: Запустите тесты
# В папке homework_01, при активном venv:
pytest -v
# Ожидаемый вывод:
# ========================= test session starts ==========================
# collected 10 items
#
# test_simple_math.py::test_square_positive PASSED [ 10%]
# test_simple_math.py::test_square_positive_large PASSED [ 20%]
# test_simple_math.py::test_square_negative PASSED [ 30%]
# test_simple_math.py::test_square_zero PASSED [ 40%]
# test_simple_math.py::test_square_one PASSED [ 50%]
# test_simple_math.py::test_cube_positive PASSED [ 60%]
# test_simple_math.py::test_cube_positive_large PASSED [ 70%]
# test_simple_math.py::test_cube_negative PASSED [ 80%]
# test_simple_math.py::test_cube_zero PASSED [ 90%]
# test_simple_math.py::test_cube_one PASSED [100%]
#
# ========================== 10 passed in 0.05s ==========================
Проверка в VS Code
Запуск тестов в терминале VS Code
- Откройте папку
homework_01в VS Code: File → Open Folder. - Откройте встроенный терминал: Ctrl + ` (backtick).
- Убедитесь, что выбран интерпретатор Python из venv. В правом нижнем углу VS Code — нажмите на Python и выберите
./venv/Scripts/python.exe. - Запустите тесты:
pytest -v.
Настройка Test Explorer (GUI)
- Откройте палитру команд: Ctrl + Shift + P →
Python: Configure Tests. - Выберите pytest.
- Выберите директорию проекта (
homework_01). - В боковой панели появится иконка колбы — Test Explorer. Там можно запускать тесты кнопкой Run.
Отладка с F5 и точки останова
- Создайте файл
.vscode/launch.jsonв папке проекта:
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "pytest: текущий файл",
"type": "debugpy",
"request": "launch",
"module": "pytest",
"args": [
"${file}",
"-v"
],
"console": "integratedTerminal",
"justMyCode": true
}
]
}
- Откройте
test_simple_math.py. - Кликните слева от строки кода для установки точки останова (красный кружок).
- Нажмите F5 — pytest запустится с отладчиком.
- При достижении точки останова выполнение приостановится — можно изучить переменные в панели Variables.
Публикация в git
# Добавьте файлы в git
git add simple_math.py test_simple_math.py .gitignore
# Создайте первый коммит
git commit -m "feat: add SimpleMath class and pytest tests"
# Создайте репозиторий на GitHub (например через gh CLI):
# gh repo create homework-01-unit-tests --public --source=. --push
# Или через веб-интерфейс GitHub:
# 1. github.com → New repository → название: homework-01-unit-tests
# 2. git remote add origin https://github.com/<your-username>/homework-01-unit-tests.git
# 3. git push -u origin main
Связь с разделами урока
- Теория — Фикстуры pytest: объяснение декоратора
@pytest.fixture, который использован в решении. - Примеры — класс Calculator: аналогичная структура тестов — те же паттерны (фикстура + тесты на разные типы входных данных).
- Ошибки — общее состояние: именно поэтому
math = SimpleMath()создаётся в фикстуре, а не на уровне модуля.