testdriverai 6.2.1 → 7.0.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/.github/workflows/acceptance-linux.yml +75 -0
- package/.github/workflows/acceptance-sdk-tests.yml +133 -0
- package/.vscode/settings.json +5 -1
- package/MIGRATION.md +389 -0
- package/PLUGIN_MIGRATION.md +222 -0
- package/PROMPT_CACHE.md +200 -0
- package/SDK_LOGGING.md +222 -0
- package/SDK_MIGRATION.md +474 -0
- package/SDK_README.md +1122 -0
- package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
- package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
- package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
- package/_testdriver/lifecycle/prerun.yaml +15 -0
- package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
- package/agent/index.js +258 -68
- package/agent/interface.js +15 -0
- package/agent/lib/cache.js +142 -0
- package/agent/lib/commander.js +1 -39
- package/agent/lib/commands.js +143 -188
- package/agent/lib/redraw.js +6 -3
- package/agent/lib/sandbox.js +19 -5
- package/agent/lib/sdk.js +1 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debug-screenshot-1763401388589.png +0 -0
- package/debugger/index.html +16 -5
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/QUICK_START_TEST_RECORDING.md +215 -0
- package/docs/SDK_AWESOME_LOGS.md +468 -0
- package/docs/TEST_RECORDING.md +388 -0
- package/docs/docs.json +232 -152
- package/docs/sdk-browser-rendering.md +167 -0
- package/docs/v6/getting-started/self-hosting.mdx +407 -0
- package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
- package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
- package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v7/README.md +135 -0
- package/docs/v7/api/ai.mdx +205 -0
- package/docs/v7/api/assert.mdx +285 -0
- package/docs/v7/api/assertions.mdx +403 -0
- package/docs/v7/api/click.mdx +287 -0
- package/docs/v7/api/client.mdx +322 -0
- package/docs/v7/api/elements.mdx +479 -0
- package/docs/v7/api/exec.mdx +346 -0
- package/docs/v7/api/find.mdx +316 -0
- package/docs/v7/api/focusApplication.mdx +294 -0
- package/docs/v7/api/hover.mdx +279 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/sandbox.mdx +404 -0
- package/docs/v7/api/scroll.mdx +300 -0
- package/docs/v7/api/type.mdx +314 -0
- package/docs/v7/commands/assert.mdx +45 -0
- package/docs/v7/commands/exec.mdx +282 -0
- package/docs/v7/commands/focus-application.mdx +44 -0
- package/docs/v7/commands/hover-image.mdx +69 -0
- package/docs/v7/commands/hover-text.mdx +47 -0
- package/docs/v7/commands/if.mdx +53 -0
- package/docs/v7/commands/match-image.mdx +67 -0
- package/docs/v7/commands/press-keys.mdx +87 -0
- package/docs/v7/commands/remember.mdx +49 -0
- package/docs/v7/commands/run.mdx +44 -0
- package/docs/v7/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/commands/scroll.mdx +69 -0
- package/docs/v7/commands/type.mdx +45 -0
- package/docs/v7/commands/wait-for-image.mdx +54 -0
- package/docs/v7/commands/wait-for-text.mdx +48 -0
- package/docs/v7/commands/wait.mdx +45 -0
- package/docs/v7/getting-started/quickstart.mdx +199 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/playwright.mdx +342 -0
- package/eslint.config.js +19 -1
- package/examples/run-tests-with-recording.sh +70 -0
- package/examples/screenshot-example.js +63 -0
- package/examples/sdk-awesome-logs-demo.js +177 -0
- package/examples/sdk-cache-thresholds.js +96 -0
- package/examples/sdk-element-properties.js +155 -0
- package/examples/sdk-simple-example.js +65 -0
- package/examples/test-recording-example.test.js +166 -0
- package/interfaces/cli/lib/base.js +10 -4
- package/interfaces/logger.js +2 -1
- package/interfaces/shared-test-state.mjs +69 -0
- package/interfaces/vitest-plugin.mjs +744 -0
- package/mcp-server/AI_GUIDELINES.md +57 -0
- package/package.json +18 -5
- package/schema.json +8 -29
- package/scripts/view-test-results.mjs +96 -0
- package/sdk-log-formatter.js +714 -0
- package/sdk.d.ts +735 -0
- package/sdk.js +1906 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/test/mcp-example-test.yaml +27 -0
- package/test-find-api.js +73 -0
- package/test-prompt-cache.js +96 -0
- package/test-sandbox-render.js +28 -0
- package/test-sdk-methods.js +15 -0
- package/test-sdk-refactor.js +53 -0
- package/test-stack-trace.mjs +57 -0
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
- package/testdriver/acceptance-sdk/README.md +128 -0
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
- package/testdriver/acceptance-sdk/assert.test.mjs +44 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +70 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +38 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +55 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +71 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +69 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +48 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +41 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +43 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +50 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +41 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +48 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +64 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +45 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +52 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +51 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +42 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +50 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +239 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +648 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +84 -0
- package/verify-element-api.js +89 -0
- package/verify-types.js +0 -0
- package/vitest.config.example.js +19 -0
- package/vitest.config.mjs +65 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/docs/overview/comparison.mdx +0 -82
- package/testdriver/lifecycle/prerun.yaml +0 -17
- /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
- /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
- /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
- /package/docs/{account → v6/account}/dashboard.mdx +0 -0
- /package/docs/{account → v6/account}/enterprise.mdx +0 -0
- /package/docs/{account → v6/account}/pricing.mdx +0 -0
- /package/docs/{account → v6/account}/projects.mdx +0 -0
- /package/docs/{account → v6/account}/team.mdx +0 -0
- /package/docs/{action → v6/action}/ami.mdx +0 -0
- /package/docs/{action → v6/action}/performance.mdx +0 -0
- /package/docs/{action → v6/action}/secrets.mdx +0 -0
- /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
- /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
- /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
- /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
- /package/docs/{cli → v6/cli}/overview.mdx +0 -0
- /package/docs/{commands → v6/commands}/assert.mdx +0 -0
- /package/docs/{commands → v6/commands}/exec.mdx +0 -0
- /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/if.mdx +0 -0
- /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
- /package/docs/{commands → v6/commands}/remember.mdx +0 -0
- /package/docs/{commands → v6/commands}/run.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
- /package/docs/{commands → v6/commands}/type.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
- /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
- /package/docs/{features → v6/features}/generation.mdx +0 -0
- /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
- /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
- /package/docs/{features → v6/features}/selectorless.mdx +0 -0
- /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
- /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
- /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
- /package/docs/{guide → v6/guide}/code.mdx +0 -0
- /package/docs/{guide → v6/guide}/locating.mdx +0 -0
- /package/docs/{guide → v6/guide}/protips.mdx +0 -0
- /package/docs/{guide → v6/guide}/variables.mdx +0 -0
- /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
- /package/docs/{importing → v6/importing}/csv.mdx +0 -0
- /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
- /package/docs/{importing → v6/importing}/jira.mdx +0 -0
- /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
- /package/docs/{overview → v6/overview}/faq.mdx +0 -0
- /package/docs/{overview → v6/overview}/performance.mdx +0 -0
- /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
- /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
- /package/docs/{security → v6/security}/action.mdx +0 -0
- /package/docs/{security → v6/security}/agent.mdx +0 -0
- /package/docs/{security → v6/security}/platform.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# AWESOME Logs - Quick Reference 🎨
|
|
2
|
+
|
|
3
|
+
## At a Glance
|
|
4
|
+
|
|
5
|
+
Your TestDriver SDK now has **beautiful, emoji-rich logs** with great DX!
|
|
6
|
+
|
|
7
|
+
### What You'll See
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
[2.34s] 🔍 Found "submit button" · 📍 (682, 189) · ⏱️ 167ms · ⚡ cached
|
|
11
|
+
[2.51s] 👆 Click "submit button"
|
|
12
|
+
[2.67s] 👉 Hover "menu item"
|
|
13
|
+
[2.89s] ⌨️ Type → hello world
|
|
14
|
+
[3.12s] ✅ Assert "page title correct" · ✓ PASSED · ⏱️ 45ms
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Emoji Guide
|
|
18
|
+
|
|
19
|
+
| Emoji | Meaning |
|
|
20
|
+
|-------|---------|
|
|
21
|
+
| 🔍 | Finding element |
|
|
22
|
+
| 👆 | Click |
|
|
23
|
+
| 👉 | Hover |
|
|
24
|
+
| ⌨️ | Type |
|
|
25
|
+
| 📜 | Scroll |
|
|
26
|
+
| ✅ | Success/Passed |
|
|
27
|
+
| ❌ | Error/Failed |
|
|
28
|
+
| ⚡ | Cache hit |
|
|
29
|
+
| 💤 | Cache miss |
|
|
30
|
+
| 📍 | Coordinates |
|
|
31
|
+
| ⏱️ | Duration |
|
|
32
|
+
| 🔌 | Connect/Disconnect |
|
|
33
|
+
| 📸 | Screenshot |
|
|
34
|
+
|
|
35
|
+
## Performance Colors
|
|
36
|
+
|
|
37
|
+
Duration times are color-coded:
|
|
38
|
+
|
|
39
|
+
- **🟢 < 100ms** - Fast
|
|
40
|
+
- **🟡 100-500ms** - Acceptable
|
|
41
|
+
- **🔴 > 500ms** - Slow
|
|
42
|
+
|
|
43
|
+
## Enable/Disable
|
|
44
|
+
|
|
45
|
+
```javascript
|
|
46
|
+
// Enabled by default
|
|
47
|
+
const client = new TestDriver(apiKey, {
|
|
48
|
+
logging: true
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Disable if needed
|
|
52
|
+
client.setLogging(false);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Debug Mode
|
|
56
|
+
|
|
57
|
+
For detailed cache information:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
VERBOSE=true node your-test.js
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
You'll see:
|
|
64
|
+
- Cache strategy (image/text)
|
|
65
|
+
- Similarity scores
|
|
66
|
+
- Pixel diff percentages
|
|
67
|
+
- Cache age
|
|
68
|
+
|
|
69
|
+
## Examples
|
|
70
|
+
|
|
71
|
+
Try these:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Simple example
|
|
75
|
+
TD_API_KEY=your_key node examples/sdk-simple-example.js
|
|
76
|
+
|
|
77
|
+
# Full demo
|
|
78
|
+
TD_API_KEY=your_key node examples/sdk-awesome-logs-demo.js
|
|
79
|
+
|
|
80
|
+
# Cache demo with debug info
|
|
81
|
+
TD_API_KEY=your_key VERBOSE=true node examples/sdk-cache-thresholds.js
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Custom Formatting
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
const { formatter } = require('testdriverai/sdk-log-formatter');
|
|
88
|
+
|
|
89
|
+
console.log(formatter.formatHeader('My Test', '🧪'));
|
|
90
|
+
console.log(formatter.formatAction('click', 'button'));
|
|
91
|
+
console.log(formatter.formatProgress(3, 10, 'Processing'));
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Full Documentation
|
|
95
|
+
|
|
96
|
+
See [SDK_AWESOME_LOGS.md](./SDK_AWESOME_LOGS.md) for complete documentation.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
**Enjoy your AWESOME logs! 🎨✨**
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Quick Start: TestDriver Test Recording
|
|
2
|
+
|
|
3
|
+
## What You Get
|
|
4
|
+
|
|
5
|
+
- 📊 Track all test runs in the TestDriver dashboard
|
|
6
|
+
- 🎥 Link dashcam screen recordings to specific tests
|
|
7
|
+
- 🔄 Integrate with CI/CD (GitHub Actions, GitLab, etc.)
|
|
8
|
+
- 🐛 View exact replay of failed tests
|
|
9
|
+
- 📈 Track test performance and flakiness over time
|
|
10
|
+
|
|
11
|
+
## Setup (5 minutes)
|
|
12
|
+
|
|
13
|
+
### 1. Add Vitest Plugin
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
// vitest.config.mjs
|
|
17
|
+
import { defineConfig } from 'vitest/config';
|
|
18
|
+
import testDriverPlugin from './interfaces/vitest-plugin.mjs';
|
|
19
|
+
|
|
20
|
+
export default defineConfig({
|
|
21
|
+
plugins: [
|
|
22
|
+
testDriverPlugin({
|
|
23
|
+
apiKey: process.env.TD_API_KEY,
|
|
24
|
+
apiRoot: process.env.TD_API_ROOT || 'https://testdriver-api.onrender.com',
|
|
25
|
+
}),
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Set API Key
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
export TD_API_KEY="your-api-key-here"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Get your API key from: https://app.testdriver.ai/settings/api-keys
|
|
37
|
+
|
|
38
|
+
### 3. Run Tests
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx vitest run
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
That's it! Your tests are now being recorded. View results at:
|
|
45
|
+
https://app.testdriver.ai/dashboard/test-runs
|
|
46
|
+
|
|
47
|
+
## With Dashcam (Optional)
|
|
48
|
+
|
|
49
|
+
To link screen recordings with tests, simply register the dashcam URL after your test completes:
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
import { test } from 'vitest';
|
|
53
|
+
import TestDriver from '@testdriverai/sdk';
|
|
54
|
+
|
|
55
|
+
test('my test', async () => {
|
|
56
|
+
const client = await TestDriver({ apiKey: 'your-api-key' });
|
|
57
|
+
|
|
58
|
+
// Run your test...
|
|
59
|
+
await client.get('https://example.com');
|
|
60
|
+
|
|
61
|
+
// Get dashcam URL and register it
|
|
62
|
+
const dashcamUrl = await client.dashcam.publish();
|
|
63
|
+
|
|
64
|
+
// Register with the plugin - it will automatically associate with this test
|
|
65
|
+
if (globalThis.__testdriverPlugin) {
|
|
66
|
+
globalThis.__testdriverPlugin.registerDashcamUrl(
|
|
67
|
+
'my-test-id', // Or use task.id in Vitest context
|
|
68
|
+
dashcamUrl,
|
|
69
|
+
client.os
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
await client.disconnect();
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The plugin automatically tracks all dashcam URLs in memory (no temp files needed!) and associates them with test results.
|
|
78
|
+
|
|
79
|
+
## CI/CD Integration
|
|
80
|
+
|
|
81
|
+
### GitHub Actions
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
# .github/workflows/test.yml
|
|
85
|
+
name: Tests
|
|
86
|
+
on: [push]
|
|
87
|
+
jobs:
|
|
88
|
+
test:
|
|
89
|
+
runs-on: windows-latest
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/checkout@v3
|
|
92
|
+
- run: npm install
|
|
93
|
+
- run: npx vitest run
|
|
94
|
+
env:
|
|
95
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### GitLab CI
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
# .gitlab-ci.yml
|
|
102
|
+
test:
|
|
103
|
+
script:
|
|
104
|
+
- npm install
|
|
105
|
+
- npx vitest run
|
|
106
|
+
variables:
|
|
107
|
+
TD_API_KEY: $CI_JOB_TOKEN
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The reporter automatically detects CI environment and records:
|
|
111
|
+
- Git repo, branch, commit
|
|
112
|
+
- CI provider and run URL
|
|
113
|
+
- Test results and timing
|
|
114
|
+
|
|
115
|
+
## What Gets Recorded
|
|
116
|
+
|
|
117
|
+
### Test Run
|
|
118
|
+
- Suite name and platform
|
|
119
|
+
- Total/passed/failed counts
|
|
120
|
+
- Duration
|
|
121
|
+
- CI/CD metadata
|
|
122
|
+
- Git commit info
|
|
123
|
+
|
|
124
|
+
### Each Test
|
|
125
|
+
- Test name and file
|
|
126
|
+
- Pass/fail status
|
|
127
|
+
- Error messages (if failed)
|
|
128
|
+
- Duration
|
|
129
|
+
- Dashcam replay link (if available)
|
|
130
|
+
|
|
131
|
+
## View Results
|
|
132
|
+
|
|
133
|
+
Dashboard shows:
|
|
134
|
+
- All test runs with filters
|
|
135
|
+
- Drill down to individual tests
|
|
136
|
+
- Embedded dashcam replay player
|
|
137
|
+
- Link to CI/CD runs
|
|
138
|
+
- Test history and trends
|
|
139
|
+
|
|
140
|
+
## SDK Methods
|
|
141
|
+
|
|
142
|
+
Use in your test code:
|
|
143
|
+
|
|
144
|
+
```javascript
|
|
145
|
+
// Create test run
|
|
146
|
+
const testRun = await client.createTestRun({
|
|
147
|
+
runId: 'unique-id',
|
|
148
|
+
suiteName: 'My Tests',
|
|
149
|
+
platform: 'windows'
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// Record test result
|
|
153
|
+
await client.recordTestCase({
|
|
154
|
+
runId: 'unique-id',
|
|
155
|
+
testName: 'my test',
|
|
156
|
+
status: 'passed',
|
|
157
|
+
replayUrl: 'https://app.dashcam.io/replay/abc'
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// Complete run
|
|
161
|
+
await client.completeTestRun({
|
|
162
|
+
runId: 'unique-id',
|
|
163
|
+
status: 'passed'
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Troubleshooting
|
|
168
|
+
|
|
169
|
+
**Reporter not recording?**
|
|
170
|
+
- Check `TD_API_KEY` is set
|
|
171
|
+
- Verify network connectivity to TestDriver API
|
|
172
|
+
- Look for reporter logs in test output
|
|
173
|
+
|
|
174
|
+
**No dashcam link?**
|
|
175
|
+
- Ensure dashcam publishes and outputs replay URL
|
|
176
|
+
- Check test logs for replay URL output
|
|
177
|
+
- Manually set `DASHCAM_REPLAY_URL` if needed
|
|
178
|
+
|
|
179
|
+
**CI metadata missing?**
|
|
180
|
+
- CI environment variables must be available
|
|
181
|
+
- Supported: GitHub Actions, GitLab CI, CircleCI, Travis, Jenkins
|
|
182
|
+
|
|
183
|
+
## Files Created
|
|
184
|
+
|
|
185
|
+
**API (Backend)**
|
|
186
|
+
- `api/models/TdTestRun.js` - Test run model
|
|
187
|
+
- `api/models/TdTestCase.js` - Test case model
|
|
188
|
+
- `api/models/TdSandbox.js` - Sandbox tracking model
|
|
189
|
+
- `api/controllers/testdriver/testdriver-test-run-create.js` - Create test run endpoint
|
|
190
|
+
- `api/controllers/testdriver/testdriver-test-run-complete.js` - Complete test run endpoint
|
|
191
|
+
- `api/controllers/testdriver/testdriver-test-case-create.js` - Record test case endpoint
|
|
192
|
+
|
|
193
|
+
**CLI/SDK**
|
|
194
|
+
- `cli/interfaces/vitest-plugin.mjs` - Vitest plugin for test recording
|
|
195
|
+
- `cli/sdk.js` - Added createTestRun(), recordTestCase(), completeTestRun() methods
|
|
196
|
+
|
|
197
|
+
**Documentation**
|
|
198
|
+
- `cli/docs/TEST_RECORDING.md` - Complete guide
|
|
199
|
+
- `cli/docs/ARCHITECTURE.md` - Technical architecture
|
|
200
|
+
- `cli/vitest.config.example.js` - Example config
|
|
201
|
+
- `cli/examples/test-recording-example.test.js` - Example test
|
|
202
|
+
- `cli/examples/run-tests-with-recording.sh` - Example script
|
|
203
|
+
|
|
204
|
+
## Next Steps
|
|
205
|
+
|
|
206
|
+
1. **Try it out**: Run `npx vitest run` and check the dashboard
|
|
207
|
+
2. **Add dashcam**: Record your tests with screen capture
|
|
208
|
+
3. **Set up CI/CD**: Add to your pipeline for continuous tracking
|
|
209
|
+
4. **Build dashboard UI**: Create Vue components to visualize test runs (next phase)
|
|
210
|
+
|
|
211
|
+
## Support
|
|
212
|
+
|
|
213
|
+
- Documentation: https://docs.testdriver.ai
|
|
214
|
+
- Dashboard: https://app.testdriver.ai
|
|
215
|
+
- API Reference: /cli/docs/TEST_RECORDING.md
|