qa-skills 3.0.0 → 3.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.
Files changed (262) hide show
  1. package/README.md +20 -149
  2. package/bin/cli.js +1 -40
  3. package/package.json +23 -26
  4. package/dist/agents/registry.d.ts +0 -5
  5. package/dist/agents/registry.d.ts.map +0 -1
  6. package/dist/agents/registry.js +0 -101
  7. package/dist/agents/registry.js.map +0 -1
  8. package/dist/agents/types.d.ts +0 -9
  9. package/dist/agents/types.d.ts.map +0 -1
  10. package/dist/agents/types.js +0 -2
  11. package/dist/agents/types.js.map +0 -1
  12. package/dist/dependencies.d.ts +0 -21
  13. package/dist/dependencies.d.ts.map +0 -1
  14. package/dist/dependencies.js +0 -125
  15. package/dist/dependencies.js.map +0 -1
  16. package/dist/installer.d.ts +0 -25
  17. package/dist/installer.d.ts.map +0 -1
  18. package/dist/installer.js +0 -437
  19. package/dist/installer.js.map +0 -1
  20. package/dist/scaffold.d.ts +0 -27
  21. package/dist/scaffold.d.ts.map +0 -1
  22. package/dist/scaffold.js +0 -182
  23. package/dist/scaffold.js.map +0 -1
  24. package/skills/qa-accessibility-test-writer/SKILL.md +0 -127
  25. package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +0 -349
  26. package/skills/qa-accessibility-test-writer/references/best-practices.md +0 -184
  27. package/skills/qa-accessibility-test-writer/references/wcag-tests.md +0 -331
  28. package/skills/qa-api-contract-curator/SKILL.md +0 -104
  29. package/skills/qa-api-contract-curator/references/breaking-changes.md +0 -363
  30. package/skills/qa-api-contract-curator/references/openapi-structure.md +0 -404
  31. package/skills/qa-browser-data-collector/SKILL.md +0 -132
  32. package/skills/qa-browser-data-collector/references/data-collection-checklist.md +0 -91
  33. package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +0 -113
  34. package/skills/qa-bug-ticket-creator/SKILL.md +0 -148
  35. package/skills/qa-bug-ticket-creator/references/bug-report-format.md +0 -149
  36. package/skills/qa-bug-ticket-creator/references/severity-guide.md +0 -81
  37. package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +0 -39
  38. package/skills/qa-changelog-analyzer/SKILL.md +0 -134
  39. package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +0 -138
  40. package/skills/qa-changelog-analyzer/references/impact-mapping.md +0 -120
  41. package/skills/qa-clickup-integration/SKILL.md +0 -166
  42. package/skills/qa-clickup-integration/references/api-patterns.md +0 -102
  43. package/skills/qa-clickup-integration/references/field-mapping.md +0 -71
  44. package/skills/qa-codeceptjs-writer/SKILL.md +0 -136
  45. package/skills/qa-codeceptjs-writer/references/best-practices.md +0 -207
  46. package/skills/qa-codeceptjs-writer/references/config.md +0 -255
  47. package/skills/qa-codeceptjs-writer/references/patterns.md +0 -285
  48. package/skills/qa-coverage-analyzer/SKILL.md +0 -166
  49. package/skills/qa-coverage-analyzer/references/best-practices.md +0 -142
  50. package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +0 -155
  51. package/skills/qa-coverage-analyzer/references/tools.md +0 -204
  52. package/skills/qa-cypress-writer/SKILL.md +0 -134
  53. package/skills/qa-cypress-writer/references/assertions.md +0 -121
  54. package/skills/qa-cypress-writer/references/best-practices.md +0 -82
  55. package/skills/qa-cypress-writer/references/config.md +0 -121
  56. package/skills/qa-cypress-writer/references/patterns.md +0 -170
  57. package/skills/qa-data-factory/SKILL.md +0 -126
  58. package/skills/qa-data-factory/references/factory-patterns.md +0 -164
  59. package/skills/qa-data-factory/references/faker-guide.md +0 -131
  60. package/skills/qa-diagram-generator/SKILL.md +0 -125
  61. package/skills/qa-diagram-generator/references/c4-model.md +0 -53
  62. package/skills/qa-diagram-generator/references/charts.md +0 -58
  63. package/skills/qa-diagram-generator/references/class-diagram.md +0 -85
  64. package/skills/qa-diagram-generator/references/er-diagram.md +0 -69
  65. package/skills/qa-diagram-generator/references/flowchart.md +0 -92
  66. package/skills/qa-diagram-generator/references/from-screenshot.md +0 -45
  67. package/skills/qa-diagram-generator/references/gantt.md +0 -49
  68. package/skills/qa-diagram-generator/references/journey.md +0 -50
  69. package/skills/qa-diagram-generator/references/mindmap.md +0 -75
  70. package/skills/qa-diagram-generator/references/sequence.md +0 -69
  71. package/skills/qa-diagram-generator/references/state-diagram.md +0 -56
  72. package/skills/qa-discovery-interview/SKILL.md +0 -182
  73. package/skills/qa-discovery-interview/references/completeness-checklist.md +0 -53
  74. package/skills/qa-discovery-interview/references/conflict-patterns.md +0 -101
  75. package/skills/qa-discovery-interview/references/qa-categories.md +0 -147
  76. package/skills/qa-discovery-interview/templates/qa-brief-template.md +0 -168
  77. package/skills/qa-environment-checker/SKILL.md +0 -142
  78. package/skills/qa-environment-checker/references/dependency-matrix.md +0 -101
  79. package/skills/qa-environment-checker/references/health-checks.md +0 -209
  80. package/skills/qa-environment-checker/templates/env-readiness-template.md +0 -64
  81. package/skills/qa-flaky-detector/SKILL.md +0 -153
  82. package/skills/qa-flaky-detector/references/ci-analysis.md +0 -140
  83. package/skills/qa-flaky-detector/references/flaky-patterns.md +0 -247
  84. package/skills/qa-github-issues-enhanced/SKILL.md +0 -175
  85. package/skills/qa-github-issues-enhanced/references/issue-templates.md +0 -425
  86. package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +0 -130
  87. package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +0 -188
  88. package/skills/qa-httpx-writer/SKILL.md +0 -138
  89. package/skills/qa-httpx-writer/references/assertions.md +0 -195
  90. package/skills/qa-httpx-writer/references/best-practices.md +0 -140
  91. package/skills/qa-httpx-writer/references/config.md +0 -212
  92. package/skills/qa-httpx-writer/references/patterns.md +0 -262
  93. package/skills/qa-jest-writer/SKILL.md +0 -131
  94. package/skills/qa-jest-writer/references/assertions.md +0 -125
  95. package/skills/qa-jest-writer/references/best-practices.md +0 -136
  96. package/skills/qa-jest-writer/references/config.md +0 -134
  97. package/skills/qa-jest-writer/references/patterns.md +0 -172
  98. package/skills/qa-jira-integration/SKILL.md +0 -135
  99. package/skills/qa-jira-integration/references/api-patterns.md +0 -143
  100. package/skills/qa-jira-integration/references/field-mapping.md +0 -79
  101. package/skills/qa-jira-integration/references/xray-integration.md +0 -85
  102. package/skills/qa-jmeter-writer/SKILL.md +0 -171
  103. package/skills/qa-jmeter-writer/references/best-practices.md +0 -157
  104. package/skills/qa-jmeter-writer/references/config.md +0 -204
  105. package/skills/qa-jmeter-writer/references/patterns.md +0 -242
  106. package/skills/qa-junit5-writer/SKILL.md +0 -157
  107. package/skills/qa-junit5-writer/references/assertions.md +0 -118
  108. package/skills/qa-junit5-writer/references/config.md +0 -97
  109. package/skills/qa-junit5-writer/references/patterns.md +0 -162
  110. package/skills/qa-k6-writer/SKILL.md +0 -155
  111. package/skills/qa-k6-writer/references/best-practices.md +0 -236
  112. package/skills/qa-k6-writer/references/config.md +0 -219
  113. package/skills/qa-k6-writer/references/patterns.md +0 -304
  114. package/skills/qa-linear-integration/SKILL.md +0 -137
  115. package/skills/qa-linear-integration/references/api-patterns.md +0 -249
  116. package/skills/qa-linear-integration/references/field-mapping.md +0 -121
  117. package/skills/qa-locust-writer/SKILL.md +0 -151
  118. package/skills/qa-locust-writer/references/best-practices.md +0 -126
  119. package/skills/qa-locust-writer/references/config.md +0 -170
  120. package/skills/qa-locust-writer/references/patterns.md +0 -235
  121. package/skills/qa-manual-test-designer/SKILL.md +0 -145
  122. package/skills/qa-manual-test-designer/references/exploratory-charters.md +0 -138
  123. package/skills/qa-manual-test-designer/references/personas.md +0 -146
  124. package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +0 -47
  125. package/skills/qa-manual-test-designer/templates/test-case-template.md +0 -31
  126. package/skills/qa-mobile-test-writer/SKILL.md +0 -144
  127. package/skills/qa-mobile-test-writer/references/best-practices.md +0 -214
  128. package/skills/qa-mobile-test-writer/references/config.md +0 -309
  129. package/skills/qa-mobile-test-writer/references/patterns.md +0 -304
  130. package/skills/qa-nfr-analyst/SKILL.md +0 -177
  131. package/skills/qa-nfr-analyst/references/iso-25010-model.md +0 -159
  132. package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +0 -202
  133. package/skills/qa-nfr-analyst/references/wcag-checklist.md +0 -184
  134. package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +0 -89
  135. package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +0 -48
  136. package/skills/qa-orchestrator/SKILL.md +0 -132
  137. package/skills/qa-orchestrator/references/handoff-chains.md +0 -105
  138. package/skills/qa-orchestrator/references/pipeline-modes.md +0 -115
  139. package/skills/qa-orchestrator/references/scheduler-rules.md +0 -84
  140. package/skills/qa-pact-writer/SKILL.md +0 -133
  141. package/skills/qa-pact-writer/references/best-practices.md +0 -100
  142. package/skills/qa-pact-writer/references/config.md +0 -135
  143. package/skills/qa-pact-writer/references/patterns.md +0 -161
  144. package/skills/qa-plan-creator/SKILL.md +0 -139
  145. package/skills/qa-plan-creator/references/introduction-plan.md +0 -43
  146. package/skills/qa-plan-creator/references/migration-plan.md +0 -44
  147. package/skills/qa-plan-creator/references/onboarding-plan.md +0 -46
  148. package/skills/qa-plan-creator/references/performance-plan.md +0 -44
  149. package/skills/qa-plan-creator/references/regression-plan.md +0 -45
  150. package/skills/qa-plan-creator/references/release-plan.md +0 -45
  151. package/skills/qa-plan-creator/references/sprint-plan.md +0 -44
  152. package/skills/qa-plan-creator/references/test-plan.md +0 -59
  153. package/skills/qa-plan-creator/references/uat-plan.md +0 -43
  154. package/skills/qa-plan-creator/templates/checklist-template.md +0 -36
  155. package/skills/qa-plan-creator/templates/regression-checklist-template.md +0 -49
  156. package/skills/qa-plan-creator/templates/release-checklist-template.md +0 -46
  157. package/skills/qa-plan-creator/templates/test-plan-template.md +0 -74
  158. package/skills/qa-playwright-py-writer/SKILL.md +0 -156
  159. package/skills/qa-playwright-py-writer/references/best-practices.md +0 -194
  160. package/skills/qa-playwright-py-writer/references/config.md +0 -195
  161. package/skills/qa-playwright-py-writer/references/patterns.md +0 -212
  162. package/skills/qa-playwright-ts-writer/SKILL.md +0 -151
  163. package/skills/qa-playwright-ts-writer/references/assertions.md +0 -109
  164. package/skills/qa-playwright-ts-writer/references/best-practices.md +0 -191
  165. package/skills/qa-playwright-ts-writer/references/config.md +0 -144
  166. package/skills/qa-playwright-ts-writer/references/patterns.md +0 -171
  167. package/skills/qa-pytest-writer/SKILL.md +0 -145
  168. package/skills/qa-pytest-writer/references/assertions.md +0 -149
  169. package/skills/qa-pytest-writer/references/best-practices.md +0 -97
  170. package/skills/qa-pytest-writer/references/config.md +0 -176
  171. package/skills/qa-pytest-writer/references/patterns.md +0 -251
  172. package/skills/qa-qase-integration/SKILL.md +0 -149
  173. package/skills/qa-qase-integration/references/api-reference.md +0 -354
  174. package/skills/qa-qase-integration/references/ci-integration.md +0 -196
  175. package/skills/qa-qase-integration/references/field-mapping.md +0 -157
  176. package/skills/qa-requirements-generator/SKILL.md +0 -152
  177. package/skills/qa-requirements-generator/references/iso-29148-structure.md +0 -153
  178. package/skills/qa-requirements-generator/references/requirement-patterns.md +0 -278
  179. package/skills/qa-rest-assured-writer/SKILL.md +0 -137
  180. package/skills/qa-rest-assured-writer/references/best-practices.md +0 -50
  181. package/skills/qa-rest-assured-writer/references/config.md +0 -124
  182. package/skills/qa-rest-assured-writer/references/patterns.md +0 -192
  183. package/skills/qa-risk-analyzer/SKILL.md +0 -158
  184. package/skills/qa-risk-analyzer/references/impact-analysis.md +0 -133
  185. package/skills/qa-risk-analyzer/references/risk-factors.md +0 -123
  186. package/skills/qa-robot-framework-writer/SKILL.md +0 -147
  187. package/skills/qa-robot-framework-writer/references/best-practices.md +0 -249
  188. package/skills/qa-robot-framework-writer/references/config.md +0 -204
  189. package/skills/qa-robot-framework-writer/references/libraries.md +0 -273
  190. package/skills/qa-robot-framework-writer/references/patterns.md +0 -216
  191. package/skills/qa-security-test-writer/SKILL.md +0 -123
  192. package/skills/qa-security-test-writer/references/best-practices.md +0 -155
  193. package/skills/qa-security-test-writer/references/owasp-top10.md +0 -331
  194. package/skills/qa-security-test-writer/references/zap-config.md +0 -258
  195. package/skills/qa-selenium-java-writer/SKILL.md +0 -143
  196. package/skills/qa-selenium-java-writer/references/best-practices.md +0 -59
  197. package/skills/qa-selenium-java-writer/references/config.md +0 -143
  198. package/skills/qa-selenium-java-writer/references/patterns.md +0 -170
  199. package/skills/qa-selenium-py-writer/SKILL.md +0 -150
  200. package/skills/qa-selenium-py-writer/references/best-practices.md +0 -175
  201. package/skills/qa-selenium-py-writer/references/config.md +0 -224
  202. package/skills/qa-selenium-py-writer/references/patterns.md +0 -255
  203. package/skills/qa-shortcut-integration/SKILL.md +0 -143
  204. package/skills/qa-shortcut-integration/references/api-patterns.md +0 -126
  205. package/skills/qa-shortcut-integration/references/field-mapping.md +0 -66
  206. package/skills/qa-spec-auditor/SKILL.md +0 -162
  207. package/skills/qa-spec-auditor/references/audit-checklist.md +0 -144
  208. package/skills/qa-spec-auditor/references/drift-patterns.md +0 -207
  209. package/skills/qa-spec-writer/SKILL.md +0 -143
  210. package/skills/qa-spec-writer/references/gherkin-guide.md +0 -253
  211. package/skills/qa-spec-writer/references/specification-patterns.md +0 -274
  212. package/skills/qa-spring-test-writer/SKILL.md +0 -170
  213. package/skills/qa-spring-test-writer/references/best-practices.md +0 -57
  214. package/skills/qa-spring-test-writer/references/config.md +0 -179
  215. package/skills/qa-spring-test-writer/references/patterns.md +0 -235
  216. package/skills/qa-supertest-writer/SKILL.md +0 -150
  217. package/skills/qa-supertest-writer/references/assertions.md +0 -192
  218. package/skills/qa-supertest-writer/references/best-practices.md +0 -102
  219. package/skills/qa-supertest-writer/references/config.md +0 -166
  220. package/skills/qa-supertest-writer/references/patterns.md +0 -242
  221. package/skills/qa-task-creator/SKILL.md +0 -142
  222. package/skills/qa-task-creator/references/linking-patterns.md +0 -127
  223. package/skills/qa-task-creator/references/task-types.md +0 -169
  224. package/skills/qa-task-creator/templates/task-template.md +0 -24
  225. package/skills/qa-test-doc-compiler/SKILL.md +0 -114
  226. package/skills/qa-test-doc-compiler/references/agile-tailoring.md +0 -220
  227. package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +0 -302
  228. package/skills/qa-test-healer/SKILL.md +0 -101
  229. package/skills/qa-test-healer/references/diagnosis-patterns.md +0 -142
  230. package/skills/qa-test-healer/references/fix-strategies.md +0 -177
  231. package/skills/qa-test-reporter/SKILL.md +0 -130
  232. package/skills/qa-test-reporter/references/best-practices.md +0 -162
  233. package/skills/qa-test-reporter/references/iso-29119-reports.md +0 -236
  234. package/skills/qa-test-reporter/references/report-formats.md +0 -287
  235. package/skills/qa-test-reviewer/SKILL.md +0 -142
  236. package/skills/qa-test-reviewer/references/anti-patterns.md +0 -268
  237. package/skills/qa-test-reviewer/references/review-checklist.md +0 -93
  238. package/skills/qa-test-strategy/SKILL.md +0 -133
  239. package/skills/qa-test-strategy/references/entry-exit-criteria.md +0 -176
  240. package/skills/qa-test-strategy/references/risk-matrix.md +0 -102
  241. package/skills/qa-test-strategy/references/testing-types.md +0 -143
  242. package/skills/qa-testcase-from-docs/SKILL.md +0 -161
  243. package/skills/qa-testcase-from-docs/references/test-case-format.md +0 -196
  244. package/skills/qa-testcase-from-docs/references/test-design-techniques.md +0 -126
  245. package/skills/qa-testcase-from-docs/templates/test-case-template.md +0 -31
  246. package/skills/qa-testcase-from-ui/SKILL.md +0 -109
  247. package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +0 -126
  248. package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +0 -146
  249. package/skills/qa-testcase-from-ui/templates/test-case-template.md +0 -31
  250. package/skills/qa-visual-regression-writer/SKILL.md +0 -175
  251. package/skills/qa-visual-regression-writer/references/best-practices.md +0 -154
  252. package/skills/qa-visual-regression-writer/references/config.md +0 -220
  253. package/skills/qa-visual-regression-writer/references/patterns.md +0 -213
  254. package/skills/qa-vitest-writer/SKILL.md +0 -141
  255. package/skills/qa-vitest-writer/references/assertions.md +0 -105
  256. package/skills/qa-vitest-writer/references/best-practices.md +0 -62
  257. package/skills/qa-vitest-writer/references/config.md +0 -127
  258. package/skills/qa-vitest-writer/references/patterns.md +0 -141
  259. package/skills/qa-webdriverio-writer/SKILL.md +0 -145
  260. package/skills/qa-webdriverio-writer/references/best-practices.md +0 -176
  261. package/skills/qa-webdriverio-writer/references/config.md +0 -240
  262. package/skills/qa-webdriverio-writer/references/patterns.md +0 -269
@@ -1,309 +0,0 @@
1
- # Mobile Test Configuration
2
-
3
- ## Appium Setup
4
-
5
- ### Installation
6
-
7
- ```bash
8
- npm install -g appium
9
- appium driver install xcuitest # iOS
10
- appium driver install uiautomator2 # Android
11
- ```
12
-
13
- ### Appium Server
14
-
15
- ```bash
16
- # Start server (default port 4723)
17
- appium
18
-
19
- # Custom port
20
- appium --port 4724
21
-
22
- # With logs
23
- appium --log ./logs/appium.log
24
- ```
25
-
26
- ### WebdriverIO + Appium Service
27
-
28
- ```typescript
29
- // wdio.conf.ts
30
- import type { Options } from '@wdio/types';
31
-
32
- export const config: Options.Testrunner = {
33
- port: 4723,
34
- path: '/',
35
- specs: ['./test/specs/**/*.ts'],
36
- capabilities: [
37
- {
38
- platformName: 'Android',
39
- 'appium:automationName': 'UiAutomator2',
40
- 'appium:deviceName': 'emulator-5554',
41
- 'appium:app': './apps/myapp.apk',
42
- 'appium:noReset': true,
43
- },
44
- ],
45
- services: [
46
- ['appium', {
47
- args: { address: 'localhost', port: 4723 },
48
- logPath: './logs/',
49
- }],
50
- ],
51
- framework: 'mocha',
52
- // ...
53
- };
54
- ```
55
-
56
- ---
57
-
58
- ## Desired Capabilities
59
-
60
- ### Android (UiAutomator2)
61
-
62
- ```javascript
63
- {
64
- platformName: 'Android',
65
- 'appium:automationName': 'UiAutomator2',
66
- 'appium:deviceName': 'emulator-5554',
67
- 'appium:udid': 'emulator-5554', // or device serial
68
- 'appium:app': '/path/to/app.apk',
69
- 'appium:appPackage': 'com.example.app',
70
- 'appium:appActivity': '.MainActivity',
71
- 'appium:noReset': true,
72
- 'appium:fullReset': false,
73
- 'appium:newCommandTimeout': 60,
74
- }
75
- ```
76
-
77
- ### iOS (XCUITest)
78
-
79
- ```javascript
80
- {
81
- platformName: 'iOS',
82
- 'appium:automationName': 'XCUITest',
83
- 'appium:deviceName': 'iPhone 15',
84
- 'appium:udid': '...', // Simulator or device UDID
85
- 'appium:app': '/path/to/app.app',
86
- 'appium:bundleId': 'com.example.app',
87
- 'appium:noReset': true,
88
- 'appium:fullReset': false,
89
- 'appium:newCommandTimeout': 60,
90
- }
91
- ```
92
-
93
- ### Mobile Web (Chrome on Android)
94
-
95
- ```javascript
96
- {
97
- platformName: 'Android',
98
- 'appium:automationName': 'UiAutomator2',
99
- 'appium:deviceName': 'emulator-5554',
100
- browserName: 'Chrome',
101
- 'appium:chromedriverAutodownload': true,
102
- }
103
- ```
104
-
105
- ### Mobile Web (Safari on iOS)
106
-
107
- ```javascript
108
- {
109
- platformName: 'iOS',
110
- 'appium:automationName': 'XCUITest',
111
- 'appium:deviceName': 'iPhone 15',
112
- browserName: 'Safari',
113
- }
114
- ```
115
-
116
- ---
117
-
118
- ## Emulators and Simulators
119
-
120
- ### Android Emulator
121
-
122
- ```bash
123
- # List AVDs
124
- emulator -list-avds
125
-
126
- # Start emulator
127
- emulator -avd Pixel_6_API_34 -no-snapshot-load
128
-
129
- # Verify device
130
- adb devices
131
- ```
132
-
133
- ### iOS Simulator
134
-
135
- ```bash
136
- # List simulators
137
- xcrun simctl list devices
138
-
139
- # Boot simulator
140
- xcrun simctl boot "iPhone 15"
141
-
142
- # Install app
143
- xcrun simctl install booted /path/to/app.app
144
- ```
145
-
146
- ### Capability for Emulator
147
-
148
- ```javascript
149
- // Android
150
- 'appium:deviceName': 'emulator-5554',
151
- 'appium:udid': 'emulator-5554',
152
-
153
- // iOS (use UDID from simctl list)
154
- 'appium:deviceName': 'iPhone 15',
155
- 'appium:udid': '12345678-1234-1234-1234-123456789012',
156
- ```
157
-
158
- ---
159
-
160
- ## Device Farms
161
-
162
- ### BrowserStack
163
-
164
- ```javascript
165
- {
166
- 'bstack:options': {
167
- userName: process.env.BROWSERSTACK_USER,
168
- accessKey: process.env.BROWSERSTACK_KEY,
169
- projectName: 'My Project',
170
- buildName: 'Build 1',
171
- sessionName: 'Login test',
172
- },
173
- platformName: 'Android',
174
- 'appium:deviceName': 'Samsung Galaxy S23',
175
- 'appium:platformVersion': '13',
176
- 'appium:app': 'bs://<app-id>',
177
- 'appium:automationName': 'UiAutomator2',
178
- }
179
- ```
180
-
181
- **Capability URL:** `https://app-automate.browserstack.com/wd/hub`
182
-
183
- ### Sauce Labs
184
-
185
- ```javascript
186
- {
187
- 'sauce:options': {
188
- username: process.env.SAUCE_USERNAME,
189
- accessKey: process.env.SAUCE_ACCESS_KEY,
190
- build: 'Build 1',
191
- name: 'Login test',
192
- },
193
- platformName: 'Android',
194
- 'appium:deviceName': 'Android GoogleAPI Emulator',
195
- 'appium:platformVersion': '13',
196
- 'appium:app': 'storage:filename=app.apk',
197
- 'appium:automationName': 'UiAutomator2',
198
- }
199
- ```
200
-
201
- **Capability URL:** `https://ondemand.us-west-1.saucelabs.com/wd/hub`
202
-
203
- ### AWS Device Farm
204
-
205
- ```javascript
206
- {
207
- platformName: 'Android',
208
- 'appium:deviceName': 'Pixel 6',
209
- 'appium:platformVersion': '13',
210
- 'appium:app': process.env.DEVICE_FARM_APP_ARN,
211
- 'appium:automationName': 'UiAutomator2',
212
- }
213
- ```
214
-
215
- Use AWS Device Farm test runner; upload app and test package via AWS CLI or console.
216
-
217
- ---
218
-
219
- ## Flutter Configuration
220
-
221
- ### integration_test Setup
222
-
223
- ```yaml
224
- # pubspec.yaml
225
- dev_dependencies:
226
- flutter_test:
227
- sdk: flutter
228
- integration_test:
229
- sdk: flutter
230
- ```
231
-
232
- ### Directory Structure
233
-
234
- ```
235
- my_app/
236
- integration_test/
237
- app_test.dart
238
- lib/
239
- main.dart
240
- ```
241
-
242
- ### Run Flutter Integration Tests
243
-
244
- ```bash
245
- # On connected device/emulator
246
- flutter test integration_test/app_test.dart
247
-
248
- # With driver (legacy)
249
- flutter drive --target=test_driver/app.dart
250
- ```
251
-
252
- ### Flutter Driver (Legacy)
253
-
254
- ```dart
255
- // test_driver/app.dart
256
- import 'package:flutter_driver/driver_extension.dart';
257
- import 'package:my_app/main.dart' as app;
258
-
259
- void main() {
260
- enableFlutterDriverExtension();
261
- app.main();
262
- }
263
- ```
264
-
265
- ---
266
-
267
- ## CI Integration
268
-
269
- ### GitHub Actions (Appium + Android Emulator)
270
-
271
- ```yaml
272
- - uses: reactivecircus/android-emulator-runner@v2
273
- with:
274
- api-level: 34
275
- script: npx wdio run wdio.conf.ts
276
- ```
277
-
278
- ### GitHub Actions (iOS Simulator)
279
-
280
- ```yaml
281
- - uses: maxim-lobanov/setup-xcode@v1
282
- with:
283
- xcode-version: '15.0'
284
- - run: xcrun simctl boot "iPhone 15"
285
- - run: npx wdio run wdio.ios.conf.ts
286
- ```
287
-
288
- ### Environment Variables
289
-
290
- | Variable | Purpose |
291
- |----------|---------|
292
- | `BROWSERSTACK_USER` | BrowserStack username |
293
- | `BROWSERSTACK_KEY` | BrowserStack access key |
294
- | `SAUCE_USERNAME` | Sauce Labs username |
295
- | `SAUCE_ACCESS_KEY` | Sauce Labs access key |
296
- | `APP_PATH` | Path to .apk / .app |
297
- | `DEVICE_UDID` | Device or simulator UDID |
298
-
299
- ---
300
-
301
- ## Key Options
302
-
303
- | Option | Description | Default |
304
- |--------|-------------|---------|
305
- | `noReset` | Reuse app state; don't clear data | false |
306
- | `fullReset` | Uninstall and reinstall app | false |
307
- | `newCommandTimeout` | Idle timeout (seconds) | 60 |
308
- | `autoGrantPermissions` | Auto-accept runtime permissions | false |
309
- | `chromedriverAutodownload` | Auto-download ChromeDriver (Android) | false |
@@ -1,304 +0,0 @@
1
- # Mobile Test Patterns
2
-
3
- ## Native Apps
4
-
5
- ### Element Location Strategies
6
-
7
- | Strategy | iOS | Android | Priority |
8
- |----------|-----|---------|----------|
9
- | **accessibility id** | accessibilityIdentifier | content-desc / resource-id | 1 (most stable) |
10
- | **resource-id** | — | resource-id | 1 (Android) |
11
- | **id** | — | id attribute | 1 (Android) |
12
- | **class name** | XCUIElementType* | android.widget.* | 2 |
13
- | **xpath** | Full path | Full path | 3 (last resort) |
14
- | **predicate** | -ios predicate string | — | 2 (iOS) |
15
- | **uiautomator** | — | -android uiautomator | 2 (Android) |
16
-
17
- ### Appium Native Example
18
-
19
- ```javascript
20
- // Appium (WebdriverIO)
21
- const loginBtn = await $('~login-button'); // accessibility id
22
- await loginBtn.click();
23
-
24
- // Android resource-id
25
- const submitBtn = await $('id=com.example:id/submit');
26
- await submitBtn.click();
27
-
28
- // iOS predicate
29
- const cell = await $('-ios predicate string:name == "Settings"');
30
- await cell.click();
31
-
32
- // Android UiAutomator
33
- const item = await $('-android uiautomator:new UiSelector().text("Submit")');
34
- await item.click();
35
- ```
36
-
37
- ### Flutter Native Example
38
-
39
- ```dart
40
- // integration_test/app_test.dart
41
- import 'package:flutter_test/flutter_test.dart';
42
- import 'package:integration_test/integration_test.dart';
43
- import 'package:my_app/main.dart' as app;
44
-
45
- void main() {
46
- IntegrationTestWidgetsFlutterBinding.ensureInitialized();
47
-
48
- testWidgets('login flow', (tester) async {
49
- app.main();
50
- await tester.pumpAndSettle();
51
-
52
- await tester.tap(find.byKey(Key('login-button')));
53
- await tester.pumpAndSettle();
54
-
55
- await tester.enterText(find.byKey(Key('email-field')), 'user@test.com');
56
- await tester.enterText(find.byKey(Key('password-field')), 'secret');
57
- await tester.tap(find.byKey(Key('submit-button')));
58
- await tester.pumpAndSettle();
59
-
60
- expect(find.text('Welcome'), findsOneWidget);
61
- });
62
- }
63
- ```
64
-
65
- ---
66
-
67
- ## Hybrid Apps
68
-
69
- ### Context Switching
70
-
71
- Hybrid apps have native and webview contexts. Switch to webview to interact with web content.
72
-
73
- ```javascript
74
- // Get all contexts
75
- const contexts = await driver.getContexts();
76
- // ['NATIVE_APP', 'WEBVIEW_com.example.app']
77
-
78
- // Switch to webview
79
- await driver.switchContext('WEBVIEW_com.example.app');
80
-
81
- // Use web selectors (CSS, XPath)
82
- await $('input[name="email"]').setValue('user@test.com');
83
- await $('button[type="submit"]').click();
84
-
85
- // Switch back to native
86
- await driver.switchContext('NATIVE_APP');
87
- ```
88
-
89
- ### Webview Detection
90
-
91
- ```javascript
92
- // Wait for webview to appear
93
- await driver.waitUntil(
94
- async () => (await driver.getContexts()).some(c => c.includes('WEBVIEW')),
95
- { timeout: 10000 }
96
- );
97
- ```
98
-
99
- ---
100
-
101
- ## Gestures
102
-
103
- ### Touch Actions (Legacy)
104
-
105
- ```javascript
106
- // Single tap
107
- await element.touchAction('tap');
108
-
109
- // Long press
110
- await element.touchAction([
111
- { action: 'longPress' },
112
- { action: 'release' }
113
- ]);
114
-
115
- // Swipe
116
- await driver.touchAction([
117
- { action: 'press', x: 300, y: 800 },
118
- { action: 'wait', ms: 500 },
119
- { action: 'moveTo', x: 300, y: 200 },
120
- { action: 'release' }
121
- ]);
122
-
123
- // Scroll (element-based)
124
- await element.touchAction([
125
- { action: 'press', x: 150, y: 500 },
126
- { action: 'moveTo', x: 150, y: 100 },
127
- { action: 'release' }
128
- ]);
129
- ```
130
-
131
- ### W3C Actions API (Preferred)
132
-
133
- ```javascript
134
- // Tap
135
- await driver.performActions([
136
- {
137
- type: 'pointer',
138
- id: 'finger1',
139
- parameters: { pointerType: 'touch' },
140
- actions: [
141
- { type: 'pointerMove', duration: 0, x: 100, y: 200 },
142
- { type: 'pointerDown', button: 0 },
143
- { type: 'pointerUp', button: 0 }
144
- ]
145
- }
146
- ]);
147
-
148
- // Swipe
149
- await driver.performActions([
150
- {
151
- type: 'pointer',
152
- id: 'finger1',
153
- parameters: { pointerType: 'touch' },
154
- actions: [
155
- { type: 'pointerMove', duration: 0, x: 200, y: 600 },
156
- { type: 'pointerDown', button: 0 },
157
- { type: 'pause', duration: 100 },
158
- { type: 'pointerMove', duration: 300, x: 200, y: 200 },
159
- { type: 'pointerUp', button: 0 }
160
- ]
161
- }
162
- ]);
163
- ```
164
-
165
- ### Scroll to Element
166
-
167
- ```javascript
168
- // Scroll until element visible (Appium)
169
- await driver.execute('mobile: scroll', {
170
- direction: 'down',
171
- predicateString: 'name == "Target Element"'
172
- });
173
-
174
- // Or use scrollIntoView (if supported)
175
- await element.scrollIntoView();
176
- ```
177
-
178
- ---
179
-
180
- ## App Lifecycle
181
-
182
- ### Install / Uninstall
183
-
184
- ```javascript
185
- // Install app
186
- await driver.installApp('/path/to/app.apk');
187
- await driver.installApp('https://example.com/app.apk');
188
-
189
- // Uninstall
190
- await driver.removeApp('com.example.app');
191
- ```
192
-
193
- ### Launch / Terminate
194
-
195
- ```javascript
196
- // Launch (activate) app
197
- await driver.activateApp('com.example.app');
198
-
199
- // Terminate
200
- await driver.terminateApp('com.example.app');
201
- ```
202
-
203
- ### Reset Options
204
-
205
- | Capability | Effect |
206
- |------------|--------|
207
- | `noReset: true` | Reuse app state; faster; may leave data |
208
- | `fullReset: true` | Uninstall + reinstall; clean state |
209
- | `dontStopAppOnReset: true` | Don't stop app before session |
210
-
211
- ### Background / Foreground
212
-
213
- ```javascript
214
- // Send app to background
215
- await driver.background(5); // 5 seconds
216
-
217
- // Resume
218
- await driver.activateApp('com.example.app');
219
- ```
220
-
221
- ---
222
-
223
- ## Deep Links
224
-
225
- ### Open Deep Link
226
-
227
- ```javascript
228
- // Android
229
- await driver.execute('mobile: deepLink', {
230
- url: 'myapp://screen/detail/123',
231
- package: 'com.example.app'
232
- });
233
-
234
- // iOS
235
- await driver.execute('mobile: launchApp', {
236
- bundleId: 'com.example.app',
237
- arguments: ['--url', 'myapp://screen/detail/123']
238
- });
239
- ```
240
-
241
- ### URL Scheme (Alternative)
242
-
243
- ```javascript
244
- // Open URL that triggers app
245
- await driver.url('myapp://screen/detail/123');
246
- ```
247
-
248
- ---
249
-
250
- ## Mobile Web
251
-
252
- ### Capabilities for Mobile Browser
253
-
254
- ```javascript
255
- // Android Chrome
256
- {
257
- platformName: 'Android',
258
- 'appium:automationName': 'UiAutomator2',
259
- browserName: 'Chrome',
260
- 'appium:deviceName': 'emulator-5554'
261
- }
262
-
263
- // iOS Safari
264
- {
265
- platformName: 'iOS',
266
- 'appium:automationName': 'XCUITest',
267
- browserName: 'Safari',
268
- 'appium:deviceName': 'iPhone 15'
269
- }
270
- ```
271
-
272
- ### Mobile Web Selectors
273
-
274
- Use standard web selectors (CSS, XPath) when context is browser. Viewport and touch behavior differ from desktop.
275
-
276
- ---
277
-
278
- ## Flutter Finders
279
-
280
- | Finder | Use Case |
281
- |--------|----------|
282
- | `find.byKey(Key('id'))` | Stable; requires Key in widget |
283
- | `find.text('Label')` | Visible text |
284
- | `find.byType(MyWidget)` | Widget type |
285
- | `find.bySemanticsLabel('label')` | Accessibility |
286
- | `find.byIcon(Icons.add)` | Icon |
287
- | `find.byTooltip('tip')` | Tooltip |
288
-
289
- ### Pumping
290
-
291
- ```dart
292
- await tester.pump(); // One frame
293
- await tester.pump(Duration(seconds: 1)); // Advance time
294
- await tester.pumpAndSettle(); // Pump until no more frames (animations done)
295
- ```
296
-
297
- ### Golden Tests
298
-
299
- ```dart
300
- await expectLater(
301
- find.byType(MyWidget),
302
- matchesGoldenFile('goldens/my_widget.png'),
303
- );
304
- ```