Skip to content

E2E regression tests and performance test suite - #1689

Merged
analisopendesa merged 12 commits into
rilis-devfrom
feat/e2e_regression
Jul 29, 2026
Merged

E2E regression tests and performance test suite#1689
analisopendesa merged 12 commits into
rilis-devfrom
feat/e2e_regression

Conversation

@pandigresik

Copy link
Copy Markdown
Contributor

Pull Request: feat: Add E2E regression tests and performance test suite

Description

Menambahkan pengujian E2E (Pest Browser) untuk memvalidasi alur pengguna lengkap: admin login, konfigurasi API key OpenDK di pengaturan, dan pengiriman data sync ke OpenDK. Selain itu, menambahkan skrip performa/regresi menggunakan k6 untuk pengujian beban terhadap endpoint sync inti dengan validasi p95 latency dan error rate threshold. Menghapus dependensi Playwright yang tidak terpakai dan menggantinya dengan Pest Browser + k6.

Changes made:

  1. Feature (E2E Test): Menambahkan tests/Browser/SyncFlowTest.php — 8 test case Pest Browser yang mencakup happy path (generate token via UI + trigger sync), 4 negative cases (invalid token, revoked token, no token, malformed token), payload verification, dan full UI flow verification terhadap database.
  2. Feature (Performance Test): Menambahkan suite k6 di tests/performance/config.js (konfigurasi threshold p95 < 500ms, error rate < 0.1%, VUs), helpers/auth.js (login + JWT auth helper), load-test.js (load test terhadap login, penduduk sync, identitas-desa, pesan, surat), dan rate-limit-test.js (verifikasi rate limiter 60 req/min).
  3. Feature (CI): Menambahkan .github/workflows/performance.yml — workflow GitHub Actions yang menjalankan k6 secara terjadwal (cron malam), on push ke master (dengan tag [perf]), atau manual dispatch. Menyiapkan MySQL, Laravel server, dan seed admin user secara otomatis.
  4. Enhancement (View): Menambahkan data-testid attributes ke login form (login.blade.php), settings pages (setting/aplikasi/index.blade.php, edit.blade.php, form.blade.php, generate_key.blade.php), dan button partial (button_reset_submit.blade.php) untuk mendukung Pest Browser selectors.
  5. Refactor (Dependencies): Menghapus @playwright/test dan playwright dari package.json devDependencies/dependencies. Menambahkan npm scripts: test:browser:sync, test:perf, test:perf:rate-limit, test:perf:ci.
  6. Chore (Gitignore): Menambahkan pattern k6 report files (report.json, rate-limit-report.json, k6-results.json) ke .gitignore.

Reason for change:

  • Automated E2E validation: Saat ini belum ada pengujian otomatis yang memvalidasi jalur lengkap admin mengkonfigurasi API key dan mengirim data sync. E2E test memastikan integrasi berfungsi dari UI hingga payload yang diterima provider.
  • Performance regression detection: Tidak ada mekanisme untuk mendeteksi regresi performa secara otomatis. k6 load test memberikan baseline dan threshold yang fail-fast jika degradasi terjadi.
  • Playwright removal: Playwright tidak terpakai dan digantikan oleh Pest Browser yang sudah ada di ekosistem Laravel project ini, mengurangi dependensi Node.js yang tidak perlu.

Impact of change:

Testing coverage: E2E test mencakup happy path + 4 negative cases sesuai acceptance criteria issue #1677.
Performance monitoring: k6 test memberikan metrics p95 latency dan error rate yang terintegrasi ke GitHub Actions.
CI/CD pipeline: Performance test berjalan terjadwal (nightly) dan on-demand, memberikan visibilitas regresi performa.
Reduced dependencies: Penghapusan Playwright mengurangi attack surface dan CI install time.

Related Issue

Steps to Reproduce

Before (no E2E/performance tests):

  1. Tidak ada automated test yang memvalidasi alur admin → configure API key → sync data.
  2. Tidak ada load test untuk mendeteksi p95 latency regression.
  3. Performance issue hanya diketahui setelah user melaporkan di produksi.

After (with this PR):

  1. Jalankan php artisan test --testsuite=Browser --group=sync-flow untuk menjalankan semua E2E test.
  2. Jalankan k6 run tests/performance/load-test.js untuk menjalankan load test.
  3. Jalankan k6 run tests/performance/rate-limit-test.js untuk menguji rate limiter.
  4. ✅ Semua test berjalan dan validasi happy path + negative cases + payload + database persistence.

Testing on related features:

  • Admin login flow ✅ Working
  • Settings API key page navigation ✅ Working
  • Token generation via UI ✅ Working
  • Sync penduduk/identitas-desa endpoints ✅ Working
  • Rate limiter behavior ✅ Validated

Checklist

  • Pengujian E2E berhasil dijalankan di CI dalam lingkungan ephemeral (mock provider via Http::fake)
  • Pengujian memvalidasi happy path serta 4 kasus negatif (invalid token, revoked token, no token, malformed token)
  • Pengujian performa menghasilkan metrik dan berstatus gagal jika p95 > 500ms atau error rate > 0.1%
  • Semua data-testid attributes tidak mengubah behavior UI yang ada
  • Playwright dependencies dihapus dengan benar dari package.json
  • Tidak ada console errors atau warnings

Technical Details

Technical Explanation

E2E Test (SyncFlowTest.php):

  • Menggunakan BrowserTestCase dan SessionState yang sudah ada di project.
  • Http::fake() digunakan untuk mem-mock external HTTP ke pantau.opensid.my.id, sehingga test bisa berjalan tanpa koneksi internet.
  • Test menggunakan data-testid selectors untuk navigasi UI yang stabil.
  • JWT token di-generate via Tymon\JWTAuth dan di-persist ke das_setting table.

Performance Test (k6):

  • load-test.js menjalankan 5 endpoint (login, penduduk sync, identitas-desa, pesan, surat) dengan configurable VUs dan duration.
  • Threshold: http_req_duration p(95) < 500ms dan http_req_failed rate < 0.001. Test akan abortOnFail jika threshold terlampaui.
  • rate-limit-test.js mengirim 70 req/min selama 2 menit untuk memverifikasi 429 response setelah batas 60 req/min tercapai.
  • handleSummary() menghasilkan JSON report untuk artifact upload di CI.

GitHub Actions (performance.yml):

  • Trigger: cron 0 2 * * * (nightly), push ke master dengan [perf] di commit message, atau manual dispatch.
  • Services: MySQL 8.0 container.
  • Steps: PHP setup → composer install → DB seed → start Laravel server → install k6 v0.49.0 → run tests → upload artifacts.

Configuration changes

  • package.json: Menghapus scripts test:e2e* (Playwright) dan menambahkan test:browser:sync, test:perf* (k6).
  • .gitignore: Menambahkan pattern k6 report files.
  • Blade views: Menambahkan data-testid attributes (tidak mengubah behavior).

Dependencies added

  • k6: Installed via grafana/install-k6-action@v1 di CI (v0.49.0)

Dependencies removed

  • @playwright/test ^1.56.1 (devDependencies)
  • playwright ^1.58.2 (dependencies)

Testing

Manual Testing

  • Jalankan npm run test:browser:sync — semua 8 test harus pass
  • Jalankan npm run test:perf — pastikan p95 < 500ms dan error rate < 0.1%
  • Jalankan npm run test:perf:rate-limit — pastikan rate limiter mengembalikan 429 setelah 60 req
  • Verifikasi data-testid attributes tidak mengubah tampilan/behavior UI

Automated Testing

  • Pest Browser — SyncFlowTest (8 test cases)
  • k6 Load Test — load-test.js (5 endpoint)
  • k6 Rate Limit Test — rate-limit-test.js (1 scenario)
  • GitHub Actions workflow — .github/workflows/performance.yml

Browser Compatibility (if applicable)

  • Pest Browser (Chromium-based via Laravel Dusk)
  • N/A: Tidak ada perubahan visual UI, hanya penambahan data-testid attributes

Screenshots / Video

image

Breaking Changes

None

Migration Guide

Not required

References


Additional notes:

  • Test E2E menggunakan Http::fake() sehingga tidak membutuhkan koneksi ke server OpenDK asli. Untuk testing di lingkungan staging, ubah fakeExternalHttp() menjadi Http::preventStrayRequests().
  • Threshold k6 dapat dikonfigurasi melalui environment variables: K6_P95_THRESHOLD_MS, K6_ERROR_RATE_THRESHOLD, K6_VUS, K6_DURATION.
  • Performance test workflow hanya berjalan pada push ke master (bukan rilis-dev). Pertimbangkan untuk menambahkan branch target jika diperlukan.

@pandigresik
pandigresik requested a review from vickyrolanda July 22, 2026 06:33
@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1689

@pandigresik
pandigresik changed the base branch from master to rilis-dev July 22, 2026 06:36
@analisopendesa

Copy link
Copy Markdown
Contributor

Pengujian untuk PR #1689 (End-to-end (E2E) dan Performance testing untuk alur sinkronisasi data) telah dilakukan dan diverifikasi dengan hasil sebagai berikut:


1. Perbaikan Migrasi & Konfigurasi Testing

  • .env.testing: Diperbarui agar koneksi database testing (opendk_testing) sesuai dengan kredensial MySQL lokal Laragon (DB_PASSWORD=).
  • Idempotensi Migrasi (database/migrations/2023_10_19_154602_maintenance_mode.php & 2025_01_16_162721_create_setting_sinkronisasi.php): Menyesuaikan dari hardcoded insert menjadi updateOrCreate agar php artisan migrate:fresh --seed berjalan mulus tanpa error duplikasi primary/unique key (1062 Duplicate entry).

2. Hasil Pengujian E2E Browser (SyncFlowTest)

Menjalankan migrasi, seeder testing, dan test suite browser untuk alur sinkronisasi:

php artisan migrate:fresh --seed --env=testing
php artisan test --testsuite=Browser --group=sync-flow

Hasil:

  • PASS: Tests\Browser\SyncFlowTest
    • admin can generate API key and trigger data sync
    • request with invalid token is rejected with 401
    • request with unregistered (revoked) token is rejected with 401
    • request without any token is rejected
    • request with malformed bearer token is rejected
    • sync penduduk payload structure is correct
    • sync identitas-desa persists data to database
    • full UI flow: generate token and verify in DB
  • Total: 8 passed (29 assertions)

3. Pemeriksaan Regresi (ApiKey Testsuite)

Menjalankan kembali seluruh tes unit & integrasi untuk lifecycle API key:

php artisan test --testsuite=ApiKey
  • Total: 36 passed (101 assertions) — Seluruh pengujian berjalan dengan sukses tanpa error regresi.

4. Catatan Menjalankan Performance Test (k6)

Untuk menjalankan skrip performance test (tests/performance/load-test.js atau rate-limit-test.js), pastikan Docker Desktop (Linux engine) aktif atau k6 CLI terpasang, kemudian jalankan dari root direktori OpenDK:

# Terminal 1: Jalankan server
php artisan serve --host=127.0.0.1 --port=8000

# Terminal 2: Jalankan load test k6 via Docker
docker run --rm -i --net=host -v "%cd%:/scripts" -w /scripts -e K6_BASE_URL=http://127.0.0.1:8000 loadimpact/k6 run tests/performance/load-test.js

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

End-to-end user flow + performance/regression tests: configure API key in OpenSID UI, submit data to OpenDK, rate-limit & perf checks

3 participants