Введение
В этом практическом занятии мы научимся писать юнит-тесты для нашего кода на Python с использованием встроенного модуля unittest. Мы начнем с простой функции и затем перейдем к тестированию более сложного кода, включая код, взаимодействующий с базами данных.
Предварительные условия
Прежде чем начать это практическое занятие, вы должны иметь базовое понимание языка программирования Python. Также вы должны быть знакомы с написанием функций на Python.
Добавить число
Настройка
Для начала нам нужно создать новый файл на Python для наших тестов. Назовем его test_my_code.py. Также мы создадим модуль, содержащий код, который мы хотим протестировать. Назовем этот модуль my_code.py.
Простой тест
Начнем с простой функции, которая возвращает сумму двух чисел. В my_code.py создайте функцию под названием add_numbers, которая принимает два аргумента и возвращает их сумму.
def add_numbers(a, b):
return a + b
Теперь напишем тест для этой функции в test_my_code.py. Во - первых, нам нужно импортировать модуль unittest и функцию add_numbers.
import unittest
from my_code import add_numbers
Далее мы создадим класс под названием TestAddNumbers, который наследуется от unittest.TestCase.
class TestAddNumbers(unittest.TestCase):
pass
Внутри этого класса мы создадим метод под названием test_add_numbers, который будет тестировать функцию add_numbers. Мы будем использовать метод assertEqual, чтобы проверить, возвращает ли функция правильную сумму.
class TestAddNumbers(unittest.TestCase):
def test_add_numbers(self):
result = add_numbers(2, 3)
self.assertEqual(result, 5)
Теперь мы можем запустить наши тесты с помощью следующей команды:
python -m unittest test_my_code.py
Если тест пройден, вы должны увидеть вывод вроде следующего:
...
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Точка (.) означает, что один тест пройден.
Тестирование исключений
Далее, давайте протестируем функцию, которая вызывает исключение. В my_code.py создайте функцию под названием divide, которая принимает два аргумента и возвращает их частное. Если второй аргумент равен нулю, функция должна вызывать исключение ZeroDivisionError.
def divide(a, b):
if b == 0:
raise ZeroDivisionError('Cannot divide by zero')
return a / b
Теперь напишем тест для этой функции в test_my_code.py. Мы будем использовать метод assertRaises, чтобы проверить, вызывает ли функция исключение ZeroDivisionError, когда второй аргумент равен нулю.
class TestDivide(unittest.TestCase):
def test_divide_by_zero(self):
with self.assertRaises(ZeroDivisionError):
divide(1, 0)
Теперь мы можем снова запустить наши тесты:
python -m unittest test_my_code.py
Если тест пройден, вы должны увидеть вывод вроде следующего:
...
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Две точки (..) означают, что два теста пройдены.
Тестирование с использованием баз данных
Наконец, давайте протестируем некоторый код, который взаимодействует с базой данных. Для примера мы будем использовать SQLite и модуль sqlite3.
В my_code.py создайте функцию под названием create_table, которая создает новую таблицу в базе данных SQLite.
import sqlite3
def create_table():
conn = sqlite3.connect('my_database.db')
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)')
conn.commit()
conn.close()
В этом коде мы создаем новую таблицу базы данных SQLite под названием "my_table" с двумя столбцами: "id" и "name". Затем мы определяем тестовый класс под названием TestCreateTable с методом setUp, который создает базу данных SQLite для тестирования.
Теперь напишем тест для функции create_table. Во - первых, нам нужно создать новую базу данных для тестирования. Мы это сделаем в методе настройки, который запускается перед каждым тестом.
class TestCreateTable(unittest.TestCase):
def setUp(self):
self.conn = sqlite3.connect('my_database.db')
def test_create_table(self):
create_table()
c = self.conn.cursor()
c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='my_table'")
result = c.fetchone()
self.assertIsNotNone(result)
В методе setUp мы создаем новую базу данных SQLite.
В методе test_create_table мы вызываем функцию create_table и затем проверяем, была ли таблица создана с использованием SQL-запроса.
Теперь мы можем снова запустить наши тесты:
python -m unittest test_my_code.py
Если тест пройден, вы должны увидеть вывод вроде следующего:
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
Три точки (...) означают, что три теста пройдены.
Резюме
В этом практическом занятии мы научились писать юнит-тесты для нашего кода на Python с использованием модуля unittest. Мы начали с простой функции и затем перешли к тестированию более сложного кода, включая код, взаимодействующий с базами данных. С этими знаниями вы можете писать тесты для своего кода на Python, чтобы убедиться, что он работает как ожидается, и выявлять ошибки на ранних этапах разработки.



