Юніт-тестування та валідація

Skip to content

Це машинний переклад, який може містити помилки!

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

Як ми можемо бути впевнені, що код працює належним чином, якщо ми його не тестуємо?

Що таке Unit Testing?

Unit Testing – це метод автоматичного та систематичного тестування невеликих частин нашого коду. У Python ми використовуємо модуль під назвою pytest для написання та запуску тестів. “Unit” – це найменша частина програми, яку можна протестувати, часто окрема функція або метод. Коли ми використовуємо pytest, важливо дотримуватися правильних конвенцій іменування, щоб pytest міг знайти наші тести, наприклад, називати тестові файли з префіксом test_, а тестові функції з префіксом test_.

Приклад unit test:

def test_add():
    # Перевірка додавання чисел з плаваючою комою
    assert 0.3 + 0.3 + 0.3 == 0.9

Виконується шляхом введення pytest у терміналі.

Fun fact

Код вище не спрацює, тому що .3+.3+.3 стає 0.8999999999 у Python!

Easy Завдання 1 - Встановіть pytest

Встановіть pytest у ваше віртуальне середовище. Це робиться шляхом виконання наступної команди в терміналі:

pip install pytest
# Встановлює pytest

Easy Завдання 2 - Створіть тест

Створіть новий файл у папці вашого проєкту з назвою test_data.py. У цьому файлі створіть тест для класу Person, який ви створили в попередньому модулі. Тест повинен перевіряти, чи можна створити Person з дійсними значеннями.

Приклад того, як може виглядати тест:

from main import Person

def test_person_working():
    bob_kaare = Person(name="Bob Kåre",
                       eye_color=EyeColor.BLUE,
                       phone_number=PhoneNumber("12345678"),
                       email=Email("bob_kaare@example.com"))
    # Перевірка, чи ім'я встановлено правильно
    assert bob_kaare.name == "Bob Kåre"
    # Перевірка, чи колір очей встановлено правильно
    assert bob_kaare.eye_color == EyeColor.BLUE

Цей тип тестування називається “happy path” тестуванням, оскільки ми перевіряємо, чи все працює як належить, коли надаємо дійсні значення, і не є особливо корисним.

Medium Завдання 3 - Тестування валідації

Створіть більше тестів у test_person.py, які перевіряють, чи працює валідація в Email та PhoneNumber належним чином. Перевірте як дійсні, так і недійсні значення. Тут потрібно використовувати функцію в pytest під назвою raises, яка перевіряє, чи викидається певна помилка.

import pytest

def test_exception():
    with pytest.raises(KeyError):
        my_dict = {"a": 1, "b": 2}
        value = my_dict["c"]  # Це викличе KeyError

Tip

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

Løsning: Приклад тесту для недійсної електронної пошти
from main import Email

import pytest

def test_invalid_email():
    with pytest.raises(ValueError):
        email = Email("not-an-email")

Чому це робити?

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

Наприклад, використовуючи програмне забезпечення, таке як Jest або Selenium, можна автоматично тестувати веб-сайти, і таким чином переконатися, що все працює як потрібно після кожної зміни в коді. Ми ж хочемо знати, що “реєстрація користувача”, “оплата” та “вхід” працюють як потрібно, чи не так?

Подумайте над наступними сценаріями

Що відбувається (або повинно відбуватися), якщо..:

  • Користувач намагається зареєструватися з електронною поштою, яка вже використовується?
  • У користувача дата народження в майбутньому?
  • Користувач вводить ім’я “jOHN dOE”?

A software tester walks into a bar...

Hard Завдання 4 - Автоматичне Тестування (CI)

Коли ми публікуємо код на GitHub, ми можемо налаштувати щось під назвою GitHub Actions, яке може запускати наші тести автоматично кожного разу, коли ми вносимо зміни в код. Це називається Continuous Integration (CI), і це допомагає нам переконатися, що наш код завжди працює як задумано.

Створіть файл у папці вашого проєкту з назвою .github/workflows/pytest.yml. У цьому файлі додайте наступний код:

name: Pytest

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Install dependencies
      run: |

        python -m pip install --upgrade pip
        pip install pytest
        # Встановіть будь-які інші залежності, необхідні для вашого проекту
        pip install -r requirements.txt
    - name: Run tests with pytest
      run: pytest

Якщо ви правильно його додали, ви тепер побачите нову вкладку у вашому GitHub-репозиторії під назвою “Actions”. Тут ви зможете побачити, що ваші тести запускаються автоматично кожного разу, коли ви вносите зміни в код, і ви отримаєте сповіщення, якщо будь-який з тестів не пройде (червоний хрестик та електронною поштою).

Merknad om filструктурі

Структура вашого файлу визначить, чи працюватимуть GitHub Actions чи ні. Переконайтеся, що папка .github знаходиться в кореневій папці вашого проєкту, і те ж саме стосується папки tests, де знаходяться ваші тестові файли.

Ви можете за потреби змінити файл pytest.yml, щоб вказати правильну папку.

Такі файли Actions також можна використовувати для тестування вашого коду на різних версіях Python або операційних системах, їх також можна використовувати для автоматичного створення та публікації вашого програмного забезпечення, наприклад, публікації веб-сайту або оновлення додатку в App Store або Google Play.

Code Coverage

Існує також таке поняття, як “Code Coverage”, яке може допомогти вам побачити, яка частина вашого коду фактично тестується. Це може бути корисним для визначення, чи достатньо у вас тестів, або чи є частини вашого коду, які взагалі не тестуються.

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

Unit Test Meme