122 lines
2.5 KiB
Markdown
122 lines
2.5 KiB
Markdown
# CI/CD Testing Workflows
|
|
|
|
## GitHub Actions - Complete Workflow
|
|
|
|
```yaml
|
|
name: Test Suite
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
jobs:
|
|
unit-tests:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with: { node-version: 20, cache: 'npm' }
|
|
- run: npm ci
|
|
- run: npm run test:unit -- --coverage
|
|
- uses: actions/upload-artifact@v4
|
|
with: { name: coverage, path: coverage/ }
|
|
|
|
e2e-tests:
|
|
needs: unit-tests
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
shard: [1, 2, 3, 4]
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with: { node-version: 20, cache: 'npm' }
|
|
- run: npm ci
|
|
- run: npx playwright install --with-deps
|
|
- run: npx playwright test --shard=${{ matrix.shard }}/4
|
|
- uses: actions/upload-artifact@v4
|
|
if: failure()
|
|
with:
|
|
name: playwright-report-${{ matrix.shard }}
|
|
path: playwright-report/
|
|
```
|
|
|
|
## Test Splitting
|
|
|
|
```bash
|
|
# By shard (equal files)
|
|
npx playwright test --shard=1/4
|
|
|
|
# By timing (Knapsack)
|
|
- uses: chaosaffe/split-tests@v1
|
|
with:
|
|
glob: 'tests/**/*.spec.ts'
|
|
split-total: ${{ matrix.shard }}
|
|
```
|
|
|
|
## Caching
|
|
|
|
```yaml
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
~/.npm
|
|
~/.cache/ms-playwright
|
|
key: ${{ runner.os }}-${{ hashFiles('package-lock.json') }}
|
|
```
|
|
|
|
## Flaky Test Management
|
|
|
|
```yaml
|
|
- run: npx playwright test --retries=2
|
|
- run: npx playwright test --grep-invert @flaky # Quarantine
|
|
```
|
|
|
|
## Performance & Security Gates
|
|
|
|
```yaml
|
|
- run: npm install -g @lhci/cli && lhci autorun
|
|
- run: npm audit --audit-level=high
|
|
- uses: github/codeql-action/analyze@v3
|
|
```
|
|
|
|
## Merge Reports
|
|
|
|
```yaml
|
|
merge-reports:
|
|
needs: e2e-tests
|
|
steps:
|
|
- uses: actions/download-artifact@v4
|
|
with: { pattern: playwright-report-*, merge-multiple: true }
|
|
- run: npx playwright merge-reports ./all-reports
|
|
```
|
|
|
|
## GitLab CI
|
|
|
|
```yaml
|
|
stages: [test, e2e]
|
|
|
|
unit:
|
|
stage: test
|
|
script: [npm ci, npm run test:unit]
|
|
|
|
e2e:
|
|
stage: e2e
|
|
parallel: 4
|
|
script:
|
|
- npm ci && npx playwright install --with-deps
|
|
- npx playwright test --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL
|
|
artifacts:
|
|
when: on_failure
|
|
paths: [playwright-report/]
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
- **Fail fast:** Unit tests before E2E
|
|
- **Parallelism:** Shard E2E across jobs
|
|
- **Cache:** npm, Playwright browsers
|
|
- **Artifacts on failure:** Reports for debugging
|
|
- **Security gates:** npm audit, SAST before merge
|