Mengapa Testing di CI/CD?
Menjalankan test secara manual mudah terlupa. Dengan CI/CD pipeline, test dijalankan otomatis setiap kali ada push atau pull request — memastikan tidak ada kode rusak yang masuk ke branch utama.
GitHub Actions untuk Testing
GitHub Actions adalah platform CI/CD yang terintegrasi langsung dengan GitHub. File workflow disimpan di .github/workflows/:
# .github/workflows/test.yml
name: Test Suite
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "npm"
- run: npm ci
- run: npx vitest run --coverage
Matrix Testing
Matrix strategy menjalankan test di berbagai kombinasi environment secara paralel:
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node-version: [18, 20, 22]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
Workflow di atas menjalankan 9 job sekaligus (3 OS × 3 versi Node). Ini memastikan kode kompatibel di berbagai environment.
Caching Dependencies
Install dependency di setiap run itu lambat. Gunakan cache untuk mempercepat pipeline:
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "npm" # Cache otomatis dari setup-node
- run: npm ci # Lebih cepat karena menggunakan cache
Untuk PHP/Composer:
- uses: shivammathur/setup-php@v2
with:
php-version: "8.4"
- uses: actions/cache@v4
with:
path: vendor
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
- run: composer install --no-interaction
Parallel Test Execution
Pecah test menjadi beberapa job agar berjalan paralel dan selesai lebih cepat:
jobs:
unit-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npx vitest run --reporter=junit --outputFile=results.xml
e2e-test:
runs-on: ubuntu-latest
needs: unit-test # E2E jalan setelah unit test lulus
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test
Test Artifacts & Reports
Simpan hasil test dan screenshot sebagai artifact agar bisa diunduh setelah pipeline selesai:
- run: npx vitest run --coverage
- uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-report
path: coverage/
retention-days: 7
# Untuk Playwright — simpan screenshot saat test gagal
- uses: actions/upload-artifact@v4
if: failure()
with:
name: playwright-traces
path: test-results/
Branch Protection Rules
Konfigurasi GitHub agar PR tidak bisa di-merge tanpa test lulus:
- Buka Settings → Branches → Branch protection rules
- Aktifkan "Require status checks to pass before merging"
- Pilih workflow/job yang wajib lulus (misalnya: "test", "lint")
- Aktifkan "Require branches to be up to date" agar test dijalankan ulang setelah rebase
Tips Pipeline yang Efisien
- Fail fast — jalankan linter dan unit test duluan, E2E belakangan
- Cache dependencies — hemat waktu install di setiap run
- Gunakan concurrency — batalkan run lama jika ada push baru ke branch yang sama
- Set timeout — hindari job yang menggantung tanpa batas waktu
- Notifikasi — kirim alert ke Slack/Discord saat pipeline gagal
# Contoh concurrency — batalkan run lama
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true