Testing di CI/CD Pipeline — Testing

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 —

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:

Tips Pipeline yang Efisien

# Contoh concurrency — batalkan run lama
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

Yang akan kamu pelajari