Крок 6. Тестування Django від A до Z¶
Цей крок охоплює два проєкти: crispy_notes_project (автономний, SQLite, без Docker) та notes_chat_app (Docker + PostgreSQL + Redis + WebSocket).
Ти побачиш як кожен рівень тестів захищає різний шар системи.
Результат: 129+ тестів — 123 pass + 6 Selenium (skipped без geckodriver/Remote Chrome)
Передумови
Перед початком переконайся, що пройдені:
- Крок 1. Hello Django — перший
HttpResponse, URL routing - Крок 2. Bootstrap Notes — ModelForm, PRG, Bootstrap CRUD
- Крок 3. CRUD і архітектура — Services & Selectors, PostgreSQL
- Крок 4. Templates і Forms — Crispy Forms, Dashboard, Context Processor
- Крок 5. Auth і Безпека — Login/Logout, IDOR, Group Sharing
Навчальний проєкт vs Notes Chat App¶
| crispy_notes_project (Кроки 1–6) | notes_chat_app (Кроки 7–11) | |
|---|---|---|
| Запуск тестів | python manage.py test hello_app.tests |
docker compose run --rm web python manage.py test notes_app.tests |
| База даних | SQLite | PostgreSQL (Docker) |
| Що тестується | models, services, forms, views, selenium | Те саме + consumers (WebSocket) |
| Selenium | geckodriver / локальний Firefox |
Remote Chrome у Docker (selenium:4444) |
| CI/CD | GitHub Actions → ubuntu-latest → Chrome headless | GitHub Actions → PostgreSQL + Redis + selenium services |
| Кількість тестів | 129 (123 pass + 6 selenium skip) | 129+ (+ consumer тести) |
| Унікально | Standalone, без Docker | GroupChatConsumer, WebsocketCommunicator, TransactionTestCase |
Що ти вивчиш¶
- Навіщо тести — аналогія пожежна сигналізація, реальний сценарій з
selectors.py - Піраміда тестування — unit / integration / E2E: різна вартість, різна швидкість
- Django TestCase — тестова БД, ROLLBACK після кожного тесту,
setUp,BaseServiceTest - AAA паттерн — Arrange / Act / Assert: структура кожного тесту
- test_models.py — constraints, validators через
full_clean(), SET_NULL тест - test_services.py — persistence test, security (Mass Assignment), транзакційний інваріант
- test_forms.py — bound/unbound форми, queryset security,
cleaned_data - test_views.py — Django Test Client,
force_login, ownership 404, IDOR prevention - test_consumers.py —
WebsocketCommunicator,TransactionTestCase,database_sync_to_async(notes_chat_app) - test_selenium.py —
StaticLiveServerTestCase, Remote Chrome у Docker, session cookie trick - GitHub Actions CI — workflow рядок за рядком,
needs:,services:, artifacts
Порядок читання¶
- Навіщо тести — сигналізація, піраміда, TestCase, setUp, тестова БД, AAA, читання виводу
- test_models.py — що живе в моделі, структура tests/, validators, SET_NULL
- test_services.py — бізнес-логіка, persistence, security, транзакції
- test_forms.py — bound/unbound, queryset security, cleaned_data
- test_views.py — Test Client, force_login, три паттерни, схема доступу
- test_consumers.py — WebSocket тести (notes_chat_app, унікально)
- test_selenium.py — браузерні тести, Docker, session cookie trick
- GitHub Actions CI — workflow, jobs, кроки, результати
- Checkpoint — очікуваний результат, чеклист, практичне завдання