@arcadialdev/arcality 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/e2e-testing-expert/SKILL.md +28 -0
- package/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/.agents/skills/frontend-design/SKILL.md +42 -0
- package/.agents/skills/nodejs-backend-patterns/SKILL.md +639 -0
- package/.agents/skills/nodejs-backend-patterns/references/advanced-patterns.md +430 -0
- package/.agents/skills/playwright-best-practices/LICENSE.md +7 -0
- package/.agents/skills/playwright-best-practices/README.md +147 -0
- package/.agents/skills/playwright-best-practices/SKILL.md +303 -0
- package/.agents/skills/playwright-best-practices/advanced/authentication-flows.md +360 -0
- package/.agents/skills/playwright-best-practices/advanced/authentication.md +871 -0
- package/.agents/skills/playwright-best-practices/advanced/clock-mocking.md +364 -0
- package/.agents/skills/playwright-best-practices/advanced/mobile-testing.md +409 -0
- package/.agents/skills/playwright-best-practices/advanced/multi-context.md +288 -0
- package/.agents/skills/playwright-best-practices/advanced/multi-user.md +393 -0
- package/.agents/skills/playwright-best-practices/advanced/network-advanced.md +452 -0
- package/.agents/skills/playwright-best-practices/advanced/third-party.md +464 -0
- package/.agents/skills/playwright-best-practices/architecture/pom-vs-fixtures.md +363 -0
- package/.agents/skills/playwright-best-practices/architecture/test-architecture.md +369 -0
- package/.agents/skills/playwright-best-practices/architecture/when-to-mock.md +383 -0
- package/.agents/skills/playwright-best-practices/browser-apis/browser-apis.md +391 -0
- package/.agents/skills/playwright-best-practices/browser-apis/iframes.md +403 -0
- package/.agents/skills/playwright-best-practices/browser-apis/service-workers.md +504 -0
- package/.agents/skills/playwright-best-practices/browser-apis/websockets.md +403 -0
- package/.agents/skills/playwright-best-practices/core/annotations.md +424 -0
- package/.agents/skills/playwright-best-practices/core/assertions-waiting.md +361 -0
- package/.agents/skills/playwright-best-practices/core/configuration.md +452 -0
- package/.agents/skills/playwright-best-practices/core/fixtures-hooks.md +417 -0
- package/.agents/skills/playwright-best-practices/core/global-setup.md +434 -0
- package/.agents/skills/playwright-best-practices/core/locators.md +242 -0
- package/.agents/skills/playwright-best-practices/core/page-object-model.md +315 -0
- package/.agents/skills/playwright-best-practices/core/projects-dependencies.md +453 -0
- package/.agents/skills/playwright-best-practices/core/test-data.md +492 -0
- package/.agents/skills/playwright-best-practices/core/test-suite-structure.md +361 -0
- package/.agents/skills/playwright-best-practices/core/test-tags.md +298 -0
- package/.agents/skills/playwright-best-practices/debugging/console-errors.md +420 -0
- package/.agents/skills/playwright-best-practices/debugging/debugging.md +504 -0
- package/.agents/skills/playwright-best-practices/debugging/error-testing.md +360 -0
- package/.agents/skills/playwright-best-practices/debugging/flaky-tests.md +496 -0
- package/.agents/skills/playwright-best-practices/frameworks/angular.md +530 -0
- package/.agents/skills/playwright-best-practices/frameworks/nextjs.md +469 -0
- package/.agents/skills/playwright-best-practices/frameworks/react.md +531 -0
- package/.agents/skills/playwright-best-practices/frameworks/vue.md +574 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +468 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/docker.md +283 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/github-actions.md +546 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/gitlab.md +397 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/other-providers.md +521 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +371 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/performance.md +453 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/reporting.md +424 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +497 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/accessibility.md +359 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/api-testing.md +719 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/browser-extensions.md +506 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/canvas-webgl.md +493 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/component-testing.md +500 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/drag-drop.md +576 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/electron.md +509 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/file-operations.md +377 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/file-upload-download.md +562 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/forms-validation.md +561 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/graphql-testing.md +331 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/i18n.md +508 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/performance-testing.md +476 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/security-testing.md +430 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/visual-regression.md +634 -0
- package/.env.example +21 -0
- package/README.md +30 -0
- package/bin/arcality.mjs +86 -0
- package/package.json +66 -0
- package/playwright.config.ts +12 -0
- package/scripts/cleanup-qmsdev.mjs +63 -0
- package/scripts/discover-view.mjs +52 -0
- package/scripts/extract-view.mjs +64 -0
- package/scripts/gen-and-run.mjs +838 -0
- package/scripts/init.mjs +290 -0
- package/scripts/migrate-to-central-out.mjs +157 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/rebrand-report.mjs +241 -0
- package/scripts/setup.mjs +166 -0
- package/src/KnowledgeService.ts +239 -0
- package/src/arcalityClient.mjs +266 -0
- package/src/configLoader.mjs +179 -0
- package/src/configManager.mjs +172 -0
- package/src/consoleBanner.ts +32 -0
- package/src/envSetup.ts +205 -0
- package/src/index.ts +25 -0
- package/src/projectInspector.ts +42 -0
- package/src/services/collectiveMemoryService.ts +178 -0
- package/src/testRunner.ts +201 -0
- package/tests/_helpers/ArcalityReporter.ts +490 -0
- package/tests/_helpers/agentic-runner.spec.ts +741 -0
- package/tests/_helpers/ai-agent-helper.ts +1573 -0
- package/tests/_helpers/discover-view.spec.ts +238 -0
- package/tests/_helpers/extract-view.spec.ts +118 -0
- package/tests/_helpers/qa-tools.ts +333 -0
- package/tests/_helpers/smart-action.spec.ts +1458 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# CI/CD Integration
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
1. [GitHub Actions](#github-actions)
|
|
6
|
+
2. [Docker](#docker)
|
|
7
|
+
3. [Reporting](#reporting)
|
|
8
|
+
4. [Sharding](#sharding)
|
|
9
|
+
5. [Environment Management](#environment-management)
|
|
10
|
+
6. [Caching](#caching)
|
|
11
|
+
|
|
12
|
+
## GitHub Actions
|
|
13
|
+
|
|
14
|
+
### Basic Workflow
|
|
15
|
+
|
|
16
|
+
```yaml
|
|
17
|
+
# .github/workflows/playwright.yml
|
|
18
|
+
name: Playwright Tests
|
|
19
|
+
|
|
20
|
+
on:
|
|
21
|
+
push:
|
|
22
|
+
branches: [main]
|
|
23
|
+
pull_request:
|
|
24
|
+
branches: [main]
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
test:
|
|
28
|
+
timeout-minutes: 60
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
|
|
33
|
+
- uses: actions/setup-node@v4
|
|
34
|
+
with:
|
|
35
|
+
node-version: 22
|
|
36
|
+
cache: "npm"
|
|
37
|
+
|
|
38
|
+
- name: Install dependencies
|
|
39
|
+
run: npm ci
|
|
40
|
+
|
|
41
|
+
- name: Install Playwright browsers
|
|
42
|
+
run: npx playwright install --with-deps
|
|
43
|
+
|
|
44
|
+
- name: Run Playwright tests
|
|
45
|
+
run: npx playwright test
|
|
46
|
+
|
|
47
|
+
- uses: actions/upload-artifact@v4
|
|
48
|
+
if: ${{ !cancelled() }}
|
|
49
|
+
with:
|
|
50
|
+
name: playwright-report
|
|
51
|
+
path: playwright-report/
|
|
52
|
+
retention-days: 30
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### With Sharding
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
name: Playwright Tests
|
|
59
|
+
|
|
60
|
+
on:
|
|
61
|
+
push:
|
|
62
|
+
branches: [main]
|
|
63
|
+
|
|
64
|
+
jobs:
|
|
65
|
+
test:
|
|
66
|
+
timeout-minutes: 60
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
strategy:
|
|
69
|
+
fail-fast: false
|
|
70
|
+
matrix:
|
|
71
|
+
shardIndex: [1, 2, 3, 4]
|
|
72
|
+
shardTotal: [4]
|
|
73
|
+
steps:
|
|
74
|
+
- uses: actions/checkout@v4
|
|
75
|
+
|
|
76
|
+
- uses: actions/setup-node@v4
|
|
77
|
+
with:
|
|
78
|
+
node-version: 22
|
|
79
|
+
cache: "npm"
|
|
80
|
+
|
|
81
|
+
- name: Install dependencies
|
|
82
|
+
run: npm ci
|
|
83
|
+
|
|
84
|
+
- name: Install Playwright browsers
|
|
85
|
+
run: npx playwright install --with-deps
|
|
86
|
+
|
|
87
|
+
- name: Run Playwright tests
|
|
88
|
+
run: npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
|
|
89
|
+
|
|
90
|
+
- name: Upload blob report
|
|
91
|
+
if: ${{ !cancelled() }}
|
|
92
|
+
uses: actions/upload-artifact@v4
|
|
93
|
+
with:
|
|
94
|
+
name: blob-report-${{ matrix.shardIndex }}
|
|
95
|
+
path: blob-report
|
|
96
|
+
retention-days: 1
|
|
97
|
+
|
|
98
|
+
merge-reports:
|
|
99
|
+
if: ${{ !cancelled() }}
|
|
100
|
+
needs: [test]
|
|
101
|
+
runs-on: ubuntu-latest
|
|
102
|
+
steps:
|
|
103
|
+
- uses: actions/checkout@v4
|
|
104
|
+
|
|
105
|
+
- uses: actions/setup-node@v4
|
|
106
|
+
with:
|
|
107
|
+
node-version: 22
|
|
108
|
+
cache: "npm"
|
|
109
|
+
|
|
110
|
+
- name: Install dependencies
|
|
111
|
+
run: npm ci
|
|
112
|
+
|
|
113
|
+
- name: Download blob reports
|
|
114
|
+
uses: actions/download-artifact@v4
|
|
115
|
+
with:
|
|
116
|
+
path: all-blob-reports
|
|
117
|
+
pattern: blob-report-*
|
|
118
|
+
merge-multiple: true
|
|
119
|
+
|
|
120
|
+
- name: Merge reports
|
|
121
|
+
run: npx playwright merge-reports --reporter html ./all-blob-reports
|
|
122
|
+
|
|
123
|
+
- name: Upload HTML report
|
|
124
|
+
uses: actions/upload-artifact@v4
|
|
125
|
+
with:
|
|
126
|
+
name: html-report
|
|
127
|
+
path: playwright-report
|
|
128
|
+
retention-days: 14
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### With Container
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
jobs:
|
|
135
|
+
test:
|
|
136
|
+
timeout-minutes: 60
|
|
137
|
+
runs-on: ubuntu-latest
|
|
138
|
+
container:
|
|
139
|
+
# Use latest or more appropriate playwright version (match package.json)
|
|
140
|
+
image: mcr.microsoft.com/playwright:v1.40.0-jammy
|
|
141
|
+
steps:
|
|
142
|
+
- uses: actions/checkout@v4
|
|
143
|
+
|
|
144
|
+
- uses: actions/setup-node@v4
|
|
145
|
+
with:
|
|
146
|
+
node-version: 22
|
|
147
|
+
cache: "npm"
|
|
148
|
+
|
|
149
|
+
- name: Install dependencies
|
|
150
|
+
run: npm ci
|
|
151
|
+
|
|
152
|
+
- name: Run tests
|
|
153
|
+
run: npx playwright test
|
|
154
|
+
env:
|
|
155
|
+
HOME: /root
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Docker
|
|
159
|
+
|
|
160
|
+
### Dockerfile
|
|
161
|
+
|
|
162
|
+
```dockerfile
|
|
163
|
+
FROM mcr.microsoft.com/playwright:v1.40.0-jammy
|
|
164
|
+
|
|
165
|
+
WORKDIR /app
|
|
166
|
+
|
|
167
|
+
COPY package*.json ./
|
|
168
|
+
RUN npm ci
|
|
169
|
+
|
|
170
|
+
COPY . .
|
|
171
|
+
|
|
172
|
+
CMD ["npx", "playwright", "test"]
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Docker Compose
|
|
176
|
+
|
|
177
|
+
```yaml
|
|
178
|
+
# docker-compose.yml
|
|
179
|
+
version: "3.8"
|
|
180
|
+
|
|
181
|
+
services:
|
|
182
|
+
playwright:
|
|
183
|
+
build: .
|
|
184
|
+
volumes:
|
|
185
|
+
- ./playwright-report:/app/playwright-report
|
|
186
|
+
- ./test-results:/app/test-results
|
|
187
|
+
environment:
|
|
188
|
+
- CI=true
|
|
189
|
+
- BASE_URL=http://app:3000
|
|
190
|
+
depends_on:
|
|
191
|
+
- app
|
|
192
|
+
|
|
193
|
+
app:
|
|
194
|
+
build: ./app
|
|
195
|
+
ports:
|
|
196
|
+
- "3000:3000"
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Run with Docker
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Build and run
|
|
203
|
+
docker build -t playwright-tests .
|
|
204
|
+
docker run --rm -v $(pwd)/playwright-report:/app/playwright-report playwright-tests
|
|
205
|
+
|
|
206
|
+
# With docker-compose
|
|
207
|
+
docker-compose run --rm playwright
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Reporting
|
|
211
|
+
|
|
212
|
+
### Configuration
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
// playwright.config.ts
|
|
216
|
+
export default defineConfig({
|
|
217
|
+
reporter: [
|
|
218
|
+
// Always generate
|
|
219
|
+
["html", { outputFolder: "playwright-report" }],
|
|
220
|
+
|
|
221
|
+
// Console output
|
|
222
|
+
["list"],
|
|
223
|
+
|
|
224
|
+
// CI-friendly
|
|
225
|
+
["github"], // GitHub Actions annotations
|
|
226
|
+
|
|
227
|
+
// JUnit for CI integration
|
|
228
|
+
["junit", { outputFile: "results.xml" }],
|
|
229
|
+
|
|
230
|
+
// JSON for custom processing
|
|
231
|
+
["json", { outputFile: "results.json" }],
|
|
232
|
+
|
|
233
|
+
// Blob for merging shards
|
|
234
|
+
["blob", { outputDir: "blob-report" }],
|
|
235
|
+
],
|
|
236
|
+
});
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### CI-Specific Reporter
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
export default defineConfig({
|
|
243
|
+
reporter: process.env.CI
|
|
244
|
+
? [["github"], ["blob"], ["html"]]
|
|
245
|
+
: [["list"], ["html"]],
|
|
246
|
+
});
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Sharding
|
|
250
|
+
|
|
251
|
+
### Command Line
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# Split into 4 shards, run shard 1
|
|
255
|
+
npx playwright test --shard=1/4
|
|
256
|
+
|
|
257
|
+
# Run shard 2
|
|
258
|
+
npx playwright test --shard=2/4
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Configuration
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
// playwright.config.ts
|
|
265
|
+
export default defineConfig({
|
|
266
|
+
// Evenly distribute tests across shards
|
|
267
|
+
fullyParallel: true,
|
|
268
|
+
|
|
269
|
+
// For blob reporter to merge later
|
|
270
|
+
reporter: process.env.CI ? [["blob"]] : [["html"]],
|
|
271
|
+
});
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Merge Sharded Reports
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
# After all shards complete, merge blob reports
|
|
278
|
+
npx playwright merge-reports --reporter html ./all-blob-reports
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Environment Management
|
|
282
|
+
|
|
283
|
+
### Environment Variables
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
// playwright.config.ts
|
|
287
|
+
import { defineConfig } from "@playwright/test";
|
|
288
|
+
import dotenv from "dotenv";
|
|
289
|
+
|
|
290
|
+
// Load env file based on environment
|
|
291
|
+
dotenv.config({ path: `.env.${process.env.NODE_ENV || "development"}` });
|
|
292
|
+
|
|
293
|
+
export default defineConfig({
|
|
294
|
+
use: {
|
|
295
|
+
baseURL: process.env.BASE_URL || "http://localhost:3000",
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Multiple Environments
|
|
301
|
+
|
|
302
|
+
```yaml
|
|
303
|
+
# .github/workflows/playwright.yml
|
|
304
|
+
jobs:
|
|
305
|
+
test:
|
|
306
|
+
strategy:
|
|
307
|
+
matrix:
|
|
308
|
+
environment: [staging, production]
|
|
309
|
+
steps:
|
|
310
|
+
- name: Run tests
|
|
311
|
+
run: npx playwright test
|
|
312
|
+
env:
|
|
313
|
+
BASE_URL: ${{ matrix.environment == 'staging' && 'https://staging.example.com' || 'https://example.com' }}
|
|
314
|
+
TEST_USER: ${{ secrets[format('TEST_USER_{0}', matrix.environment)] }}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Secrets Management
|
|
318
|
+
|
|
319
|
+
```yaml
|
|
320
|
+
# GitHub Actions secrets
|
|
321
|
+
- name: Run tests
|
|
322
|
+
run: npx playwright test
|
|
323
|
+
env:
|
|
324
|
+
TEST_EMAIL: ${{ secrets.TEST_EMAIL }}
|
|
325
|
+
TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
// tests use environment variables
|
|
330
|
+
test("login", async ({ page }) => {
|
|
331
|
+
await page.getByLabel("Email").fill(process.env.TEST_EMAIL!);
|
|
332
|
+
await page.getByLabel("Password").fill(process.env.TEST_PASSWORD!);
|
|
333
|
+
});
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
## Caching
|
|
337
|
+
|
|
338
|
+
### Cache Playwright Browsers
|
|
339
|
+
|
|
340
|
+
```yaml
|
|
341
|
+
- name: Cache Playwright browsers
|
|
342
|
+
uses: actions/cache@v4
|
|
343
|
+
id: playwright-cache
|
|
344
|
+
with:
|
|
345
|
+
path: ~/.cache/ms-playwright
|
|
346
|
+
key: playwright-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
|
|
347
|
+
|
|
348
|
+
- name: Install Playwright browsers
|
|
349
|
+
if: steps.playwright-cache.outputs.cache-hit != 'true'
|
|
350
|
+
run: npx playwright install --with-deps
|
|
351
|
+
|
|
352
|
+
- name: Install system deps only
|
|
353
|
+
if: steps.playwright-cache.outputs.cache-hit == 'true'
|
|
354
|
+
run: npx playwright install-deps
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Cache Node Modules
|
|
358
|
+
|
|
359
|
+
```yaml
|
|
360
|
+
- uses: actions/setup-node@v4
|
|
361
|
+
with:
|
|
362
|
+
node-version: 22
|
|
363
|
+
cache: "npm"
|
|
364
|
+
|
|
365
|
+
- name: Install dependencies
|
|
366
|
+
run: npm ci
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
## Tag-Based Test Filtering
|
|
370
|
+
|
|
371
|
+
### Run Specific Tags in CI
|
|
372
|
+
|
|
373
|
+
```yaml
|
|
374
|
+
# Run smoke tests on PR
|
|
375
|
+
- name: Run smoke tests
|
|
376
|
+
run: npx playwright test --grep @smoke
|
|
377
|
+
|
|
378
|
+
# Run full regression nightly
|
|
379
|
+
- name: Run regression
|
|
380
|
+
run: npx playwright test --grep @regression
|
|
381
|
+
|
|
382
|
+
# Exclude flaky tests
|
|
383
|
+
- name: Run stable tests
|
|
384
|
+
run: npx playwright test --grep-invert @flaky
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### PR vs Nightly Strategy
|
|
388
|
+
|
|
389
|
+
```yaml
|
|
390
|
+
# .github/workflows/pr.yml - Fast feedback
|
|
391
|
+
- name: Run critical tests
|
|
392
|
+
run: npx playwright test --grep "@smoke|@critical"
|
|
393
|
+
|
|
394
|
+
# .github/workflows/nightly.yml - Full coverage
|
|
395
|
+
- name: Run all tests
|
|
396
|
+
run: npx playwright test --grep-invert @flaky
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Tag Filtering in Config
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
// playwright.config.ts
|
|
403
|
+
export default defineConfig({
|
|
404
|
+
grep: process.env.CI ? /@smoke|@critical/ : undefined,
|
|
405
|
+
grepInvert: process.env.CI ? /@flaky/ : undefined,
|
|
406
|
+
});
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Project-Based Tag Filtering
|
|
410
|
+
|
|
411
|
+
```typescript
|
|
412
|
+
// playwright.config.ts
|
|
413
|
+
export default defineConfig({
|
|
414
|
+
projects: [
|
|
415
|
+
{
|
|
416
|
+
name: "smoke",
|
|
417
|
+
grep: /@smoke/,
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
name: "regression",
|
|
421
|
+
grepInvert: /@smoke/,
|
|
422
|
+
},
|
|
423
|
+
],
|
|
424
|
+
});
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
## Best Practices
|
|
428
|
+
|
|
429
|
+
| Practice | Benefit |
|
|
430
|
+
| ----------------------------- | ------------------------- |
|
|
431
|
+
| Use `npm ci` | Deterministic installs |
|
|
432
|
+
| Run headless in CI | Faster, no display needed |
|
|
433
|
+
| Set retries in CI only | Handle flakiness |
|
|
434
|
+
| Upload artifacts on failure | Debug failures |
|
|
435
|
+
| Use sharding for large suites | Faster execution |
|
|
436
|
+
| Cache browsers | Faster setup |
|
|
437
|
+
| Use blob reporter for shards | Merge reports correctly |
|
|
438
|
+
| Use tags for PR vs nightly | Fast feedback + coverage |
|
|
439
|
+
| Exclude @flaky in CI | Stable pipeline |
|
|
440
|
+
|
|
441
|
+
## CI Configuration Reference
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
// playwright.config.ts - CI optimized
|
|
445
|
+
export default defineConfig({
|
|
446
|
+
testDir: "./tests",
|
|
447
|
+
fullyParallel: true,
|
|
448
|
+
forbidOnly: !!process.env.CI,
|
|
449
|
+
retries: process.env.CI ? 2 : 0,
|
|
450
|
+
workers: process.env.CI ? 1 : undefined,
|
|
451
|
+
reporter: process.env.CI
|
|
452
|
+
? [["github"], ["blob"], ["html"]]
|
|
453
|
+
: [["list"], ["html"]],
|
|
454
|
+
use: {
|
|
455
|
+
baseURL: process.env.BASE_URL || "http://localhost:3000",
|
|
456
|
+
trace: "on-first-retry",
|
|
457
|
+
screenshot: "only-on-failure",
|
|
458
|
+
video: "on-first-retry",
|
|
459
|
+
},
|
|
460
|
+
});
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## Related References
|
|
464
|
+
|
|
465
|
+
- **Test tags**: See [test-tags.md](../core/test-tags.md) for tagging and filtering patterns
|
|
466
|
+
- **Performance optimization**: See [performance.md](performance.md) for sharding and parallelization
|
|
467
|
+
- **Debugging CI failures**: See [debugging.md](../debugging/debugging.md) for troubleshooting
|
|
468
|
+
- **Test reporting**: See [debugging.md](../debugging/debugging.md) for trace viewer usage
|