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