Це машинний переклад, який може містити помилки!
Юніт-тестування та валідація
Тепер, коли ми створили класи та працювали з валідацією, у нас є хороша база для початку тестування. Тестування є важливою частиною процесу розробки і допомагає нам переконатися, що наш код працює так, як очікується.
Бо як ми можемо бути впевнені, що код працює належним чином, якщо ми його не тестуємо?
Що таке Unit-тестування?
Unit-тестування — це метод автоматичного та систематичного тестування невеликих частин нашого коду. У Python ми використовуємо модуль на ім’я pytest для написання й запущення тестів. «Одиниця» (unit) — це найменша тестована частина застосунку, часто окрема функція або метод. При використанні pytest важливо дотримуватися правильних конвенцій назв, щоб pytest міг знайти наші тести, зокрема додавати префікс test_ до імен файлів тестів і префікс test_ до імен функцій тестів.
Приклад unit-тесту:
def test_add():
assert 0.3 + 0.3 + 0.3 == 0.9
Запускається введенням команди pytest у терміналі.
Цікавий факт
Код вище дасть помилку, оскільки в Python .3+.3+.3 дорівнює 0.8999999999!
Завдання 1 - Встановіть pytest
Встановіть pytest у ваше віртуальне середовище. Це робиться шляхом виконання наступної команди в терміналі:
pip install pytest
Завдання 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», оскільки ми перевіряємо, що все працює так, як має, коли надаються валідні значення, і воно не є особливо корисним.
Завдання 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_.
Рішення: Приклад тесту для некоректної електронної пошти
from main import Email
import pytest
def test_invalid_email():
with pytest.raises(ValueError):
email = Email("not-an-email")
Чому це варто робити?
Маючи якісні тести для нашого коду, ми можемо бути впевнені в тому, що він працює так, як слід, і легко виявити, якщо щось пішло не так після внесення змін у код. Це особливо важливо в великих проєктах, де багато розробників працюють разом, а допустити помилку дуже просто.
Відео: Чому тести захищають код від нових помилок
У відео пояснюється, чому тестування важливе і як автоматизовані тести можуть виявляти помилки після змін у коді.
Наприклад, використовуючи програмне забезпечення на кшталт Jest або Selenium, можна автоматично тестувати вебсайти та таким чином переконатися, що все працює належним чином після кожної зміни в коді. Ми ж хочемо знати, що «реєстрація користувача», «оплата» та «авторизація» функціонують так, як слід, правда?
Подумайте над наступними сценаріями
Що відбувається (або повинно відбуватися), якщо..:
- Користувач намагається зареєструватися з електронною поштою, яка вже використовується?
- У користувача дата народження в майбутньому?
- Користувач вводить ім’я “jOHN dOE”?
Завдання 4 - Автоматичне тестування (CI)
Коли ми публікуємо код на GitHub, ми можемо налаштувати так звані GitHub Actions, які автоматично запускають наши тести щоразу, коли ми вносимо зміни у код. Це називається безперервною інтеграцією (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 з’явиться нова вкладка під назвою «Дії». Тут ви побачите, що ваші тести автоматично виконуються щоразу, коли ви внісете зміни до коду, і вам буде надіслано сповіщення, якщо будь-який із тестів завершиться помилкою (червоне хрестик та через електронну пошту).
Примітка щодо структури файлів
Ваша структура файлів визначатиме, чи працюватимуть GitHub Actions. Переконайтеся, що папка .github розташована в кореневій папці вашого проєкту, а також існує папка tests, де зберігаються ваші тестові файли.
За бажанням ви можете внести зміни у файл pytest.yml, щоб він вказував на правильну папку.
Файли Slike Actions також можна використовувати для тестування вашого коду на різних версіях Python або операційних систем; вони також можуть бути використані для автоматичного збирання та публікації вашого програмного забезпечення, наприклад, публікації вебсайту або оновлення застосунку в App Store чи Google Play.
Code Coverage
Існує також таке поняття, як “Code Coverage”, яке може допомогти вам побачити, яка частина вашого коду фактично тестується. Це може бути корисним для визначення, чи достатньо у вас тестів, або чи є частини вашого коду, які взагалі не тестуються.
Деякі робочі місця вимагають, щоб певний відсоток вашого коду був покритий тестами перед розгортанням, щоб забезпечити, що код є надійним і працює належним чином.

