Тестирование вашего кода

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Предварительные условия

Прежде чем начать это практическое занятие, вы должны иметь базовое понимание языка программирования Python. Также вы должны быть знакомы с написанием функций на Python.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/function_definition -.-> lab-247{{"Тестирование вашего кода"}} python/arguments_return -.-> lab-247{{"Тестирование вашего кода"}} python/importing_modules -.-> lab-247{{"Тестирование вашего кода"}} python/catching_exceptions -.-> lab-247{{"Тестирование вашего кода"}} python/raising_exceptions -.-> lab-247{{"Тестирование вашего кода"}} python/custom_exceptions -.-> lab-247{{"Тестирование вашего кода"}} python/file_operations -.-> lab-247{{"Тестирование вашего кода"}} end

Сложение чисел

Настройка

Для начала нам нужно создать новый файл на 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, чтобы убедиться, что он работает как ожидается, и выявлять ошибки на ранних этапах разработки.