May 29, 2024

Урок: Тестирование кода

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

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

Введение в юнит-тестирование

Юнит-тестирование — это метод тестирования, при котором тестируются отдельные компоненты кода, такие как функции и методы классов. Основная цель юнит-тестирования — изолированно проверить каждый компонент и убедиться, что он работает правильно.

Использование unittest

unittest — это встроенная библиотека Python для написания и выполнения тестов.

  1. Пример использования unittest:
import unittest

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

class TestMathFunctions(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(3, 4), 7)
        self.assertEqual(add(-1, 1), 0)
        self.assertEqual(add(-1, -1), -2)

    def test_subtract(self):
        self.assertEqual(subtract(10, 5), 5)
        self.assertEqual(subtract(-1, 1), -2)
        self.assertEqual(subtract(-1, -1), 0)

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

В этом примере функции add и subtract тестируются с помощью unittest. Класс TestMathFunctions содержит тестовые методы test_add и test_subtract, которые используют метод assertEqual для проверки ожидаемых результатов.

Использование pytest

pytest — это популярная библиотека для тестирования в Python, которая предоставляет более гибкие и удобные инструменты по сравнению с unittest.

  1. Пример использования pytest:
test_math_functions.py

import pytest

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def test_add():
    assert add(3, 4) == 7
    assert add(-1, 1) == 0
    assert add(-1, -1) == -2

def test_subtract():
    assert subtract(10, 5) == 5
    assert subtract(-1, 1) == -2
    assert subtract(-1, -1) == 0

if __name__ == "__main__":
    pytest.main()

В этом примере функции add и subtract тестируются с помощью pytest. Тестовые функции test_add и test_subtract используют ключевое слово assert для проверки ожидаемых результатов.

Написание и запуск тестов

  1. Создание тестов с использованием unittest:
math_functions.py

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# test_math_functions.py
import unittest
from math_functions import add, subtract

class TestMathFunctions(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(3, 4), 7)
        self.assertEqual(add(-1, 1), 0)
        self.assertEqual(add(-1, -1), -2)

    def test_subtract(self):
        self.assertEqual(subtract(10, 5), 5)
        self.assertEqual(subtract(-1, 1), -2)
        self.assertEqual(subtract(-1, -1), 0)

if __name__ == "__main__":
    unittest.main()
  1. Запуск тестов с использованием unittest:

Сохраните код в файле test_math_functions.py и выполните команду:

python test_math_functions.py
  1. Создание тестов с использованием pytest:
math_functions.py

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# test_math_functions.py
import pytest
from math_functions import add, subtract

def test_add():
    assert add(3, 4) == 7
    assert add(-1, 1) == 0
    assert add(-1, -1) == -2

def test_subtract():
    assert subtract(10, 5) == 5
    assert subtract(-1, 1) == -2
    assert subtract(-1, -1) == 0

if __name__ == "__main__":
    pytest.main()
  1. Запуск тестов с использованием pytest:

Сохраните код в файле test_math_functions.py и выполните команду:

pytest test_math_functions.py

Практическое задание

  1. Напишите тесты для функции, которая вычисляет факториал числа.
  2. Напишите тесты для функции, которая проверяет, является ли число простым.
  3. Напишите тесты для функции, которая возвращает наибольший общий делитель (НОД) двух чисел.
math_functions.py

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

# test_math_functions.py
import pytest
from math_functions import factorial, is_prime, gcd

def test_factorial():
    assert factorial(0) == 1
    assert factorial(5) == 120
    assert factorial(7) == 5040

def test_is_prime():
    assert not is_prime(0)
    assert not is_prime(1)
    assert is_prime(2)
    assert is_prime(3)
    assert not is_prime(4)
    assert is_prime(17)

def test_gcd():
    assert gcd(54, 24) == 6
    assert gcd(48, 18) == 6
    assert gcd(101, 103) == 1

if __name__ == "__main__":
    pytest.main()

В первом задании создается функция factorial и тесты для нее. Во втором задании создается функция is_prime и тесты для нее. В третьем задании создается функция gcd и тесты для нее.

Этот урок охватывает основы юнит-тестирования в Python, включая использование библиотек unittest и pytest, а также написание и запуск тестов. Практикуйтесь для лучшего понимания и освоения материала.