Testing Strategies untuk Flask (Unit, Integration, E2E)

Testing Strategies untuk Flask (Unit, Integration, E2E)

Sun Jun 07 2026
501 words · 5 minutes

Di artikel ini, kita akan membahas Testing Strategies untuk aplikasi Flask secara lengkap, mulai dari Unit Testing, Integration Testing, hingga End-to-End (E2E) Testing.


1. Mengapa Testing Penting di Flask?

Manfaat utama testing:

  • Mendeteksi bug lebih awal
  • Memudahkan refactoring
  • Meningkatkan kepercayaan terhadap kode
  • Mendokumentasikan perilaku aplikasi
  • Memungkinkan Continuous Integration

2. Tiga Level Testing

LevelCakupanKecepatanBiayaContoh
Unit TestFungsi / method kecilSangat CepatRendahTest model, utility function
Integration TestInteraksi antar komponenCepatSedangTest route + database
E2E TestAlur pengguna secara utuhLambatTinggiTest login → dashboard → logout

3. Setup Testing Environment

Gunakan pytest (lebih modern dan powerful dibanding unittest).

Terminal window
pip install pytest pytest-flask

Struktur Folder Test

myapp/
├── app/
├── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_models.py
│ ├── test_routes.py
│ └── test_integration.py
└── pytest.ini

conftest.py (Paling Penting)

import pytest
from app import create_app, db
@pytest.fixture
def app():
app = create_app('testing')
with app.app_context():
db.create_all()
yield app
db.drop_all()
@pytest.fixture
def client(app):
return app.test_client()

4. Unit Testing

Unit test menguji unit kode terkecil secara terisolasi.

Contoh Unit Test Model

tests/test_models.py
def test_user_password_hashing(app):
from app.models import User
user = User(username='test', email='test@example.com')
user.set_password('secret123')
assert user.password_hash is not None
assert user.verify_password('secret123') is True
assert user.verify_password('wrong') is False

5. Integration Testing

Integration test menguji interaksi antara beberapa komponen.

Contoh Integration Test Route

tests/test_routes.py
def test_user_registration(client):
response = client.post('/auth/register', data={
'username': 'newuser',
'email': 'new@example.com',
'password': 'password123',
'password2': 'password123'
}, follow_redirects=True)
assert response.status_code == 200
assert b'You can now login' in response.data

6. End-to-End (E2E) Testing

E2E test menguji alur pengguna secara keseluruhan, biasanya menggunakan browser.

Tools populer:

  • Selenium
  • Playwright (direkomendasikan)
  • Cypress

Contoh dengan Playwright

Terminal window
pip install playwright
playwright install
from playwright.sync_api import sync_playwright
def test_user_login():
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("http://localhost:5000/login")
page.fill('input[name="email"]', 'user@example.com')
page.fill('input[name="password"]', 'password123')
page.click('button[type="submit"]')
assert "Dashboard" in page.content()
browser.close()

7. Testing Database

Gunakan Database Terpisah untuk Testing

config.py
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'

Atau gunakan PostgreSQL test database untuk lebih mendekati production.

Fixture untuk Database

@pytest.fixture
def init_database(app):
from app.models import User
user = User(username='test', email='test@example.com')
user.set_password('password')
db.session.add(user)
db.session.commit()
yield db
db.session.remove()
db.drop_all()

8. Mocking External Services

Gunakan unittest.mock atau pytest-mock.

Contoh Mocking

from unittest.mock import patch
def test_send_email(client):
with patch('app.tasks.send_email.delay') as mock_send:
response = client.post('/send-welcome', json={'user_id': 1})
mock_send.assert_called_once_with(1)

9. Code Coverage

Gunakan pytest-cov:

Terminal window
pip install pytest-cov
pytest --cov=app --cov-report=html

Target coverage yang baik: minimal 70-80% untuk proyek menengah.


10. Best Practices Testing di Flask

PraktikRekomendasi
Gunakan pytestLebih modern dan fleksibel
Pisahkan fixture di conftest.pyLebih rapi dan reusable
Gunakan database terpisah untuk testHindari merusak data development
Mock external serviceJangan bergantung pada layanan luar saat testing
Test nama yang deskriptiftest_user_cannot_login_with_wrong_password
Gunakan assert yang jelasLebih mudah dibaca saat gagal
Jalankan test secara otomatis di CIGitHub Actions / GitLab CI
Kombinasikan ketiga level testingUnit + Integration + E2E

11. Struktur Test yang Baik

Contoh struktur test yang direkomendasikan:

tests/
├── conftest.py # Fixture global
├── unit/
│ ├── test_models.py
│ └── test_utils.py
├── integration/
│ ├── test_auth.py
│ └── test_api.py
└── e2e/
└── test_user_flow.py

Kesimpulan

Testing yang baik adalah investasi jangka panjang. Meskipun membutuhkan waktu di awal, manfaatnya sangat besar saat aplikasi semakin kompleks.

Rekomendasi strategi testing untuk Flask:

  1. Unit Test → Untuk model, utility, dan logika bisnis
  2. Integration Test → Untuk route, form, dan interaksi database
  3. E2E Test → Untuk alur kritis pengguna (login, checkout, dll)

Mulailah dengan menulis unit test untuk komponen penting, lalu tambahkan integration test untuk endpoint utama. E2E test cukup untuk flow yang paling kritis.

Dengan testing yang baik, Anda akan lebih percaya diri saat melakukan perubahan dan deployment.


Thanks for reading!

Testing Strategies untuk Flask (Unit, Integration, E2E)

Sun Jun 07 2026
501 words · 5 minutes