Модуль unittest

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

Тренажер по Python

Модуль unittest — это встроенный инструмент Python для написания и запуска тестов. Он помогает убедиться, что код работает так, как задумано, и не ломается при изменениях. В этом тренажере ты научишься создавать тестовые классы, писать тестовые методы, использовать различные assert-методы для проверки условий, а также настраивать окружение с помощью setUp и tearDown. Тестирование — это не просто "проверка на ошибки", это способ документировать ожидаемое поведение кода и защитить его от регрессий в будущем. Здесь ты попрактикуешься в написании тестов с нуля, исправлении ошибок в тестовом коде, определении результатов выполнения тестов и правильной организации тестовых сценариев.

Список тем

Сопоставьте assert-методы с их назначением

id: 40167_task2

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

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Проверяет, что два значения равны
Проверяет, что значение истинно (True)
Проверяет, что элемент содержится в коллекции
Проверяет, что два значения НЕ равны
Проверяет, что выражение вызывает исключение
assertRaises
assertNotEqual
assertEqual
assertIn
assertTrue
Сообщения
Проверить
Показать подсказку

Какой будет результат теста?

id: 40167_task3

Проанализируйте тестовый метод и определите, каким будет результат его выполнения: пройдёт тест или упадёт с ошибкой.

Выберите правильный вариант ответа
import unittest

class TestList(unittest.TestCase):
    def test_membership(self):
        fruits = ['apple', 'banana', 'cherry']
        self.assertIn('mango', fruits)

if __name__ == '__main__':
    unittest.main()
Сообщения
Проверить
Показать подсказку

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

id: 40167_task4

В этом тестовом коде есть ошибка, из-за которой тестовый метод не будет обнаружен и запущен фреймворком unittest. Найдите и исправьте проблемную строку.

Найдите ошибку и исправьте
import unittest
 
class TestString(unittest.TestCase):
    def check_upper(self):
        self.assertEqual('hello'.upper(), 'HELLO')
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите тест с использованием setUp

id: 40167_task5

Метод setUp вызывается перед каждым тестовым методом и используется для подготовки тестового окружения. Заполните пропуски, используя токены из банка, чтобы создать тест со списком, который инициализируется в setUp.

Нужно правильно расставить в пропуски предложенные варианты
import unittest

class TestNumbers(unittest.TestCase):
    def input1S(self):
        input2S.numbers = [1, 2, 3, 4, 5]
    
    def test_sum(self):
        result = sum(input3S.numbers)
        self.assertEqual(result, input4S)
setUp
self
15
tearDown
numbers
10
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

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

id: 40167_task6

При запуске тестов методы выполняются в определённом порядке. Расставьте строки вывода в том порядке, в котором они появятся в консоли при запуске этого теста.

Расставьте строки в правильном порядке
Вывод: "tearDown executed"
Вывод: "test_example executed"
Вывод: "setUpClass executed"
Вывод: "tearDownClass executed"
Вывод: "setUp executed"
Сообщения
Проверить
Показать подсказку

Классифицируйте assert-методы по типу проверки

id: 40167_task7

В unittest есть разные группы assert-методов. Распределите методы по категориям: проверка равенства, проверка булевых значений и проверка исключений.

Перетяните элементы в соответствующие блоки
Проверка равенства
Проверка булевых значений
Проверка исключений
assertRaises
assertEqual
assertTrue
assertNotEqual
assertFalse
assertRaisesRegex
Сообщения
Проверить
Показать подсказку

Сколько тестов будет выполнено?

id: 40167_task8

Посмотрите на тестовый класс и определите, сколько тестовых методов будет обнаружено и выполнено фреймворком unittest.

Что должно получиться?
import unittest

class TestCalculator(unittest.TestCase):
    def setUp(self):
        self.calc_value = 100
    
    def helper_method(self):
        return self.calc_value * 2
    
    def test_addition(self):
        self.assertEqual(5 + 5, 10)
    
    def test_subtraction(self):
        self.assertEqual(10 - 3, 7)
    
    def check_multiplication(self):
        self.assertEqual(3 * 3, 9)
    
    def test_division(self):
        self.assertEqual(10 / 2, 5)
    
    def tearDown(self):
        pass
Сообщения
Проверить
Показать подсказку

Соберите тест на проверку исключения

id: 40167_task9

Соберите тестовый метод, который проверяет, что при делении на ноль возникает исключение ZeroDivisionError. Используйте конструкцию with и метод assertRaises.

Перетяните в правильном порядке строки из одного блока в другой
def test_zero_division(self):
    with self.assertRaises(ZeroDivisionError):
        result = 10 / 0
    with self.assertRaises(ValueError):
        result = 10 / 0
def check_zero_division(self):
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Что выведет unittest.main()?

id: 40167_task10

Проанализируйте тестовый класс с двумя тестами. Один тест проходит, другой — падает. Какой итоговый вывод покажет unittest?

Выберите правильный вариант ответа
import unittest

class TestSimple(unittest.TestCase):
    def test_pass(self):
        self.assertEqual(1 + 1, 2)
    
    def test_fail(self):
        self.assertEqual(1 + 1, 3)

# Запуск: python -m unittest
Сообщения
Проверить
Показать подсказку

Тест с использованием assertAlmostEqual

id: 40167_task11

При работе с числами с плавающей точкой прямое сравнение может давать неожиданные результаты. Заполните пропуски, чтобы создать тест, проверяющий результат деления с допустимой погрешностью.

Заполните пропуски
import unittest

class TestFloat(unittest.TestCase):
    def test_division(self):
        result = 10 / 3
        # Проверяем, что результат примерно равен 3.333... с точностью до 2 знаков
        self.input1S(result, input2S, places=input3S)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Исправьте тест с декоратором skip

id: 40167_task12

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

Найдите ошибку и исправьте
import unittest
 
class TestFeature(unittest.TestCase):
    @unittest.skipTest("Not implemented yet")
    def test_new_feature(self):
        self.assertTrue(False)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

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

id: 40167_task13

Соберите полноценный тестовый файл с импортом, тестовым классом, setUp-методом, тестовым методом и блоком запуска. Расположите строки в правильном порядке.

Перетяните в правильном порядке строки из одного блока в другой
class TestStack(unittest.TestCase):
import unittest
    def test_push(self):
        self.stack.append(10)
        self.assertEqual(len(self.stack), 1)
    def setUp(self):
        self.stack = []
if __name__ == '__main__':
    unittest.main()
from collections import deque
    def setUp():
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

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

id: 40167_task14

Проанализируйте тест, который проверяет работу со списком. Ответьте: пройдёт тест или нет? Введите OK если пройдёт, или FAIL если упадёт.

Что должно получиться?
import unittest

class TestListOps(unittest.TestCase):
    def test_sort(self):
        data = [3, 1, 4, 1, 5]
        data.sort()
        self.assertListEqual(data, [1, 1, 3, 4, 5])
Сообщения
Проверить
Показать подсказку

Тест с несколькими assert-проверками

id: 40167_task15

В одном тестовом методе несколько проверок. Первая проверка падает. Что произойдёт с остальными проверками?

Выберите правильный вариант ответа
import unittest

class TestMultiple(unittest.TestCase):
    def test_sequence(self):
        self.assertEqual(1, 2)      # Первая проверка
        self.assertEqual(3, 3)      # Вторая проверка  
        self.assertEqual(5, 5)      # Третья проверка
        print("All passed!")
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру