Тестирование кода — это не просто "проверка, что работает". Это способ документировать поведение программы, ловить баги до того, как они доберутся до пользователей, и спокойно рефакторить код, зная, что ничего не сломалось. В Python для этого есть встроенный модуль unittest, который предоставляет всё необходимое: создание тестовых классов, методы проверки (assertions), фикстуры для подготовки окружения.
В этом тренажере ты научишься писать тесты с нуля: от простых проверок assertEqual до работы с исключениями и настройкой setUp/tearDown. Задания построены от базовых концепций к более сложным сценариям. Каждый тест — это маленькая спецификация того, как должен работать твой код. Погнали разбираться!
- Модуль 1: Основы синтаксиса Python
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Арифметические операторы (+, -, *, /).
- Целочисленное деление и остаток (// и %).
- Возведение в степень (**).
- Операторы сравнения.
- Логические операторы (and, or, not).
- Операторы присваивания (=, +=, -=).
- Операторы принадлежности (in, not in).
- Операторы идентичности (is, is not).
- Битовые операторы.
- Тернарный оператор.
- Модуль 4: Ввод и вывод данных
- Модуль 5: Условные конструкции
- Модуль 6: Циклы
- Модуль 7: Строки
- Модуль 8: Списки
- Модуль 9: Кортежи
- Модуль 10: Словари
- Модуль 11: Множества
- Модуль 12: Функции
- Модуль 13: Встроенные функции
- Модуль 14: Работа с файлами
- Модуль 15: Обработка исключений
- Модуль 16: Модули и пакеты
- Модуль 17: ООП - Основы
- Модуль 18: ООП - Продвинутый уровень
- Модуль 19: Декораторы
- Модуль 20: Генераторы и итераторы
- Модуль 21: Регулярные выражения
- Модуль 22: Дата и время
- Модуль 23: Математические операции
- Модуль 24: Работа с сетью
- Модуль 25: Асинхронное программирование
- Модуль 26: Многопоточность
- Модуль 27: Тестирование
- Модуль unittest.
- Написание тестов.
- Модуль 28: Базы данных
- Модуль 29: Алгоритмы и структуры данных
- Модуль 30: Продвинутые возможности
Методы assertions и их назначение
В unittest есть множество методов для проверки различных условий. Сопоставьте название метода с тем, что именно он проверяет. Это базовый набор, который используется в большинстве тестов.
assertIn(a, b)assertRaises(Exception)assertEqual(a, b)assertIsNone(x)assertTrue(x)Результат выполнения теста
Проанализируйте тестовый код. Функция get_status возвращает строку в зависимости от числа. Тест проверяет результат для значения 150. Что произойдёт при запуске этого теста?
def get_status(score):
if score >= 100:
return 'excellent'
elif score >= 50:
return 'good'
return 'poor'
class TestStatus(unittest.TestCase):
def test_high_score(self):
result = get_status(150)
self.assertEqual(result, 'good')Исправьте ошибки в тестовом классе
В этом тестовом классе допущено две ошибки. Одна связана с наследованием, другая — с именованием тестового метода. Найдите и исправьте обе строки, чтобы тест корректно запустился и был обнаружен unittest.
import unittest class TestCalculator(unittest.Test): def check_addition(self): self.assertEqual(5 + 3, 8)Тестирование исключений
Заполните пропуски, чтобы тест проверял, что функция divide выбрасывает исключение ZeroDivisionError при делении на ноль. Используйте контекстный менеджер для перехвата исключения.
def divide(a, b):
return a / b
class TestDivision(unittest.TestCase):
def test_divide_by_zero(self):
input1S self.input2S(input3S):
divide(10, 0)Классификация методов assertions
Распределите методы assertions по категориям в зависимости от того, что они проверяют: сравнение значений, проверку типов/идентичности или работу с коллекциями.
assertEqualassertNotEqualassertIsNoneassertTrueassertInassertNotInassertIsassertGreaterСоберите тест с setUp
Соберите тестовый класс, в котором метод setUp создаёт список с числами [1, 2, 3], а тестовый метод проверяет, что длина этого списка равна 3. Две строки лишние.
class TestList(unittest.TestCase): def setUp(self): self.numbers = [1, 2, 3] def test_length(self): self.assertEqual(len(self.numbers), 3) def tearDown(self): self.numbers = []Сколько тестов будет запущено?
Посмотрите на тестовый класс. Сколько тестовых методов будет обнаружено и запущено unittest? Введите число.
class TestExample(unittest.TestCase):
def setUp(self):
self.value = 10
def test_positive(self):
self.assertGreater(self.value, 0)
def helper_method(self):
return self.value * 2
def test_not_zero(self):
self.assertNotEqual(self.value, 0)
def check_value(self):
self.assertTrue(self.value)
def test_type(self):
self.assertIsInstance(self.value, int)Проверка вхождения в строку
Напишите тест, который проверяет, что строка 'Hello, World!' содержит подстроку 'World'. Используйте подходящий метод assertion.
class TestString(unittest.TestCase):
def test_contains_world(self):
message = 'Hello, World!'
self.input1S(input2S, input3S)Порядок выполнения в тестовом классе
Расставьте события в том порядке, в котором они происходят при запуске unittest для класса с двумя тестовыми методами и методами setUp/tearDown.
Тест с assertIs
Метод assertIs проверяет идентичность объектов (что это один и тот же объект в памяти, а не просто равные значения). Что произойдёт при запуске этого теста?
class TestIdentity(unittest.TestCase):
def test_lists(self):
a = [1, 2, 3]
b = [1, 2, 3]
self.assertIs(a, b)Исправьте тест с assertRaises
Этот тест должен проверять, что при передаче отрицательного числа в функцию sqrt возникает ValueError. Но в коде есть ошибки: неправильно используется assertRaises и неверно указан тип исключения. Исправьте.
import mathimport unittest class TestSqrt(unittest.TestCase): def test_negative_sqrt(self): with self.assertRaises('ValueError'): result = math.sqrt(-1)Тест с несколькими assertions
Заполните пропуски, чтобы создать тест, проверяющий функцию create_user. Тест должен убедиться, что: 1) результат не None, 2) имя пользователя равно 'Alice', 3) возраст больше 0.
def create_user(name, age):
return {'name': name, 'age': age}
class TestUser(unittest.TestCase):
def test_create_user(self):
user = create_user('Alice', 25)
self.input1S(user)
self.input2S(user['name'], input3S)
self.input4S(user['age'], 0)Соберите полный тестовый модуль
Соберите полноценный тестовый модуль, который можно запустить как скрипт. Модуль должен: импортировать unittest, определить тестовый класс с одним тестом, и содержать стандартную конструкцию для запуска тестов. Три строки лишние.
import unittestclass TestBasic(unittest.TestCase): def test_true(self): self.assertTrue(True)if __name__ == '__main__': unittest.main()import pytest unittest.run()class TestBasic(unittest.Test):Результат assertEqual со списками
Тест сравнивает два списка с помощью assertEqual. Списки содержат одинаковые элементы, но в разном порядке. Пройдёт ли тест? Введите OK если пройдёт, или FAIL если упадёт.
class TestLists(unittest.TestCase):
def test_same_elements(self):
expected = [1, 2, 3]
actual = [3, 2, 1]
self.assertEqual(expected, actual)