Методы класса TestCase модуля Unittest. Автоматизированное тестирование в Python.

setUp

Метод вызывается перед запуском каждого теста и позволяет избегать дублирования кода по созданию экземпляра тестируемого класса.

Пример без setUp:

from unittest import TestCase
from models import Student


class StudentTestCase(TestCase):
    def test_default_name_is_none(self):
        student = Student()
        self.assertIsNone(student.name)
    def test_set_invalid_age(self):
        student = Student()
        with self.assertRaises(ValueError):
            student.set_age(-100)

Пример с setUp:

from unittest import TestCase
from models import Student


class StudentTestCase(TestCase):
    def setUp(self):
        self.student = Student()

    def test_default_name_is_none(self):
        self.asserIsNone(self.student.name)

    def test_set_invalid_age(self):
        with self.assertRaises(ValueError):
            self.student.set_age(-100)

Assert-методы

Проверяют соответствие условию. Наиболее популярные:

МетодПроверяет
assertEqual(a, b)a == b
assertNotEqual(a, b)a != b
assertTrue(x)bool(x) is True
assertFalse(x)bool(x) is False
assertIs(a, b)a is b
assertIsNot(a, b)a is not b
assertIsNone(x)x is None
assertIsNotNone(x)x is not None
assertIn(a, b)a in b
assertNotIn(a, b)a not in b
assertIsInstance(a, b)isinstance(a, b)
assertNotIsInstance(a, b)not isinstance(a, b)

tearDown

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

В связке с setUp можно замерять время работы теста:

import time
from unittest import TestCase


class PerformanceTest(TestCase):

    def setUp(self):
        self.start = time.perf_counter()

    def tearDown(self):
        self.end = time.perf_counter()
        print(self.id(), self.end - self.start)

    def test_million_appends(self):
        N = 1_000_000
        lst = []
        for i in range(N):
            lst.append(i)
        self.assertListEqual(lst, list(range(N)))

time.perf_counter() возвращает текущее время с наибольшим доступным разрешением.

self.id() выдает название текущего теста.

setUpClass

Метод вызывается перед запуском всех тестов в этом классе и позволяет задать общие настройки, открыть ресурсы, которые будут использованы всеми тестами. Например, создать тестовый клиент Flask-приложения:

from unittest import TestCase
from hello_word_with_day import app


class TestHelloWorldWithDayApp(TestCase):

    @classmethod
    def setUpClass(cls):
        app.config['TESTING'] = True
        app.config['DEBUG'] = False
        cls.app = app.test_client()
        cls.base_url: str = '/hello-world/'

    def test_can_get_correct_username_with_weekdate(self):
        username: str = 'username'
        response = self.app.get(self.base_url + username)
        response_text: str = response.data.decode()
        self.assertIn(username, response_text)

Декоратор classmethod используется, так как сам метод классовый.

tearDownClass

Метод вызывается после завершения всех тестов в классе и позволяет закрыть ресурсы, которые были открыты в setUpClass. А также очистить данные, созданные в результате тестирования. Например, в setUpClass мы можем открыть файл, в который будем складывать результаты тестирования. А в tearDownClass — закрыть его.

import time
from unittest import TestCase


class PerformanceTest(TestCase):

    @classmethod
    def setUpClass(cls):
        cls.file = open("test_log.txt", "a")

    def setUp(self):
        self.start = time.perf_counter()

    def test_million_appends(self):
        N = 1_000_000
        lst = []
        for i in range(N):
            lst.append(i)
        self.assertListEqual(lst, list(range(N)))

    def test_sum_of_numbers(self):
        N = 1_000_000
        self.assertEqual(sum(range(N)), N * (N + 1) // 2)

    def tearDown(self):
        self.end = time.perf_counter()
        print(self.id(), self.end - self.start, file=self.file)

    @classmethod
    def tearDownClass(cls):
        cls.file.close()

В setUp и setUpClass мы открываем ресурсы, настраиваем тестируемый объект, создаём необходимые файлы, подключаемся к базе данных. В tearDown и tearDownClass — закрываем ресурсы, удаляем созданные файлы, отключаемся от базы данных.

Ссылка на документацию.

Если есть вопросы, заходите в чат почти программистов.