testdriverai 7.1.0 → 7.1.2

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.
Files changed (325) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/agent/index.js +18 -45
  4. package/agent/interface.js +13 -2
  5. package/agent/lib/commands.js +1 -1
  6. package/agent/lib/redraw.js +1 -1
  7. package/agent/lib/sandbox.js +30 -2
  8. package/agent/lib/valid-version.js +2 -2
  9. package/debugger/index.html +1 -1
  10. package/docs/docs.json +140 -131
  11. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  12. package/docs/v7/_drafts/agents.mdx +852 -0
  13. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  14. package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
  15. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  16. package/docs/v7/_drafts/error-handling.mdx +501 -0
  17. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  18. package/docs/v7/_drafts/init-command.mdx +95 -0
  19. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  20. package/docs/v7/_drafts/plugin-migration.mdx +222 -0
  21. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  22. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  23. package/docs/v7/_drafts/sdk-logging.mdx +222 -0
  24. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  25. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  26. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  27. package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
  28. package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
  29. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  30. package/docs/v7/api/client.mdx +1 -1
  31. package/docs/v7/api/dashcam.mdx +2 -2
  32. package/docs/v7/api/elements.mdx +143 -41
  33. package/docs/v7/api/find.mdx +258 -0
  34. package/docs/v7/api/type.mdx +51 -7
  35. package/docs/v7/features/ai-native.mdx +427 -0
  36. package/docs/v7/features/easy-to-write.mdx +351 -0
  37. package/docs/v7/features/enterprise.mdx +540 -0
  38. package/docs/v7/features/fast.mdx +424 -0
  39. package/docs/v7/features/observable.mdx +623 -0
  40. package/docs/v7/features/powerful.mdx +531 -0
  41. package/docs/v7/features/scalable.mdx +417 -0
  42. package/docs/v7/features/stable.mdx +514 -0
  43. package/docs/v7/getting-started/configuration.mdx +1 -1
  44. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  45. package/docs/v7/getting-started/installation.mdx +486 -0
  46. package/docs/v7/getting-started/quickstart.mdx +51 -5
  47. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  48. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  49. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  50. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  51. package/docs/v7/playwright.mdx +3 -3
  52. package/docs/v7/presets/chrome.mdx +16 -0
  53. package/docs/v7/presets/electron.mdx +18 -0
  54. package/docs/v7/presets/vscode.mdx +19 -0
  55. package/examples/run-tests-with-recording.sh +70 -0
  56. package/examples/screenshot-example.js +63 -0
  57. package/examples/sdk-awesome-logs-demo.js +177 -0
  58. package/examples/sdk-cache-thresholds.js +96 -0
  59. package/examples/sdk-element-properties.js +155 -0
  60. package/examples/sdk-simple-example.js +65 -0
  61. package/examples/test-recording-example.test.js +166 -0
  62. package/interfaces/cli/commands/init.js +358 -0
  63. package/interfaces/vitest-plugin.mjs +214 -10
  64. package/{src → lib}/core/Dashcam.js +41 -4
  65. package/{src → lib}/vitest/hooks.mjs +118 -100
  66. package/lib/vitest/setup.mjs +44 -0
  67. package/package.json +9 -10
  68. package/sdk.d.ts +15 -2
  69. package/sdk.js +72 -17
  70. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  71. package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
  72. package/test/manual/test-find-api.js +73 -0
  73. package/test/manual/test-init.sh +54 -0
  74. package/test/manual/test-prompt-cache.js +96 -0
  75. package/test/manual/test-provision-auth.mjs +22 -0
  76. package/test/manual/test-sandbox-render.js +28 -0
  77. package/test/manual/test-sdk-methods.js +15 -0
  78. package/test/manual/test-sdk-refactor.js +53 -0
  79. package/test/manual/test-stack-trace.mjs +57 -0
  80. package/test/testdriver/assert.test.mjs +41 -0
  81. package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
  82. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
  83. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
  84. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
  85. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
  86. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
  87. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
  88. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
  89. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
  90. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
  91. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
  92. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
  93. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
  94. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
  95. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
  96. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
  97. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
  98. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
  99. package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
  100. package/test/testdriver/setup/testHelpers.mjs +653 -0
  101. package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
  102. package/vitest.config.mjs +8 -59
  103. package/.github/dependabot.yml +0 -11
  104. package/.github/workflows/acceptance-linux.yml +0 -75
  105. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  106. package/.github/workflows/acceptance-tests.yml +0 -130
  107. package/.github/workflows/lint.yml +0 -27
  108. package/.github/workflows/publish-canary.yml +0 -40
  109. package/.github/workflows/publish-latest.yml +0 -61
  110. package/.github/workflows/test-install.yml +0 -29
  111. package/.vscode/extensions.json +0 -3
  112. package/.vscode/launch.json +0 -22
  113. package/.vscode/settings.json +0 -14
  114. package/AGENTS.md +0 -550
  115. package/CODEOWNERS +0 -2
  116. package/_testdriver/acceptance/assert.yaml +0 -7
  117. package/_testdriver/acceptance/dashcam.yaml +0 -9
  118. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  119. package/_testdriver/acceptance/embed.yaml +0 -9
  120. package/_testdriver/acceptance/exec-js.yaml +0 -29
  121. package/_testdriver/acceptance/exec-output.yaml +0 -43
  122. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  123. package/_testdriver/acceptance/focus-window.yaml +0 -16
  124. package/_testdriver/acceptance/hover-image.yaml +0 -18
  125. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  126. package/_testdriver/acceptance/hover-text.yaml +0 -14
  127. package/_testdriver/acceptance/if-else.yaml +0 -31
  128. package/_testdriver/acceptance/match-image.yaml +0 -15
  129. package/_testdriver/acceptance/press-keys.yaml +0 -35
  130. package/_testdriver/acceptance/prompt.yaml +0 -11
  131. package/_testdriver/acceptance/remember.yaml +0 -27
  132. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  133. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  134. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  135. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  136. package/_testdriver/acceptance/scroll.yaml +0 -33
  137. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  138. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  139. package/_testdriver/acceptance/type.yaml +0 -29
  140. package/_testdriver/behavior/failure.yaml +0 -7
  141. package/_testdriver/behavior/hover-text.yaml +0 -13
  142. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  143. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  144. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  145. package/_testdriver/behavior/secrets.yaml +0 -7
  146. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  147. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  148. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  149. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  150. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  151. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  152. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  153. package/_testdriver/edge-cases/success-test.yaml +0 -9
  154. package/_testdriver/examples/android/example.yaml +0 -12
  155. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  156. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  157. package/_testdriver/examples/android/readme.md +0 -7
  158. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  159. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  160. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  161. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  162. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  163. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  164. package/_testdriver/lifecycle/postrun.yaml +0 -8
  165. package/_testdriver/lifecycle/prerun.yaml +0 -15
  166. package/_testdriver/lifecycle/provision.yaml +0 -25
  167. package/docs/v7/guides/ci-cd/azure.mdx +0 -587
  168. package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
  169. package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
  170. package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
  171. package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
  172. package/docs/v7/guides/ci-cd/travis.mdx +0 -438
  173. package/scripts/view-test-results.mjs +0 -96
  174. package/src/vitest/extended.mjs +0 -108
  175. package/src/vitest/index.mjs +0 -64
  176. package/src/vitest/utils.mjs +0 -150
  177. package/styles/.vale-config/2-MDX.ini +0 -5
  178. package/styles/Microsoft/AMPM.yml +0 -9
  179. package/styles/Microsoft/Accessibility.yml +0 -30
  180. package/styles/Microsoft/Acronyms.yml +0 -64
  181. package/styles/Microsoft/Adverbs.yml +0 -272
  182. package/styles/Microsoft/Auto.yml +0 -11
  183. package/styles/Microsoft/Avoid.yml +0 -14
  184. package/styles/Microsoft/Contractions.yml +0 -50
  185. package/styles/Microsoft/Dashes.yml +0 -13
  186. package/styles/Microsoft/DateFormat.yml +0 -8
  187. package/styles/Microsoft/DateNumbers.yml +0 -40
  188. package/styles/Microsoft/DateOrder.yml +0 -8
  189. package/styles/Microsoft/Ellipses.yml +0 -9
  190. package/styles/Microsoft/FirstPerson.yml +0 -16
  191. package/styles/Microsoft/Foreign.yml +0 -13
  192. package/styles/Microsoft/Gender.yml +0 -8
  193. package/styles/Microsoft/GenderBias.yml +0 -42
  194. package/styles/Microsoft/GeneralURL.yml +0 -11
  195. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  196. package/styles/Microsoft/HeadingColons.yml +0 -8
  197. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  198. package/styles/Microsoft/Headings.yml +0 -28
  199. package/styles/Microsoft/Hyphens.yml +0 -14
  200. package/styles/Microsoft/Negative.yml +0 -13
  201. package/styles/Microsoft/Ordinal.yml +0 -13
  202. package/styles/Microsoft/OxfordComma.yml +0 -8
  203. package/styles/Microsoft/Passive.yml +0 -183
  204. package/styles/Microsoft/Percentages.yml +0 -7
  205. package/styles/Microsoft/Plurals.yml +0 -7
  206. package/styles/Microsoft/Quotes.yml +0 -7
  207. package/styles/Microsoft/RangeTime.yml +0 -13
  208. package/styles/Microsoft/Semicolon.yml +0 -8
  209. package/styles/Microsoft/SentenceLength.yml +0 -6
  210. package/styles/Microsoft/Spacing.yml +0 -8
  211. package/styles/Microsoft/Suspended.yml +0 -7
  212. package/styles/Microsoft/Terms.yml +0 -42
  213. package/styles/Microsoft/URLFormat.yml +0 -9
  214. package/styles/Microsoft/Units.yml +0 -16
  215. package/styles/Microsoft/Vocab.yml +0 -25
  216. package/styles/Microsoft/We.yml +0 -11
  217. package/styles/Microsoft/Wordiness.yml +0 -127
  218. package/styles/Microsoft/meta.json +0 -4
  219. package/styles/alex/Ablist.yml +0 -274
  220. package/styles/alex/Condescending.yml +0 -16
  221. package/styles/alex/Gendered.yml +0 -110
  222. package/styles/alex/LGBTQ.yml +0 -55
  223. package/styles/alex/OCD.yml +0 -10
  224. package/styles/alex/Press.yml +0 -12
  225. package/styles/alex/ProfanityLikely.yml +0 -1289
  226. package/styles/alex/ProfanityMaybe.yml +0 -282
  227. package/styles/alex/ProfanityUnlikely.yml +0 -251
  228. package/styles/alex/README.md +0 -27
  229. package/styles/alex/Race.yml +0 -85
  230. package/styles/alex/Suicide.yml +0 -26
  231. package/styles/alex/meta.json +0 -4
  232. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  233. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  234. package/styles/proselint/Airlinese.yml +0 -8
  235. package/styles/proselint/AnimalLabels.yml +0 -48
  236. package/styles/proselint/Annotations.yml +0 -9
  237. package/styles/proselint/Apologizing.yml +0 -8
  238. package/styles/proselint/Archaisms.yml +0 -52
  239. package/styles/proselint/But.yml +0 -8
  240. package/styles/proselint/Cliches.yml +0 -782
  241. package/styles/proselint/CorporateSpeak.yml +0 -30
  242. package/styles/proselint/Currency.yml +0 -5
  243. package/styles/proselint/Cursing.yml +0 -15
  244. package/styles/proselint/DateCase.yml +0 -7
  245. package/styles/proselint/DateMidnight.yml +0 -7
  246. package/styles/proselint/DateRedundancy.yml +0 -10
  247. package/styles/proselint/DateSpacing.yml +0 -7
  248. package/styles/proselint/DenizenLabels.yml +0 -52
  249. package/styles/proselint/Diacritical.yml +0 -95
  250. package/styles/proselint/GenderBias.yml +0 -45
  251. package/styles/proselint/GroupTerms.yml +0 -39
  252. package/styles/proselint/Hedging.yml +0 -8
  253. package/styles/proselint/Hyperbole.yml +0 -6
  254. package/styles/proselint/Jargon.yml +0 -11
  255. package/styles/proselint/LGBTOffensive.yml +0 -13
  256. package/styles/proselint/LGBTTerms.yml +0 -15
  257. package/styles/proselint/Malapropisms.yml +0 -8
  258. package/styles/proselint/Needless.yml +0 -358
  259. package/styles/proselint/Nonwords.yml +0 -38
  260. package/styles/proselint/Oxymorons.yml +0 -22
  261. package/styles/proselint/P-Value.yml +0 -6
  262. package/styles/proselint/RASSyndrome.yml +0 -30
  263. package/styles/proselint/README.md +0 -12
  264. package/styles/proselint/Skunked.yml +0 -13
  265. package/styles/proselint/Spelling.yml +0 -17
  266. package/styles/proselint/Typography.yml +0 -11
  267. package/styles/proselint/Uncomparables.yml +0 -50
  268. package/styles/proselint/Very.yml +0 -6
  269. package/styles/proselint/meta.json +0 -15
  270. package/styles/write-good/Cliches.yml +0 -702
  271. package/styles/write-good/E-Prime.yml +0 -32
  272. package/styles/write-good/Illusions.yml +0 -11
  273. package/styles/write-good/Passive.yml +0 -183
  274. package/styles/write-good/README.md +0 -27
  275. package/styles/write-good/So.yml +0 -5
  276. package/styles/write-good/ThereIs.yml +0 -6
  277. package/styles/write-good/TooWordy.yml +0 -221
  278. package/styles/write-good/Weasel.yml +0 -29
  279. package/styles/write-good/meta.json +0 -4
  280. package/test/dashcam.test.js +0 -137
  281. package/test/mcp-example-test.yaml +0 -27
  282. package/test/test_parser.js +0 -47
  283. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  284. package/testdriver/acceptance-sdk/README.md +0 -128
  285. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  286. package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
  287. package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
  288. package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
  289. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
  290. package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
  291. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  292. package/vale.ini +0 -18
  293. package/vitest.config.example.js +0 -19
  294. package/vitest.config.mjs.bak +0 -44
  295. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  296. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  297. /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
  298. /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
  299. /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
  300. /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
  301. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  302. /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
  303. /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
  304. /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
  305. /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
  306. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  307. /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
  308. /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
  309. /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
  310. /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
  311. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  312. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  313. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  314. /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
  315. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  316. /package/{src → lib}/core/index.d.ts +0 -0
  317. /package/{src → lib}/core/index.js +0 -0
  318. /package/{src → lib}/presets/index.mjs +0 -0
  319. /package/{src → lib}/vitest/hooks.d.ts +0 -0
  320. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/chrome-extension.test.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  325. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -1,587 +0,0 @@
1
- ---
2
- title: "Azure Pipelines"
3
- description: "Run TestDriver tests in Azure Pipelines"
4
- icon: "microsoft"
5
- ---
6
-
7
- ## Basic Setup
8
-
9
- Create `azure-pipelines.yml`:
10
-
11
- ```yaml
12
- trigger:
13
- - main
14
- - develop
15
-
16
- pool:
17
- vmImage: 'ubuntu-latest'
18
-
19
- steps:
20
- - task: NodeTool@0
21
- inputs:
22
- versionSpec: '18.x'
23
- displayName: 'Install Node.js'
24
-
25
- - script: npm ci
26
- displayName: 'Install dependencies'
27
-
28
- - script: npx vitest
29
- displayName: 'Run tests'
30
- env:
31
- TD_API_KEY: $(TD_API_KEY)
32
-
33
- - task: PublishTestResults@2
34
- condition: always()
35
- inputs:
36
- testResultsFiles: 'test-results/junit.xml'
37
- testRunTitle: 'TestDriver Tests'
38
-
39
- - task: PublishBuildArtifacts@1
40
- condition: always()
41
- inputs:
42
- pathToPublish: 'test-results'
43
- artifactName: 'test-results'
44
- ```
45
-
46
- ## Add API Key
47
-
48
- ### Using Variable Groups
49
-
50
- 1. Go to **Pipelines** → **Library**
51
- 2. Click **+ Variable group**
52
- 3. Name: `testdriver-vars`
53
- 4. Click **+ Add**
54
- 5. Name: `TD_API_KEY`
55
- 6. Value: Your API key from [dashboard.testdriver.ai](https://dashboard.testdriver.ai)
56
- 7. Click the lock icon to make it secret
57
- 8. Click **Save**
58
-
59
- Reference in pipeline:
60
-
61
- ```yaml
62
- variables:
63
- - group: testdriver-vars
64
-
65
- steps:
66
- - script: npx vitest
67
- env:
68
- TD_API_KEY: $(TD_API_KEY)
69
- ```
70
-
71
- ### Using Pipeline Variables
72
-
73
- Or set directly in pipeline:
74
-
75
- 1. Edit pipeline in Azure DevOps
76
- 2. Click **Variables** button
77
- 3. Click **New variable**
78
- 4. Name: `TD_API_KEY`
79
- 5. Value: Your API key
80
- 6. Check **Keep this value secret**
81
- 7. Click **OK** and **Save**
82
-
83
- ## Parallel Jobs
84
-
85
- Run tests in parallel:
86
-
87
- ```yaml
88
- trigger:
89
- - main
90
-
91
- strategy:
92
- matrix:
93
- shard1:
94
- shardIndex: 1
95
- shard2:
96
- shardIndex: 2
97
- shard3:
98
- shardIndex: 3
99
- shard4:
100
- shardIndex: 4
101
- maxParallel: 4
102
-
103
- pool:
104
- vmImage: 'ubuntu-latest'
105
-
106
- variables:
107
- - group: testdriver-vars
108
-
109
- steps:
110
- - task: NodeTool@0
111
- inputs:
112
- versionSpec: '18.x'
113
-
114
- - script: npm ci
115
- displayName: 'Install dependencies'
116
-
117
- - script: npx vitest --shard=$(shardIndex)/4
118
- displayName: 'Run tests (shard $(shardIndex)/4)'
119
- env:
120
- TD_API_KEY: $(TD_API_KEY)
121
-
122
- - task: PublishTestResults@2
123
- condition: always()
124
- inputs:
125
- testResultsFiles: 'test-results/junit.xml'
126
- ```
127
-
128
- ## Save Dashcam URLs
129
-
130
- Extract replay URLs from test output:
131
-
132
- ```yaml
133
- steps:
134
- - script: |
135
- npx vitest 2>&1 | tee test-output.log
136
- grep -o 'https://dashcam.testdriver.ai/[a-zA-Z0-9-]*' test-output.log > dashcam-urls.txt || true
137
- displayName: 'Run tests and extract Dashcam URLs'
138
- env:
139
- TD_API_KEY: $(TD_API_KEY)
140
-
141
- - task: PublishBuildArtifacts@1
142
- condition: always()
143
- inputs:
144
- pathToPublish: 'test-output.log'
145
- artifactName: 'logs'
146
-
147
- - task: PublishBuildArtifacts@1
148
- condition: always()
149
- inputs:
150
- pathToPublish: 'dashcam-urls.txt'
151
- artifactName: 'dashcam-urls'
152
- ```
153
-
154
- ## Scheduled Builds
155
-
156
- Run tests on schedule:
157
-
158
- ```yaml
159
- trigger: none # Disable CI triggers
160
-
161
- schedules:
162
- - cron: "0 2 * * *" # 2 AM daily
163
- displayName: Nightly tests
164
- branches:
165
- include:
166
- - main
167
- always: true # Run even if no code changes
168
-
169
- pool:
170
- vmImage: 'ubuntu-latest'
171
-
172
- variables:
173
- - group: testdriver-vars
174
-
175
- steps:
176
- - task: NodeTool@0
177
- inputs:
178
- versionSpec: '18.x'
179
-
180
- - script: npm ci
181
- displayName: 'Install dependencies'
182
-
183
- - script: npx vitest
184
- displayName: 'Run tests'
185
- env:
186
- TD_API_KEY: $(TD_API_KEY)
187
- ```
188
-
189
- ## Multiple Node Versions
190
-
191
- Test across Node.js versions:
192
-
193
- ```yaml
194
- trigger:
195
- - main
196
-
197
- strategy:
198
- matrix:
199
- node16:
200
- nodeVersion: '16.x'
201
- node18:
202
- nodeVersion: '18.x'
203
- node20:
204
- nodeVersion: '20.x'
205
-
206
- pool:
207
- vmImage: 'ubuntu-latest'
208
-
209
- variables:
210
- - group: testdriver-vars
211
-
212
- steps:
213
- - task: NodeTool@0
214
- inputs:
215
- versionSpec: $(nodeVersion)
216
- displayName: 'Install Node.js $(nodeVersion)'
217
-
218
- - script: npm ci
219
- displayName: 'Install dependencies'
220
-
221
- - script: npx vitest
222
- displayName: 'Run tests'
223
- env:
224
- TD_API_KEY: $(TD_API_KEY)
225
- ```
226
-
227
- ## Conditional Execution
228
-
229
- Skip tests on documentation changes:
230
-
231
- ```yaml
232
- trigger:
233
- branches:
234
- include:
235
- - main
236
- - develop
237
- paths:
238
- exclude:
239
- - '*.md'
240
- - 'docs/**'
241
-
242
- steps:
243
- - script: npx vitest
244
- env:
245
- TD_API_KEY: $(TD_API_KEY)
246
- ```
247
-
248
- Or use conditions:
249
-
250
- ```yaml
251
- steps:
252
- - script: |
253
- if git diff --name-only HEAD~1 | grep -qE '^(src|test)/'; then
254
- echo "##vso[task.setvariable variable=RUN_TESTS]true"
255
- else
256
- echo "Only docs changed"
257
- echo "##vso[task.setvariable variable=RUN_TESTS]false"
258
- fi
259
- displayName: 'Check for code changes'
260
-
261
- - script: npx vitest
262
- condition: eq(variables.RUN_TESTS, 'true')
263
- displayName: 'Run tests'
264
- ```
265
-
266
- ## Cache Dependencies
267
-
268
- Speed up builds with caching:
269
-
270
- ```yaml
271
- steps:
272
- - task: Cache@2
273
- inputs:
274
- key: 'npm | "$(Agent.OS)" | package-lock.json'
275
- path: '$(npm_config_cache)'
276
- restoreKeys: |
277
- npm | "$(Agent.OS)"
278
- displayName: 'Cache npm'
279
-
280
- - script: npm ci
281
- displayName: 'Install dependencies'
282
- ```
283
-
284
- ## Templates
285
-
286
- Reuse pipeline logic with templates:
287
-
288
- Create `templates/test-template.yml`:
289
-
290
- ```yaml
291
- parameters:
292
- - name: nodeVersion
293
- type: string
294
- default: '18.x'
295
-
296
- steps:
297
- - task: NodeTool@0
298
- inputs:
299
- versionSpec: ${{ parameters.nodeVersion }}
300
-
301
- - script: npm ci
302
- displayName: 'Install dependencies'
303
-
304
- - script: npx vitest
305
- displayName: 'Run tests'
306
- env:
307
- TD_API_KEY: $(TD_API_KEY)
308
-
309
- - task: PublishTestResults@2
310
- condition: always()
311
- inputs:
312
- testResultsFiles: 'test-results/junit.xml'
313
- ```
314
-
315
- Use in `azure-pipelines.yml`:
316
-
317
- ```yaml
318
- variables:
319
- - group: testdriver-vars
320
-
321
- jobs:
322
- - job: test_node16
323
- pool:
324
- vmImage: 'ubuntu-latest'
325
- steps:
326
- - template: templates/test-template.yml
327
- parameters:
328
- nodeVersion: '16.x'
329
-
330
- - job: test_node18
331
- pool:
332
- vmImage: 'ubuntu-latest'
333
- steps:
334
- - template: templates/test-template.yml
335
- parameters:
336
- nodeVersion: '18.x'
337
- ```
338
-
339
- ## Multi-Stage Pipeline
340
-
341
- Separate build and test stages:
342
-
343
- ```yaml
344
- trigger:
345
- - main
346
-
347
- variables:
348
- - group: testdriver-vars
349
-
350
- stages:
351
- - stage: Build
352
- jobs:
353
- - job: install
354
- pool:
355
- vmImage: 'ubuntu-latest'
356
- steps:
357
- - task: NodeTool@0
358
- inputs:
359
- versionSpec: '18.x'
360
-
361
- - script: npm ci
362
- displayName: 'Install dependencies'
363
-
364
- - task: PublishPipelineArtifact@1
365
- inputs:
366
- targetPath: 'node_modules'
367
- artifactName: 'node_modules'
368
-
369
- - stage: Test
370
- dependsOn: Build
371
- jobs:
372
- - job: test
373
- pool:
374
- vmImage: 'ubuntu-latest'
375
- steps:
376
- - task: NodeTool@0
377
- inputs:
378
- versionSpec: '18.x'
379
-
380
- - task: DownloadPipelineArtifact@2
381
- inputs:
382
- artifactName: 'node_modules'
383
- targetPath: 'node_modules'
384
-
385
- - script: npx vitest
386
- displayName: 'Run tests'
387
- env:
388
- TD_API_KEY: $(TD_API_KEY)
389
- ```
390
-
391
- ## Approval Gates
392
-
393
- Add manual approval:
394
-
395
- ```yaml
396
- stages:
397
- - stage: Test
398
- jobs:
399
- - job: test
400
- pool:
401
- vmImage: 'ubuntu-latest'
402
- steps:
403
- - script: npx vitest
404
-
405
- - stage: Deploy
406
- dependsOn: Test
407
- jobs:
408
- - deployment: deploy
409
- environment: 'production' # Requires approval in Environments
410
- strategy:
411
- runOnce:
412
- deploy:
413
- steps:
414
- - script: echo "Deploying..."
415
- ```
416
-
417
- Configure approval in **Pipelines** → **Environments** → **production** → **Approvals and checks**.
418
-
419
- ## Notifications
420
-
421
- Send notifications on failure:
422
-
423
- ```yaml
424
- steps:
425
- - script: npx vitest
426
- displayName: 'Run tests'
427
- env:
428
- TD_API_KEY: $(TD_API_KEY)
429
-
430
- - task: SendEmail@1
431
- condition: failed()
432
- inputs:
433
- to: 'team@example.com'
434
- subject: 'Pipeline Failed: $(Build.DefinitionName)'
435
- body: |
436
- Build $(Build.BuildNumber) failed.
437
-
438
- View build: $(System.TeamFoundationCollectionUri)$(System.TeamProject)/_build/results?buildId=$(Build.BuildId)
439
- ```
440
-
441
- ## Troubleshooting
442
-
443
- ### Tests timeout
444
-
445
- Increase timeout:
446
-
447
- ```yaml
448
- steps:
449
- - script: npx vitest
450
- displayName: 'Run tests'
451
- timeoutInMinutes: 30 # Default is 60
452
- ```
453
-
454
- ### API key not found
455
-
456
- Debug variables:
457
-
458
- ```yaml
459
- steps:
460
- - script: |
461
- echo "Has TD_API_KEY: ${TD_API_KEY:+yes}"
462
- node --version
463
- env:
464
- TD_API_KEY: $(TD_API_KEY)
465
- ```
466
-
467
- ### Out of parallel jobs
468
-
469
- Check your Azure DevOps plan limits. Free tier includes:
470
- - 1 parallel job for private repos
471
- - 10 parallel jobs for public repos
472
-
473
- ## Complete Example
474
-
475
- Full-featured pipeline:
476
-
477
- ```yaml
478
- trigger:
479
- branches:
480
- include:
481
- - main
482
- - develop
483
- paths:
484
- exclude:
485
- - '*.md'
486
- - 'docs/**'
487
-
488
- pr:
489
- branches:
490
- include:
491
- - main
492
- - develop
493
-
494
- schedules:
495
- - cron: "0 2 * * *"
496
- displayName: Nightly tests
497
- branches:
498
- include:
499
- - main
500
- always: true
501
-
502
- variables:
503
- - group: testdriver-vars
504
-
505
- pool:
506
- vmImage: 'ubuntu-latest'
507
-
508
- strategy:
509
- matrix:
510
- shard1:
511
- shardIndex: 1
512
- shard2:
513
- shardIndex: 2
514
- shard3:
515
- shardIndex: 3
516
- shard4:
517
- shardIndex: 4
518
- maxParallel: 4
519
-
520
- steps:
521
- - task: NodeTool@0
522
- inputs:
523
- versionSpec: '18.x'
524
- displayName: 'Install Node.js'
525
-
526
- - task: Cache@2
527
- inputs:
528
- key: 'npm | "$(Agent.OS)" | package-lock.json'
529
- path: '$(npm_config_cache)'
530
- displayName: 'Cache npm'
531
-
532
- - script: npm ci
533
- displayName: 'Install dependencies'
534
-
535
- - script: |
536
- npx vitest --shard=$(shardIndex)/4 2>&1 | tee test-output-$(shardIndex).log
537
- grep -o 'https://dashcam.testdriver.ai/[a-zA-Z0-9-]*' test-output-$(shardIndex).log > dashcam-urls-$(shardIndex).txt || true
538
- displayName: 'Run tests (shard $(shardIndex)/4)'
539
- env:
540
- TD_API_KEY: $(TD_API_KEY)
541
- timeoutInMinutes: 30
542
-
543
- - task: PublishTestResults@2
544
- condition: always()
545
- inputs:
546
- testResultsFiles: 'test-results/junit.xml'
547
- testRunTitle: 'TestDriver Tests (Shard $(shardIndex))'
548
- mergeTestResults: true
549
-
550
- - task: PublishBuildArtifacts@1
551
- condition: always()
552
- inputs:
553
- pathToPublish: 'test-results'
554
- artifactName: 'test-results-$(shardIndex)'
555
-
556
- - task: PublishBuildArtifacts@1
557
- condition: always()
558
- inputs:
559
- pathToPublish: 'test-output-$(shardIndex).log'
560
- artifactName: 'logs-$(shardIndex)'
561
-
562
- - task: PublishBuildArtifacts@1
563
- condition: always()
564
- inputs:
565
- pathToPublish: 'dashcam-urls-$(shardIndex).txt'
566
- artifactName: 'dashcam-urls-$(shardIndex)'
567
- ```
568
-
569
- ## See Also
570
-
571
- <CardGroup cols={2}>
572
- <Card title="CI/CD Overview" icon="arrows-spin" href="/v7/guides/ci-cd/overview">
573
- CI/CD concepts
574
- </Card>
575
-
576
- <Card title="Performance" icon="gauge" href="/v7/guides/performance">
577
- Optimize tests
578
- </Card>
579
-
580
- <Card title="Troubleshooting" icon="circle-question" href="/v7/guides/troubleshooting">
581
- Common issues
582
- </Card>
583
-
584
- <Card title="Azure Pipelines Docs" icon="book" href="https://docs.microsoft.com/en-us/azure/devops/pipelines/">
585
- Official docs
586
- </Card>
587
- </CardGroup>