Написание тестов

Тренажер по Python для пользователей с начальным уровнем подготовки.

Тренажер по Python

Тестирование кода — это не просто "проверка, что работает". Это способ документировать поведение программы, ловить баги до того, как они доберутся до пользователей, и спокойно рефакторить код, зная, что ничего не сломалось. В Python для этого есть встроенный модуль unittest, который предоставляет всё необходимое: создание тестовых классов, методы проверки (assertions), фикстуры для подготовки окружения.

В этом тренажере ты научишься писать тесты с нуля: от простых проверок assertEqual до работы с исключениями и настройкой setUp/tearDown. Задания построены от базовых концепций к более сложным сценариям. Каждый тест — это маленькая спецификация того, как должен работать твой код. Погнали разбираться!

Список тем

Методы assertions и их назначение

id: 40168_task1

В unittest есть множество методов для проверки различных условий. Сопоставьте название метода с тем, что именно он проверяет. Это базовый набор, который используется в большинстве тестов.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Проверяет, что два значения равны
Проверяет, что выражение истинно
Проверяет, что значение равно None
Проверяет, что элемент содержится в коллекции
Проверяет, что код выбрасывает исключение
assertIn(a, b)
assertRaises(Exception)
assertEqual(a, b)
assertIsNone(x)
assertTrue(x)
Сообщения
Проверить
Показать подсказку

Результат выполнения теста

id: 40168_task3

Проанализируйте тестовый код. Функция 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')
Сообщения
Проверить
Показать подсказку

Исправьте ошибки в тестовом классе

id: 40168_task4

В этом тестовом классе допущено две ошибки. Одна связана с наследованием, другая — с именованием тестового метода. Найдите и исправьте обе строки, чтобы тест корректно запустился и был обнаружен unittest.

Найдите ошибку и исправьте
import unittest
 
class TestCalculator(unittest.Test):
    def check_addition(self):
        self.assertEqual(5 + 3, 8)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Тестирование исключений

id: 40168_task5

Заполните пропуски, чтобы тест проверял, что функция 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)
with
assertRaises
ZeroDivisionError
assertEqual
ValueError
try
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Классификация методов assertions

id: 40168_task6

Распределите методы assertions по категориям в зависимости от того, что они проверяют: сравнение значений, проверку типов/идентичности или работу с коллекциями.

Перетяните элементы в соответствующие блоки
Сравнение значений
Типы и идентичность
Работа с коллекциями
assertEqual
assertNotEqual
assertIsNone
assertTrue
assertIn
assertNotIn
assertIs
assertGreater
Сообщения
Проверить
Показать подсказку

Соберите тест с setUp

id: 40168_task7

Соберите тестовый класс, в котором метод 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 = []
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Сколько тестов будет запущено?

id: 40168_task8

Посмотрите на тестовый класс. Сколько тестовых методов будет обнаружено и запущено 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)
Сообщения
Проверить
Показать подсказку

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

id: 40168_task9

Напишите тест, который проверяет, что строка 'Hello, World!' содержит подстроку 'World'. Используйте подходящий метод assertion.

Заполните пропуски
class TestString(unittest.TestCase):
    def test_contains_world(self):
        message = 'Hello, World!'
        self.input1S(input2S, input3S)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Порядок выполнения в тестовом классе

id: 40168_task10

Расставьте события в том порядке, в котором они происходят при запуске unittest для класса с двумя тестовыми методами и методами setUp/tearDown.

Расставьте строки в правильном порядке
Вызов setUp()
Выполнение первого теста
Вызов tearDown()
Вызов setUp()
Выполнение второго теста
Вызов tearDown()
Сообщения
Проверить
Показать подсказку

Тест с assertIs

id: 40168_task11

Метод assertIs проверяет идентичность объектов (что это один и тот же объект в памяти, а не просто равные значения). Что произойдёт при запуске этого теста?

Выберите правильный вариант ответа
class TestIdentity(unittest.TestCase):
    def test_lists(self):
        a = [1, 2, 3]
        b = [1, 2, 3]
        self.assertIs(a, b)
Сообщения
Проверить
Показать подсказку

Исправьте тест с assertRaises

id: 40168_task12

Этот тест должен проверять, что при передаче отрицательного числа в функцию sqrt возникает ValueError. Но в коде есть ошибки: неправильно используется assertRaises и неверно указан тип исключения. Исправьте.

Найдите ошибку и исправьте
import math
import unittest
 
class TestSqrt(unittest.TestCase):
    def test_negative_sqrt(self):
        with self.assertRaises('ValueError'):
            result = math.sqrt(-1)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Тест с несколькими assertions

id: 40168_task13

Заполните пропуски, чтобы создать тест, проверяющий функцию 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)
assertIsNotNone
assertEqual
'Alice'
assertGreater
assertLess
None
'Bob'
assertIsNone
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите полный тестовый модуль

id: 40168_task14

Соберите полноценный тестовый модуль, который можно запустить как скрипт. Модуль должен: импортировать unittest, определить тестовый класс с одним тестом, и содержать стандартную конструкцию для запуска тестов. Три строки лишние.

Перетяните в правильном порядке строки из одного блока в другой
import unittest
class TestBasic(unittest.TestCase):
    def test_true(self):
        self.assertTrue(True)
if __name__ == '__main__':
    unittest.main()
import pytest
    unittest.run()
class TestBasic(unittest.Test):
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Результат assertEqual со списками

id: 40168_task15

Тест сравнивает два списка с помощью assertEqual. Списки содержат одинаковые элементы, но в разном порядке. Пройдёт ли тест? Введите OK если пройдёт, или FAIL если упадёт.

Что должно получиться?
class TestLists(unittest.TestCase):
    def test_same_elements(self):
        expected = [1, 2, 3]
        actual = [3, 2, 1]
        self.assertEqual(expected, actual)
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру