testdriverai 7.0.0 → 7.1.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.md +550 -0
- package/CODEOWNERS +0 -1
- package/README.md +126 -0
- package/agent/index.js +43 -18
- package/agent/lib/commands.js +794 -135
- package/agent/lib/redraw.js +124 -39
- package/agent/lib/sandbox.js +10 -1
- package/agent/lib/sdk.js +21 -0
- package/docs/MIGRATION.md +425 -0
- package/docs/PRESETS.md +210 -0
- package/docs/docs.json +91 -37
- package/docs/guide/best-practices-polling.mdx +154 -0
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/rightClick.mdx +123 -0
- package/docs/v7/getting-started/configuration.mdx +380 -0
- package/docs/v7/getting-started/quickstart.mdx +273 -140
- package/docs/v7/guides/best-practices.mdx +486 -0
- package/docs/v7/guides/caching-ai.mdx +215 -0
- package/docs/v7/guides/caching-selectors.mdx +292 -0
- package/docs/v7/guides/caching.mdx +366 -0
- package/docs/v7/guides/ci-cd/azure.mdx +587 -0
- package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
- package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
- package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
- package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
- package/docs/v7/guides/ci-cd/travis.mdx +438 -0
- package/docs/v7/guides/debugging.mdx +349 -0
- package/docs/v7/guides/faq.mdx +393 -0
- package/docs/v7/guides/performance.mdx +517 -0
- package/docs/v7/guides/troubleshooting.mdx +526 -0
- package/docs/v7/guides/vitest-plugin.mdx +477 -0
- package/docs/v7/guides/vitest.mdx +535 -0
- package/docs/v7/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +287 -0
- package/docs/v7/presets/electron.mdx +435 -0
- package/docs/v7/presets/vscode.mdx +398 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/docs/v7/progressive-apis/CORE.md +459 -0
- package/docs/v7/progressive-apis/HOOKS.md +360 -0
- package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
- package/docs/v7/progressive-apis/PROVISION.md +266 -0
- package/interfaces/vitest-plugin.mjs +186 -100
- package/package.json +12 -1
- package/sdk.d.ts +335 -42
- package/sdk.js +756 -95
- package/src/core/Dashcam.js +469 -0
- package/src/core/index.d.ts +150 -0
- package/src/core/index.js +12 -0
- package/src/presets/index.mjs +331 -0
- package/src/vitest/extended.mjs +108 -0
- package/src/vitest/hooks.d.ts +119 -0
- package/src/vitest/hooks.mjs +298 -0
- package/src/vitest/index.mjs +64 -0
- package/src/vitest/lifecycle.mjs +277 -0
- package/src/vitest/utils.mjs +150 -0
- package/test/dashcam.test.js +137 -0
- package/testdriver/acceptance-sdk/assert.test.mjs +13 -31
- package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
- package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +7 -19
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +6 -19
- package/testdriver/acceptance-sdk/exec-js.test.mjs +6 -18
- package/testdriver/acceptance-sdk/exec-output.test.mjs +8 -20
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +13 -25
- package/testdriver/acceptance-sdk/focus-window.test.mjs +8 -20
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +5 -20
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +10 -19
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +7 -19
- package/testdriver/acceptance-sdk/hover-text.test.mjs +5 -19
- package/testdriver/acceptance-sdk/match-image.test.mjs +7 -19
- package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +5 -19
- package/testdriver/acceptance-sdk/prompt.test.mjs +6 -18
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +6 -20
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +6 -18
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +9 -23
- package/testdriver/acceptance-sdk/scroll.test.mjs +12 -21
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +124 -352
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
- package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
- package/testdriver/acceptance-sdk/type.test.mjs +19 -58
- package/vitest.config.mjs +1 -0
- package/.vscode/mcp.json +0 -9
- package/MIGRATION.md +0 -389
- package/PLUGIN_MIGRATION.md +0 -222
- package/PROMPT_CACHE.md +0 -200
- package/SDK_LOGGING.md +0 -222
- package/SDK_MIGRATION.md +0 -474
- package/SDK_README.md +0 -1122
- package/debug-screenshot-1763401388589.png +0 -0
- package/examples/run-tests-with-recording.sh +0 -70
- package/examples/screenshot-example.js +0 -63
- package/examples/sdk-awesome-logs-demo.js +0 -177
- package/examples/sdk-cache-thresholds.js +0 -96
- package/examples/sdk-element-properties.js +0 -155
- package/examples/sdk-simple-example.js +0 -65
- package/examples/test-recording-example.test.js +0 -166
- package/mcp-server/AI_GUIDELINES.md +0 -57
- package/test-find-api.js +0 -73
- package/test-prompt-cache.js +0 -96
- package/test-sandbox-render.js +0 -28
- package/test-sdk-methods.js +0 -15
- package/test-sdk-refactor.js +0 -53
- package/test-stack-trace.mjs +0 -57
- package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "GitHub Actions"
|
|
3
|
+
description: "Run TestDriver tests in GitHub Actions"
|
|
4
|
+
icon: "github"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Basic Setup
|
|
8
|
+
|
|
9
|
+
Create `.github/workflows/test.yml`:
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
name: TestDriver Tests
|
|
13
|
+
|
|
14
|
+
on:
|
|
15
|
+
push:
|
|
16
|
+
branches: [main, develop]
|
|
17
|
+
pull_request:
|
|
18
|
+
branches: [main, develop]
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
test:
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v3
|
|
26
|
+
|
|
27
|
+
- name: Setup Node.js
|
|
28
|
+
uses: actions/setup-node@v3
|
|
29
|
+
with:
|
|
30
|
+
node-version: '18'
|
|
31
|
+
cache: 'npm'
|
|
32
|
+
|
|
33
|
+
- name: Install dependencies
|
|
34
|
+
run: npm ci
|
|
35
|
+
|
|
36
|
+
- name: Run TestDriver tests
|
|
37
|
+
env:
|
|
38
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
39
|
+
run: npx vitest
|
|
40
|
+
|
|
41
|
+
- name: Upload test results
|
|
42
|
+
if: always()
|
|
43
|
+
uses: actions/upload-artifact@v3
|
|
44
|
+
with:
|
|
45
|
+
name: test-results
|
|
46
|
+
path: test-results/
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Add API Key
|
|
50
|
+
|
|
51
|
+
1. Go to repository **Settings** → **Secrets and variables** → **Actions**
|
|
52
|
+
2. Click **New repository secret**
|
|
53
|
+
3. Name: `TD_API_KEY`
|
|
54
|
+
4. Value: Your API key from [dashboard.testdriver.ai](https://dashboard.testdriver.ai)
|
|
55
|
+
5. Click **Add secret**
|
|
56
|
+
|
|
57
|
+
## Parallel Tests
|
|
58
|
+
|
|
59
|
+
Run tests in parallel using matrix strategy:
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
jobs:
|
|
63
|
+
test:
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
strategy:
|
|
66
|
+
matrix:
|
|
67
|
+
shard: [1, 2, 3, 4]
|
|
68
|
+
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@v3
|
|
71
|
+
|
|
72
|
+
- name: Setup Node.js
|
|
73
|
+
uses: actions/setup-node@v3
|
|
74
|
+
with:
|
|
75
|
+
node-version: '18'
|
|
76
|
+
cache: 'npm'
|
|
77
|
+
|
|
78
|
+
- name: Install dependencies
|
|
79
|
+
run: npm ci
|
|
80
|
+
|
|
81
|
+
- name: Run shard ${{ matrix.shard }}
|
|
82
|
+
env:
|
|
83
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
84
|
+
run: npx vitest --shard=${{ matrix.shard }}/4
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
This runs 4 test shards in parallel, completing in ~25% of the time.
|
|
88
|
+
|
|
89
|
+
## Save Dashcam URLs
|
|
90
|
+
|
|
91
|
+
Capture replay URLs for debugging failures:
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
- name: Run tests
|
|
95
|
+
env:
|
|
96
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
97
|
+
run: npx vitest 2>&1 | tee test-output.log
|
|
98
|
+
|
|
99
|
+
- name: Extract Dashcam URLs
|
|
100
|
+
if: always()
|
|
101
|
+
run: |
|
|
102
|
+
grep -o 'https://dashcam.testdriver.ai/[a-zA-Z0-9-]*' test-output.log > dashcam-urls.txt || true
|
|
103
|
+
|
|
104
|
+
- name: Upload Dashcam URLs
|
|
105
|
+
if: always()
|
|
106
|
+
uses: actions/upload-artifact@v3
|
|
107
|
+
with:
|
|
108
|
+
name: dashcam-urls
|
|
109
|
+
path: dashcam-urls.txt
|
|
110
|
+
|
|
111
|
+
- name: Comment on PR
|
|
112
|
+
if: failure() && github.event_name == 'pull_request'
|
|
113
|
+
uses: actions/github-script@v6
|
|
114
|
+
with:
|
|
115
|
+
script: |
|
|
116
|
+
const fs = require('fs');
|
|
117
|
+
const urls = fs.readFileSync('dashcam-urls.txt', 'utf8').trim().split('\n');
|
|
118
|
+
const body = '## ❌ Tests Failed\n\n**Dashcam Replays:**\n' +
|
|
119
|
+
urls.map(url => `- ${url}`).join('\n');
|
|
120
|
+
|
|
121
|
+
github.rest.issues.createComment({
|
|
122
|
+
issue_number: context.issue.number,
|
|
123
|
+
owner: context.repo.owner,
|
|
124
|
+
repo: context.repo.repo,
|
|
125
|
+
body: body
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Scheduled Tests
|
|
130
|
+
|
|
131
|
+
Run tests on schedule:
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
on:
|
|
135
|
+
schedule:
|
|
136
|
+
- cron: '0 */6 * * *' # Every 6 hours
|
|
137
|
+
workflow_dispatch: # Manual trigger button
|
|
138
|
+
push:
|
|
139
|
+
branches: [main]
|
|
140
|
+
pull_request:
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Cache Dependencies
|
|
144
|
+
|
|
145
|
+
Speed up workflow with dependency caching:
|
|
146
|
+
|
|
147
|
+
```yaml
|
|
148
|
+
- name: Setup Node.js
|
|
149
|
+
uses: actions/setup-node@v3
|
|
150
|
+
with:
|
|
151
|
+
node-version: '18'
|
|
152
|
+
cache: 'npm' # Built-in npm cache
|
|
153
|
+
|
|
154
|
+
# Or manually cache
|
|
155
|
+
- name: Cache node modules
|
|
156
|
+
uses: actions/cache@v3
|
|
157
|
+
with:
|
|
158
|
+
path: ~/.npm
|
|
159
|
+
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
|
160
|
+
restore-keys: |
|
|
161
|
+
${{ runner.os }}-node-
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Conditional Execution
|
|
165
|
+
|
|
166
|
+
Skip tests on documentation changes:
|
|
167
|
+
|
|
168
|
+
```yaml
|
|
169
|
+
on:
|
|
170
|
+
pull_request:
|
|
171
|
+
paths-ignore:
|
|
172
|
+
- '**.md'
|
|
173
|
+
- 'docs/**'
|
|
174
|
+
- 'README.md'
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Or run only on specific file changes:
|
|
178
|
+
|
|
179
|
+
```yaml
|
|
180
|
+
on:
|
|
181
|
+
pull_request:
|
|
182
|
+
paths:
|
|
183
|
+
- 'src/**'
|
|
184
|
+
- 'test/**'
|
|
185
|
+
- 'package.json'
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Test Results
|
|
189
|
+
|
|
190
|
+
Publish test results to GitHub UI:
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
- name: Run tests
|
|
194
|
+
env:
|
|
195
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
196
|
+
run: npx vitest
|
|
197
|
+
|
|
198
|
+
- name: Publish test results
|
|
199
|
+
if: always()
|
|
200
|
+
uses: dorny/test-reporter@v1
|
|
201
|
+
with:
|
|
202
|
+
name: TestDriver Tests
|
|
203
|
+
path: test-results/junit.xml
|
|
204
|
+
reporter: java-junit
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Requires JUnit reporter in `vitest.config.mjs`:
|
|
208
|
+
|
|
209
|
+
```javascript
|
|
210
|
+
export default defineConfig({
|
|
211
|
+
test: {
|
|
212
|
+
reporters: ['default', 'junit'],
|
|
213
|
+
outputFile: {
|
|
214
|
+
junit: './test-results/junit.xml'
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Multiple Node Versions
|
|
221
|
+
|
|
222
|
+
Test across Node.js versions:
|
|
223
|
+
|
|
224
|
+
```yaml
|
|
225
|
+
jobs:
|
|
226
|
+
test:
|
|
227
|
+
runs-on: ubuntu-latest
|
|
228
|
+
strategy:
|
|
229
|
+
matrix:
|
|
230
|
+
node-version: [16, 18, 20]
|
|
231
|
+
|
|
232
|
+
steps:
|
|
233
|
+
- uses: actions/checkout@v3
|
|
234
|
+
|
|
235
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
236
|
+
uses: actions/setup-node@v3
|
|
237
|
+
with:
|
|
238
|
+
node-version: ${{ matrix.node-version }}
|
|
239
|
+
|
|
240
|
+
- run: npm ci
|
|
241
|
+
- run: npx vitest
|
|
242
|
+
env:
|
|
243
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Fail Fast
|
|
247
|
+
|
|
248
|
+
Stop on first failure to save minutes:
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
- name: Run tests
|
|
252
|
+
env:
|
|
253
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
254
|
+
run: npx vitest --bail
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Or stop other jobs when one fails:
|
|
258
|
+
|
|
259
|
+
```yaml
|
|
260
|
+
jobs:
|
|
261
|
+
test:
|
|
262
|
+
strategy:
|
|
263
|
+
fail-fast: true # Stop all jobs on first failure
|
|
264
|
+
matrix:
|
|
265
|
+
shard: [1, 2, 3, 4]
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## Reusable Workflow
|
|
269
|
+
|
|
270
|
+
Create reusable workflow for multiple repos:
|
|
271
|
+
|
|
272
|
+
```yaml
|
|
273
|
+
# .github/workflows/testdriver-reusable.yml
|
|
274
|
+
name: TestDriver (Reusable)
|
|
275
|
+
|
|
276
|
+
on:
|
|
277
|
+
workflow_call:
|
|
278
|
+
secrets:
|
|
279
|
+
TD_API_KEY:
|
|
280
|
+
required: true
|
|
281
|
+
|
|
282
|
+
jobs:
|
|
283
|
+
test:
|
|
284
|
+
runs-on: ubuntu-latest
|
|
285
|
+
steps:
|
|
286
|
+
- uses: actions/checkout@v3
|
|
287
|
+
- uses: actions/setup-node@v3
|
|
288
|
+
with:
|
|
289
|
+
node-version: '18'
|
|
290
|
+
- run: npm ci
|
|
291
|
+
- run: npx vitest
|
|
292
|
+
env:
|
|
293
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Use in other workflows:
|
|
297
|
+
|
|
298
|
+
```yaml
|
|
299
|
+
# .github/workflows/test.yml
|
|
300
|
+
name: Tests
|
|
301
|
+
|
|
302
|
+
on: [push, pull_request]
|
|
303
|
+
|
|
304
|
+
jobs:
|
|
305
|
+
test:
|
|
306
|
+
uses: ./.github/workflows/testdriver-reusable.yml
|
|
307
|
+
secrets:
|
|
308
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Environment-Specific Tests
|
|
312
|
+
|
|
313
|
+
Test against different environments:
|
|
314
|
+
|
|
315
|
+
```yaml
|
|
316
|
+
jobs:
|
|
317
|
+
test:
|
|
318
|
+
runs-on: ubuntu-latest
|
|
319
|
+
strategy:
|
|
320
|
+
matrix:
|
|
321
|
+
environment: [staging, production]
|
|
322
|
+
|
|
323
|
+
steps:
|
|
324
|
+
- uses: actions/checkout@v3
|
|
325
|
+
- uses: actions/setup-node@v3
|
|
326
|
+
with:
|
|
327
|
+
node-version: '18'
|
|
328
|
+
- run: npm ci
|
|
329
|
+
- run: npx vitest
|
|
330
|
+
env:
|
|
331
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
332
|
+
TEST_URL: ${{ matrix.environment == 'staging' && 'https://staging.example.com' || 'https://example.com' }}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
## Troubleshooting
|
|
336
|
+
|
|
337
|
+
### Tests timeout
|
|
338
|
+
|
|
339
|
+
Increase timeout:
|
|
340
|
+
|
|
341
|
+
```yaml
|
|
342
|
+
- name: Run tests
|
|
343
|
+
timeout-minutes: 30 # Default is 360
|
|
344
|
+
env:
|
|
345
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
346
|
+
run: npx vitest
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### API key not found
|
|
350
|
+
|
|
351
|
+
Debug environment variables:
|
|
352
|
+
|
|
353
|
+
```yaml
|
|
354
|
+
- name: Debug
|
|
355
|
+
run: |
|
|
356
|
+
echo "Has TD_API_KEY: ${{ secrets.TD_API_KEY != '' }}"
|
|
357
|
+
echo "Node version: $(node --version)"
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Out of disk space
|
|
361
|
+
|
|
362
|
+
Clean up before running:
|
|
363
|
+
|
|
364
|
+
```yaml
|
|
365
|
+
- name: Free disk space
|
|
366
|
+
run: |
|
|
367
|
+
sudo rm -rf /usr/share/dotnet
|
|
368
|
+
sudo rm -rf /opt/ghc
|
|
369
|
+
sudo rm -rf /usr/local/share/boost
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## Complete Example
|
|
373
|
+
|
|
374
|
+
Full-featured workflow:
|
|
375
|
+
|
|
376
|
+
```yaml
|
|
377
|
+
name: TestDriver Tests
|
|
378
|
+
|
|
379
|
+
on:
|
|
380
|
+
push:
|
|
381
|
+
branches: [main, develop]
|
|
382
|
+
pull_request:
|
|
383
|
+
branches: [main, develop]
|
|
384
|
+
schedule:
|
|
385
|
+
- cron: '0 2 * * *' # 2 AM daily
|
|
386
|
+
workflow_dispatch:
|
|
387
|
+
|
|
388
|
+
jobs:
|
|
389
|
+
test:
|
|
390
|
+
runs-on: ubuntu-latest
|
|
391
|
+
timeout-minutes: 30
|
|
392
|
+
strategy:
|
|
393
|
+
fail-fast: false
|
|
394
|
+
matrix:
|
|
395
|
+
shard: [1, 2, 3, 4]
|
|
396
|
+
|
|
397
|
+
steps:
|
|
398
|
+
- name: Checkout
|
|
399
|
+
uses: actions/checkout@v3
|
|
400
|
+
|
|
401
|
+
- name: Setup Node.js
|
|
402
|
+
uses: actions/setup-node@v3
|
|
403
|
+
with:
|
|
404
|
+
node-version: '18'
|
|
405
|
+
cache: 'npm'
|
|
406
|
+
|
|
407
|
+
- name: Install dependencies
|
|
408
|
+
run: npm ci
|
|
409
|
+
|
|
410
|
+
- name: Run tests (shard ${{ matrix.shard }}/4)
|
|
411
|
+
env:
|
|
412
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
413
|
+
run: npx vitest --shard=${{ matrix.shard }}/4 2>&1 | tee test-output.log
|
|
414
|
+
|
|
415
|
+
- name: Extract Dashcam URLs
|
|
416
|
+
if: always()
|
|
417
|
+
run: |
|
|
418
|
+
grep -o 'https://dashcam.testdriver.ai/[a-zA-Z0-9-]*' test-output.log > dashcam-urls.txt || true
|
|
419
|
+
|
|
420
|
+
- name: Upload test results
|
|
421
|
+
if: always()
|
|
422
|
+
uses: actions/upload-artifact@v3
|
|
423
|
+
with:
|
|
424
|
+
name: test-results-${{ matrix.shard }}
|
|
425
|
+
path: |
|
|
426
|
+
test-results/
|
|
427
|
+
test-output.log
|
|
428
|
+
dashcam-urls.txt
|
|
429
|
+
|
|
430
|
+
- name: Publish test results
|
|
431
|
+
if: always()
|
|
432
|
+
uses: dorny/test-reporter@v1
|
|
433
|
+
with:
|
|
434
|
+
name: Tests (Shard ${{ matrix.shard }})
|
|
435
|
+
path: test-results/junit.xml
|
|
436
|
+
reporter: java-junit
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## See Also
|
|
440
|
+
|
|
441
|
+
<CardGroup cols={2}>
|
|
442
|
+
<Card title="CI/CD Overview" icon="arrows-spin" href="/v7/guides/ci-cd/overview">
|
|
443
|
+
CI/CD concepts
|
|
444
|
+
</Card>
|
|
445
|
+
|
|
446
|
+
<Card title="Performance" icon="gauge" href="/v7/guides/performance">
|
|
447
|
+
Optimize tests
|
|
448
|
+
</Card>
|
|
449
|
+
|
|
450
|
+
<Card title="Troubleshooting" icon="circle-question" href="/v7/guides/troubleshooting">
|
|
451
|
+
Common issues
|
|
452
|
+
</Card>
|
|
453
|
+
|
|
454
|
+
<Card title="GitHub Actions Docs" icon="book" href="https://docs.github.com/en/actions">
|
|
455
|
+
Official docs
|
|
456
|
+
</Card>
|
|
457
|
+
</CardGroup>
|