Модуль тестування за допомогою модуля unittest Python

Жоден хороший розробник не розгортає код без ретельного тестування. Модульне тестування — це процес тестування окремих модулів великої програми.

У цій статті буде обговорено, як можна виконати модульне тестування вашого коду за допомогою модуля Python unittest. Для початку розберемося, які бувають види тестування.

Коли справа доходить до тестування, існує ручне тестування та автоматичне тестування. Ручне тестування — це техніка тестування, коли люди виконують тест вручну після завершення розробки. Автоматизоване тестування – це техніка тестування, коли програми виконують тест автоматично та надають нам результати.

Ви б зрозуміли, що ручне тестування займає багато часу та його важко виконати. Отже, розробники пишуть код для виконання тестів (автоматичного тестування). В автоматизованому тестуванні є різні види тестування. Деякі з них – модульне тестування, інтегроване тестування, наскрізне тестування, стрес-тестування тощо.

Давайте подивимося стандартний потік тестування.

  • Напишіть або оновіть код.
  • Напишіть або оновіть тести для різних випадків для вашого коду.
  • Запустіть тести (вручну або за допомогою програми тестування).
  • Перегляньте результати тесту. Якщо є якісь помилки, виправте їх і повторіть кроки.

Тут ми обговоримо найважливіший і базовий тип тестування, який називається модульним тестуванням. Без зайвих слів, давайте зануримося в сам підручник.

Що таке модульне тестування?

Модульне тестування — це техніка тестування невеликого блоку незалежного коду. У більшості випадків дрібноблоковий код буде функцією. Слово незалежний означає, що він не залежить від інших фрагментів коду в проекті.

Скажімо, нам потрібно перевірити, чи дорівнює рядок “techukraine.net” чи ні. Для цього ми написали функцію, яка приймає один аргумент і повертає, дорівнює він “techukraine.net” чи ні.

def is_equal_to_geekflare(string):
	return string == "techukraine.net"

Наведена вище функція не залежить від жодного іншого коду. Отже, ми можемо перевірити це незалежно, надаючи різні вхідні дані. Незалежний фрагмент коду можна використовувати в проекті.

Важливість модульного тестування

Загалом код незалежних блоків можна використовувати в проекті. Отже, він повинен бути добре написаний і перевірений. Модульні тести — це тести, які використовуються для тестування тих типів незалежних блоків коду. Що станеться, якщо ми не будемо використовувати модульні тести для нашого проекту?

  Як перевірити акумулятор Apple TV Remote

Припустімо, що ми не тестували невеликі блоки коду, які використовуються в проекті. Усі інші тести, такі як інтеграційні тести, наскрізні тести тощо, з використанням інших невеликих блоків коду, можуть виявитися невдалими. Це порушує роботу програми. Ось чому базові будівельні блоки коду повинні бути добре перевірені.

Тепер ми знаємо важливість модульного тестування та письмових модульних тестів для всіх незалежних блоків коду. Оскільки ми проводили одиничні тести, інші тести, такі як інтеграційні тести, наскрізні тести тощо, не пройдуть через незалежний блок кодів.

У наступних розділах ми побачимо, що таке модуль unittest Python і як ми використовуємо модуль unittest для написання модульних тестів на Python.

Примітка: ми припускаємо, що ви знайомі з класами, модулями Python тощо. Якщо ви не знайомі з проміжними поняттями Python, такими як класи, модулі тощо, вам може бути важко зрозуміти наступні розділи.

Що таке модульний тест Python?

Python unittest — це вбудована платформа для тестування коду Python. У ньому є програма для запуску тестів, яка дозволяє запускати тести без особливих зусиль. Отже, ми можемо використовувати вбудований модуль unittest для тестування без використання сторонніх модулів. Але це змінюється залежно від ваших вимог. Вбудований модуль unittest добре підходить для початку тестування на Python.

Щоб перевірити код Python за допомогою модуля unittest, ми повинні виконати наведені нижче дії.

#1. Напишіть код.

#2. Імпортуйте модуль unittest.

#3. Створіть файл, починаючи з ключового слова test. Наприклад test_prime.py. Ключове слово test використовується для ідентифікації тестових файлів.

#4. Створіть клас, що розширює клас unittest.TestCase.

#5. Напишіть методи (тести) всередині класу. Кожен метод містить різні тестові випадки на основі ваших вимог. Ми повинні назвати метод, починаючи з ключового слова test.

#6. Виконайте тести. Ми можемо проводити тести різними способами.

  • Виконайте команду python -m unittest test_filename.py.
  • Ми запускаємо тестові файли як загальні файли Python за допомогою команди python test_filename.py. Щоб цей метод працював, нам потрібно викликати основний метод unittest у тестовому файлі.
  • І, нарешті, використання Discover. Ми можемо автоматично запускати тести за допомогою команди python -m unittest discover без згадки назви файлу тесту. Він знайде тести за умовами іменування, яких ми дотримувалися. Отже, ми повинні назвати наші тестові файли ключовим словом test на початку.
  Список кодів біткойн-майнерів Roblox: викупіть зараз

Як правило, під час тестування ми порівнюємо результат коду з очікуваним результатом. Отже, для порівняння результатів unittest надає різні методи. Ви можете знайти список функцій порівняння тут.

Ви можете легко зрозуміти їх без будь-яких труднощів. Вони прямолінійні.

Це багато теорії. Тепер ми повинні приступити до кодування.

Примітка. Якщо у вас є запитання щодо модуля unittest, ви можете перейти до документація і розвіяти свої сумніви. Без подальших зволікань скористаємося модулем unittest.

Модульні тести в Python за допомогою unittest

Спочатку ми напишемо деякі функції, а потім зосередимося на написанні тестів. Спочатку відкрийте папку у вашому улюбленому редакторі коду. І створіть файл під назвою utils.py. Вставте наступний код у файл.

import math


def is_prime(n):
    if n < 0:
        return 'Negative numbers are not allowed'

    if n <= 1:
        return False

    if n == 2:
        return True

    if n % 2 == 0:
        return False

    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True


def cubic(a):
    return a * a * a


def say_hello(name):
    return "Hello, " + name

У файлі utils.py є три різні функції. Тепер ми маємо перевірити кожну функцію за допомогою різних тестів. Давайте напишемо тести для першої функції is_prime.

#1. Створіть файл під назвою test_utils.py у папці зразка як utils.py.

#2. Імпортуйте утиліти та модуль unittest.

#3. Створіть клас із назвою TestUtils, що розширює клас unittest.TestCase. Назва класу може бути будь-якою. Спробуйте дати класу значущу назву.

#4. Усередині класу напишіть метод під назвою test_is_prime, який приймає себе як аргумент.

#5. Напишіть різні тестові приклади з аргументами для is_prime та порівняйте вихідні дані з очікуваними результатами.

#6. Приклад тесту self.assertFalse(utils.is_prime(1)).

#7. Ми очікуємо, що результат is_prime(1) буде false у наведеному вище випадку.

#8. Подібно до випадку вище, ми розглянемо різні тести на основі функції, яку тестуємо.

  Як завантажити файли за допомогою Safari на свій iPhone або iPad

Давайте подивимось тести.

import unittest

import utils


class TestUtils(unittest.TestCase):
    def test_is_prime(self):
        self.assertFalse(utils.is_prime(4))
        self.assertTrue(utils.is_prime(2))
        self.assertTrue(utils.is_prime(3))
        self.assertFalse(utils.is_prime(8))
        self.assertFalse(utils.is_prime(10))
        self.assertTrue(utils.is_prime(7))
        self.assertEqual(utils.is_prime(-3),
                         "Negative numbers are not allowed")


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

Ми викликаємо основний метод модуля unittest для запуску тестів за допомогою команди python filename.py. А тепер запустіть тести.

Ви побачите результат, подібний до наведеного нижче.

$ python test_utils.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

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

...


class TestUtils(unittest.TestCase):
    def test_is_prime(self):
        ...

    def test_cubic(self):
        self.assertEqual(utils.cubic(2), 8)
        self.assertEqual(utils.cubic(-2), -8)
        self.assertNotEqual(utils.cubic(2), 4)
        self.assertNotEqual(utils.cubic(-3), 27)

    def test_say_hello(self):
        self.assertEqual(utils.say_hello("techukraine.net"), "Hello, techukraine.net")
        self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan")
        self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan")
        self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez")


...

Ми використали лише деякі функції порівняння з модуля unittest. Ви можете знайти повний список тут.

Ми навчилися писати модульні тести за допомогою модуля unittest. Тепер настав час побачити різні способи виконання тестів.

Як запускати тести за допомогою unittest

У наведеному вище розділі ми вже бачили спосіб запуску тестів. Давайте розглянемо інші два способи запуску тестів за допомогою модуля unittest.

#1. Використання імені файлу та модуля unittest.

У цьому методі ми будемо використовувати модуль unittest і назву файлу для запуску тестів. Команда для запуску тестів: python -m unittest filename.py. У нашому випадку командою для запуску тестів є python -m unittest test_utils.py.

#2. Використання методу виявлення

Ми використаємо метод виявлення модуля unittest для автоматичного виявлення всіх тестових файлів і їх запуску. Щоб автоматично виявити тестові файли, нам потрібно назвати їх, починаючи з ключового слова test.

Команда для запуску тестів за допомогою методу виявлення: python -m unittest discover. Команда виявить усі файли, імена яких починаються з test, і виконає їх.

Висновок 👩‍💻

Модульні тести є базовим тестуванням у світі програмування. У реальному світі є багато інших тестів. Спробуйте вивчити їх по одному. Сподіваюся, цей підручник допоможе вам написати базові тести на Python за допомогою модуля unittest. Існують бібліотеки сторонніх розробників, такі як pytest, Robot Framework, nose, nose2, slash тощо. Ви можете досліджувати їх відповідно до вимог вашого проекту.

Гарного тестування 😎

Вас також можуть зацікавити питання та відповіді на співбесіді на Python.