Appearance
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. Он позволяет создавать и запускать тесты, используя простой и понятный синтаксис. Использование тестирования помогает разработчикам писать более надежный и качественный код, что в конечном итоге приводит к более успешным проектам.
Упражнения
"Тестирование калькулятора" Создайте класс Calculator с базовыми операциями и напишите для него полный набор тестов.
"Валидация email" Реализуйте функцию проверки email-адреса и протестируйте её на различных входных данных.
"Работа с файлами" Напишите тесты для функций работы с файлами, используя временные файлы и директории.
"Тестирование исключений" Создайте набор тестов для проверки правильности выбрасывания и обработки исключений.
"База данных пользователей" Реализуйте простую базу данных пользователей и протестируйте операции CRUD.
"Тестирование асинхронного кода" Напишите тесты для асинхронных функций с использованием async/await.
"Параметризованные тесты" Создайте тесты с различными наборами входных данных, используя параметризацию.