Skip to content

10. (П5) Виконання завдань з тестування програм, що працюють із базою даних PostgreSQL, за допомогою pytest

Передумови

Завдання

Написати набір автоматичних тестів для банківської програми з Практичної 4, використовуючи pytest та фікстури.

Крок 1. Підготовка проєкту

Встановити pytest у віртуальне середовище:

source env/bin/activate
pip install pytest psycopg2-binary

Структура проєкту повинна мати такий вигляд:

project/
├── bank.py                # Програма з Практичної 4
├── conftest.py            # Фікстури pytest
├── test_bank.py           # Тести
└── requirements.txt

Крок 2. Рефакторинг bank.py

Щоб код можна було тестувати, банківську логіку потрібно винести в окремий клас AccountService, який приймає з'єднання як параметр.

Клас повинен мати такі методи:

  • create_account(owner, balance=0) — створює рахунок, повертає його id
  • get_balance(account_id) — повертає баланс рахунку (або кидає виняток, якщо рахунок не знайдено)
  • transfer(from_id, to_id, amount) — переказує кошти між рахунками
  • get_all_accounts() — повертає список усіх рахунків

CLI-частина (if __name__ == "__main__") залишається в bank.py і використовує AccountService.

Крок 3. Створення conftest.py

Створити файл conftest.py з фікстурами:

  1. db_connection (scope=session) — з'єднання з тестовою базою PostgreSQL з autocommit = True
  2. create_tables (scope=session, autouse=True) — створення таблиці accounts
  3. clean_tables (autouse=True) — очищення таблиці accounts перед кожним тестом
  4. service — екземпляр AccountService, готовий до використання в тестах
  5. funded_accounts — створює два тестових рахунки з початковим балансом (наприклад, 1000 та 500 грн) і повертає їхні id

Крок 4. Написання тестів

Створити файл test_bank.py з тестами, організованими у класи:

TestCreateAccount — тестування створення рахунків:

  • Створення рахунку з балансом за замовчуванням (0)
  • Створення рахунку з початковим балансом

TestGetBalance — тестування отримання балансу:

  • Отримання балансу існуючого рахунку
  • Спроба отримати баланс неіснуючого рахунку (перевірка винятку)

TestTransfer — тестування переказів:

  • Успішний переказ коштів (перевірити баланси обох рахунків)
  • Переказ усіх коштів з рахунку (баланс = 0)
  • Переказ при недостатньому балансі (перевірка винятку та незмінності балансів)
  • Переказ від'ємної суми (перевірка винятку)
  • Переказ з неіснуючого рахунку (перевірка винятку)
  • Переказ на неіснуючий рахунок (перевірка винятку)
  • Кілька послідовних переказів (перевірити кінцеві баланси)

Крок 5. Запуск тестів

Запустити тести та переконатися, що всі проходять:

pytest -v

Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub