Skip to content

Unittest модуль

Тестирование кода является важным аспектом разработки программного обеспечения, так как оно позволяет обеспечить надежность и корректность работы программ. В Python один из самых популярных способов тестирования — это использование модуля unittest, который входит в стандартную библиотеку языка.

Основы unittest

Модуль unittest предоставляет фреймворк для создания и запуска тестов. Он основан на концепции тестовых кейсов (test cases) и тестовых сьютов (test suites). Тестовый кейс — это класс, который наследуется от unittest.TestCase, и содержит методы, выполняющие тесты.

TestCase

TestCase - это базовый класс в Unittest, который используется для создания тестовых случаев. Каждый тестовый случай должен наследоваться от TestCase. Внутри этого класса определяются методы, начинающиеся с test_, которые будут автоматически обнаружены и выполнены.

Пример создания простого тестового кейса:

python
import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

В этом примере мы создали класс TestStringMethods, который наследуется от unittest.TestCase. В этом классе определены три метода тестирования: test_upper, test_isupper и test_split. Каждый метод начинается с префикса test, что позволяет unittest автоматически находить и запускать эти методы.

Assertions - утверждения

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

  • self.assertEqual(a, b): Проверяет, что a равно b.
  • assertNotEqual(a, b): Проверяет, что a не равно b.
  • self.assertTrue(x): Проверяет, что x истинно.
  • self.assertFalse(x): Проверяет, что x ложно.
  • self.assertIn(a, b): Проверяет, что a находится в b.
  • assertIsNone(obj): Проверяет, что obj равен None.
  • self.assertRaises(Exception, callable, *args, **kwargs): Проверяет, что вызов callable(*args, **kwargs) вызывает исключение Exception.

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

Список тестов можно расширять.

python
import unittest

class TestString(unittest.TestCase):
# class StringMethods(unittest.TestCase):
# class TestStringMethods:

    # def go_upper(self):
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO', 'my message!!')
        self.assertEqual('foO'.upper(), 'FOO')
        self.assertEqual(''.upper(), '')
        self.assertEqual('2'.upper(), '2')
        self.assertEqual('2d'.upper(), '2D')

        with self.assertRaises(TypeError):
            '2d'.upper(645)

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertTrue('1A'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_isdigit(self):
        # lin= "lkjsaf"*100000000000000000000000000

        self.assertTrue('1'.isdigit())
        self.assertTrue('0'.isdigit())
        self.assertTrue('546430'.isdigit())

        self.assertFalse(''.isdigit())
        self.assertFalse('1.5'.isdigit())
        self.assertFalse('1,5'.isdigit())
        self.assertFalse('jhv'.isdigit())
        self.assertFalse('5l'.isdigit())
        self.assertFalse(' '.isdigit())
        self.assertFalse('-5'.isdigit())
        self.assertFalse('-1.5'.isdigit())
        self.assertFalse('1 000'.isdigit())
        self.assertFalse(' 1 '.isdigit())
        self.assertFalse('1-'.isdigit())
        self.assertFalse('+1'.isdigit())

    def test_split(self):
        self.assertEqual('hello world'.split(), ['hello', 'world'])
        self.assertEqual('hello    world'.split(), ['hello', 'world'])
        self.assertEqual('   hello   world    '.split(), ['hello', 'world'])
        self.assertEqual('helloworld'.split(), ['helloworld'])
        self.assertEqual('hello, world'.split(), ['hello,', 'world'])
        self.assertEqual('hello world'.split(' '), ['hello', 'world'])
        self.assertEqual('hello    world'.split(' '), ['hello', '', '', '', 'world'])
        self.assertEqual('   hello world   '.split(' '), ['', '', '', 'hello', 'world', '', '', ''])
        # ''.split(564)
        with self.assertRaises(TypeError):
            ''.split(2)

if __name__ == '__main__':
    unittest.main()

Запуск тестов

Тесты можно запускать двумя способами: внутри скрипта с помощью unittest.main() или внешним способом через командную строку.

При запуске скрипта с if __name__ == '__main__': unittest.main(), Python автоматически находит и запускает все тестовые кейсы в текущем модуле.

Чтобы запустить тесты из командной строки, используйте:

sh
python -m unittest test_module

где test_module — это имя вашего модуля с тестами.

Заключение

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

Упражнения

  1. "Тестирование калькулятора" Создайте класс Calculator с базовыми операциями и напишите для него полный набор тестов.

  2. "Валидация email" Реализуйте функцию проверки email-адреса и протестируйте её на различных входных данных.

  3. "Работа с файлами" Напишите тесты для функций работы с файлами, используя временные файлы и директории.

  4. "Тестирование исключений" Создайте набор тестов для проверки правильности выбрасывания и обработки исключений.

  5. "База данных пользователей" Реализуйте простую базу данных пользователей и протестируйте операции CRUD.

  6. "Тестирование асинхронного кода" Напишите тесты для асинхронных функций с использованием async/await.

  7. "Параметризованные тесты" Создайте тесты с различными наборами входных данных, используя параметризацию.

Contacts: teffal@mail.ru