🏠 Домашнее задание — Урок 02

Урок 02 — Summary session. Отдельного LMS-задания для этого урока нет — это занятие-повторение. Вместо этого предлагается серия упражнений для самостоятельной закрепления материала урока 01.

Упражнение 1: расширить тесты Calculator

На основе класса Calculator из урока 01 добавьте параметризованные тесты для всех методов (не только sum и avg):

Упражнение 2: маркировки

Разметьте тесты Calculator маркерами:

Упражнение 3: класс StringUtils

Создайте класс StringUtils с методами и напишите к нему тесты:

# string_utils.py
class StringUtils:
    def reverse(self, s: str) -> str:
        """Перевернуть строку."""
        return s[::-1]

    def is_palindrome(self, s: str) -> bool:
        """Проверить, является ли строка палиндромом (без учёта регистра)."""
        cleaned = s.lower().replace(" ", "")
        return cleaned == cleaned[::-1]

    def count_vowels(self, s: str) -> int:
        """Подсчитать количество гласных (a, e, i, o, u)."""
        return sum(1 for c in s.lower() if c in 'aeiou')

Требования к тестам:

Подготовка окружения

# PowerShell (в папке проекта)
python -m venv venv
venv\Scripts\activate
pip install pytest

# Структура файлов
Lesson2\
  string_utils.py
  test_string_utils.py
  calculator.py
  test_calculator.py
  pytest.ini

Запуск и проверка в VS Code

  1. Открыть папку Lesson2 в VS Code.
  2. Терминал: venv\Scripts\activatepytest -v.
  3. Проверить, что все тесты зелёные (PASSED).
  4. Запустить только positive_test: pytest -m positive_test -v.
  5. Запустить только negative_test: pytest -m negative_test -v.
  6. Настройка отладки (F5): в .vscode/launch.json добавьте конфигурацию для pytest:
// .vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "pytest: run current file",
      "type": "debugpy",
      "request": "launch",
      "module": "pytest",
      "args": ["${file}", "-v"],
      "console": "integratedTerminal",
      "justMyCode": true
    }
  ]
}
Проверка выполнения:
  • Все тесты проходят без ошибок.
  • Используется @pytest.fixture (не Calculator() внутри каждого теста).
  • Есть хотя бы один @pytest.mark.parametrize.
  • Маркеры зарегистрированы в pytest.ini.
  • Файл именован правильно: test_*.py.

Связь с теорией и примерами