qa-skills 3.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.
Files changed (262) hide show
  1. package/README.md +168 -0
  2. package/bin/cli.js +42 -0
  3. package/dist/agents/registry.d.ts +5 -0
  4. package/dist/agents/registry.d.ts.map +1 -0
  5. package/dist/agents/registry.js +101 -0
  6. package/dist/agents/registry.js.map +1 -0
  7. package/dist/agents/types.d.ts +9 -0
  8. package/dist/agents/types.d.ts.map +1 -0
  9. package/dist/agents/types.js +2 -0
  10. package/dist/agents/types.js.map +1 -0
  11. package/dist/dependencies.d.ts +21 -0
  12. package/dist/dependencies.d.ts.map +1 -0
  13. package/dist/dependencies.js +125 -0
  14. package/dist/dependencies.js.map +1 -0
  15. package/dist/installer.d.ts +25 -0
  16. package/dist/installer.d.ts.map +1 -0
  17. package/dist/installer.js +437 -0
  18. package/dist/installer.js.map +1 -0
  19. package/dist/scaffold.d.ts +27 -0
  20. package/dist/scaffold.d.ts.map +1 -0
  21. package/dist/scaffold.js +182 -0
  22. package/dist/scaffold.js.map +1 -0
  23. package/package.json +40 -0
  24. package/skills/qa-accessibility-test-writer/SKILL.md +127 -0
  25. package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +349 -0
  26. package/skills/qa-accessibility-test-writer/references/best-practices.md +184 -0
  27. package/skills/qa-accessibility-test-writer/references/wcag-tests.md +331 -0
  28. package/skills/qa-api-contract-curator/SKILL.md +104 -0
  29. package/skills/qa-api-contract-curator/references/breaking-changes.md +363 -0
  30. package/skills/qa-api-contract-curator/references/openapi-structure.md +404 -0
  31. package/skills/qa-browser-data-collector/SKILL.md +132 -0
  32. package/skills/qa-browser-data-collector/references/data-collection-checklist.md +91 -0
  33. package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +113 -0
  34. package/skills/qa-bug-ticket-creator/SKILL.md +148 -0
  35. package/skills/qa-bug-ticket-creator/references/bug-report-format.md +149 -0
  36. package/skills/qa-bug-ticket-creator/references/severity-guide.md +81 -0
  37. package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +39 -0
  38. package/skills/qa-changelog-analyzer/SKILL.md +134 -0
  39. package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +138 -0
  40. package/skills/qa-changelog-analyzer/references/impact-mapping.md +120 -0
  41. package/skills/qa-clickup-integration/SKILL.md +166 -0
  42. package/skills/qa-clickup-integration/references/api-patterns.md +102 -0
  43. package/skills/qa-clickup-integration/references/field-mapping.md +71 -0
  44. package/skills/qa-codeceptjs-writer/SKILL.md +136 -0
  45. package/skills/qa-codeceptjs-writer/references/best-practices.md +207 -0
  46. package/skills/qa-codeceptjs-writer/references/config.md +255 -0
  47. package/skills/qa-codeceptjs-writer/references/patterns.md +285 -0
  48. package/skills/qa-coverage-analyzer/SKILL.md +166 -0
  49. package/skills/qa-coverage-analyzer/references/best-practices.md +142 -0
  50. package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +155 -0
  51. package/skills/qa-coverage-analyzer/references/tools.md +204 -0
  52. package/skills/qa-cypress-writer/SKILL.md +134 -0
  53. package/skills/qa-cypress-writer/references/assertions.md +121 -0
  54. package/skills/qa-cypress-writer/references/best-practices.md +82 -0
  55. package/skills/qa-cypress-writer/references/config.md +121 -0
  56. package/skills/qa-cypress-writer/references/patterns.md +170 -0
  57. package/skills/qa-data-factory/SKILL.md +126 -0
  58. package/skills/qa-data-factory/references/factory-patterns.md +164 -0
  59. package/skills/qa-data-factory/references/faker-guide.md +131 -0
  60. package/skills/qa-diagram-generator/SKILL.md +125 -0
  61. package/skills/qa-diagram-generator/references/c4-model.md +53 -0
  62. package/skills/qa-diagram-generator/references/charts.md +58 -0
  63. package/skills/qa-diagram-generator/references/class-diagram.md +85 -0
  64. package/skills/qa-diagram-generator/references/er-diagram.md +69 -0
  65. package/skills/qa-diagram-generator/references/flowchart.md +92 -0
  66. package/skills/qa-diagram-generator/references/from-screenshot.md +45 -0
  67. package/skills/qa-diagram-generator/references/gantt.md +49 -0
  68. package/skills/qa-diagram-generator/references/journey.md +50 -0
  69. package/skills/qa-diagram-generator/references/mindmap.md +75 -0
  70. package/skills/qa-diagram-generator/references/sequence.md +69 -0
  71. package/skills/qa-diagram-generator/references/state-diagram.md +56 -0
  72. package/skills/qa-discovery-interview/SKILL.md +182 -0
  73. package/skills/qa-discovery-interview/references/completeness-checklist.md +53 -0
  74. package/skills/qa-discovery-interview/references/conflict-patterns.md +101 -0
  75. package/skills/qa-discovery-interview/references/qa-categories.md +147 -0
  76. package/skills/qa-discovery-interview/templates/qa-brief-template.md +168 -0
  77. package/skills/qa-environment-checker/SKILL.md +142 -0
  78. package/skills/qa-environment-checker/references/dependency-matrix.md +101 -0
  79. package/skills/qa-environment-checker/references/health-checks.md +209 -0
  80. package/skills/qa-environment-checker/templates/env-readiness-template.md +64 -0
  81. package/skills/qa-flaky-detector/SKILL.md +153 -0
  82. package/skills/qa-flaky-detector/references/ci-analysis.md +140 -0
  83. package/skills/qa-flaky-detector/references/flaky-patterns.md +247 -0
  84. package/skills/qa-github-issues-enhanced/SKILL.md +175 -0
  85. package/skills/qa-github-issues-enhanced/references/issue-templates.md +425 -0
  86. package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +130 -0
  87. package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +188 -0
  88. package/skills/qa-httpx-writer/SKILL.md +138 -0
  89. package/skills/qa-httpx-writer/references/assertions.md +195 -0
  90. package/skills/qa-httpx-writer/references/best-practices.md +140 -0
  91. package/skills/qa-httpx-writer/references/config.md +212 -0
  92. package/skills/qa-httpx-writer/references/patterns.md +262 -0
  93. package/skills/qa-jest-writer/SKILL.md +131 -0
  94. package/skills/qa-jest-writer/references/assertions.md +125 -0
  95. package/skills/qa-jest-writer/references/best-practices.md +136 -0
  96. package/skills/qa-jest-writer/references/config.md +134 -0
  97. package/skills/qa-jest-writer/references/patterns.md +172 -0
  98. package/skills/qa-jira-integration/SKILL.md +135 -0
  99. package/skills/qa-jira-integration/references/api-patterns.md +143 -0
  100. package/skills/qa-jira-integration/references/field-mapping.md +79 -0
  101. package/skills/qa-jira-integration/references/xray-integration.md +85 -0
  102. package/skills/qa-jmeter-writer/SKILL.md +171 -0
  103. package/skills/qa-jmeter-writer/references/best-practices.md +157 -0
  104. package/skills/qa-jmeter-writer/references/config.md +204 -0
  105. package/skills/qa-jmeter-writer/references/patterns.md +242 -0
  106. package/skills/qa-junit5-writer/SKILL.md +157 -0
  107. package/skills/qa-junit5-writer/references/assertions.md +118 -0
  108. package/skills/qa-junit5-writer/references/config.md +97 -0
  109. package/skills/qa-junit5-writer/references/patterns.md +162 -0
  110. package/skills/qa-k6-writer/SKILL.md +155 -0
  111. package/skills/qa-k6-writer/references/best-practices.md +236 -0
  112. package/skills/qa-k6-writer/references/config.md +219 -0
  113. package/skills/qa-k6-writer/references/patterns.md +304 -0
  114. package/skills/qa-linear-integration/SKILL.md +137 -0
  115. package/skills/qa-linear-integration/references/api-patterns.md +249 -0
  116. package/skills/qa-linear-integration/references/field-mapping.md +121 -0
  117. package/skills/qa-locust-writer/SKILL.md +151 -0
  118. package/skills/qa-locust-writer/references/best-practices.md +126 -0
  119. package/skills/qa-locust-writer/references/config.md +170 -0
  120. package/skills/qa-locust-writer/references/patterns.md +235 -0
  121. package/skills/qa-manual-test-designer/SKILL.md +145 -0
  122. package/skills/qa-manual-test-designer/references/exploratory-charters.md +138 -0
  123. package/skills/qa-manual-test-designer/references/personas.md +146 -0
  124. package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +47 -0
  125. package/skills/qa-manual-test-designer/templates/test-case-template.md +31 -0
  126. package/skills/qa-mobile-test-writer/SKILL.md +144 -0
  127. package/skills/qa-mobile-test-writer/references/best-practices.md +214 -0
  128. package/skills/qa-mobile-test-writer/references/config.md +309 -0
  129. package/skills/qa-mobile-test-writer/references/patterns.md +304 -0
  130. package/skills/qa-nfr-analyst/SKILL.md +177 -0
  131. package/skills/qa-nfr-analyst/references/iso-25010-model.md +159 -0
  132. package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +202 -0
  133. package/skills/qa-nfr-analyst/references/wcag-checklist.md +184 -0
  134. package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +89 -0
  135. package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +48 -0
  136. package/skills/qa-orchestrator/SKILL.md +132 -0
  137. package/skills/qa-orchestrator/references/handoff-chains.md +105 -0
  138. package/skills/qa-orchestrator/references/pipeline-modes.md +115 -0
  139. package/skills/qa-orchestrator/references/scheduler-rules.md +84 -0
  140. package/skills/qa-pact-writer/SKILL.md +133 -0
  141. package/skills/qa-pact-writer/references/best-practices.md +100 -0
  142. package/skills/qa-pact-writer/references/config.md +135 -0
  143. package/skills/qa-pact-writer/references/patterns.md +161 -0
  144. package/skills/qa-plan-creator/SKILL.md +139 -0
  145. package/skills/qa-plan-creator/references/introduction-plan.md +43 -0
  146. package/skills/qa-plan-creator/references/migration-plan.md +44 -0
  147. package/skills/qa-plan-creator/references/onboarding-plan.md +46 -0
  148. package/skills/qa-plan-creator/references/performance-plan.md +44 -0
  149. package/skills/qa-plan-creator/references/regression-plan.md +45 -0
  150. package/skills/qa-plan-creator/references/release-plan.md +45 -0
  151. package/skills/qa-plan-creator/references/sprint-plan.md +44 -0
  152. package/skills/qa-plan-creator/references/test-plan.md +59 -0
  153. package/skills/qa-plan-creator/references/uat-plan.md +43 -0
  154. package/skills/qa-plan-creator/templates/checklist-template.md +36 -0
  155. package/skills/qa-plan-creator/templates/regression-checklist-template.md +49 -0
  156. package/skills/qa-plan-creator/templates/release-checklist-template.md +46 -0
  157. package/skills/qa-plan-creator/templates/test-plan-template.md +74 -0
  158. package/skills/qa-playwright-py-writer/SKILL.md +156 -0
  159. package/skills/qa-playwright-py-writer/references/best-practices.md +194 -0
  160. package/skills/qa-playwright-py-writer/references/config.md +195 -0
  161. package/skills/qa-playwright-py-writer/references/patterns.md +212 -0
  162. package/skills/qa-playwright-ts-writer/SKILL.md +151 -0
  163. package/skills/qa-playwright-ts-writer/references/assertions.md +109 -0
  164. package/skills/qa-playwright-ts-writer/references/best-practices.md +191 -0
  165. package/skills/qa-playwright-ts-writer/references/config.md +144 -0
  166. package/skills/qa-playwright-ts-writer/references/patterns.md +171 -0
  167. package/skills/qa-pytest-writer/SKILL.md +145 -0
  168. package/skills/qa-pytest-writer/references/assertions.md +149 -0
  169. package/skills/qa-pytest-writer/references/best-practices.md +97 -0
  170. package/skills/qa-pytest-writer/references/config.md +176 -0
  171. package/skills/qa-pytest-writer/references/patterns.md +251 -0
  172. package/skills/qa-qase-integration/SKILL.md +149 -0
  173. package/skills/qa-qase-integration/references/api-reference.md +354 -0
  174. package/skills/qa-qase-integration/references/ci-integration.md +196 -0
  175. package/skills/qa-qase-integration/references/field-mapping.md +157 -0
  176. package/skills/qa-requirements-generator/SKILL.md +152 -0
  177. package/skills/qa-requirements-generator/references/iso-29148-structure.md +153 -0
  178. package/skills/qa-requirements-generator/references/requirement-patterns.md +278 -0
  179. package/skills/qa-rest-assured-writer/SKILL.md +137 -0
  180. package/skills/qa-rest-assured-writer/references/best-practices.md +50 -0
  181. package/skills/qa-rest-assured-writer/references/config.md +124 -0
  182. package/skills/qa-rest-assured-writer/references/patterns.md +192 -0
  183. package/skills/qa-risk-analyzer/SKILL.md +158 -0
  184. package/skills/qa-risk-analyzer/references/impact-analysis.md +133 -0
  185. package/skills/qa-risk-analyzer/references/risk-factors.md +123 -0
  186. package/skills/qa-robot-framework-writer/SKILL.md +147 -0
  187. package/skills/qa-robot-framework-writer/references/best-practices.md +249 -0
  188. package/skills/qa-robot-framework-writer/references/config.md +204 -0
  189. package/skills/qa-robot-framework-writer/references/libraries.md +273 -0
  190. package/skills/qa-robot-framework-writer/references/patterns.md +216 -0
  191. package/skills/qa-security-test-writer/SKILL.md +123 -0
  192. package/skills/qa-security-test-writer/references/best-practices.md +155 -0
  193. package/skills/qa-security-test-writer/references/owasp-top10.md +331 -0
  194. package/skills/qa-security-test-writer/references/zap-config.md +258 -0
  195. package/skills/qa-selenium-java-writer/SKILL.md +143 -0
  196. package/skills/qa-selenium-java-writer/references/best-practices.md +59 -0
  197. package/skills/qa-selenium-java-writer/references/config.md +143 -0
  198. package/skills/qa-selenium-java-writer/references/patterns.md +170 -0
  199. package/skills/qa-selenium-py-writer/SKILL.md +150 -0
  200. package/skills/qa-selenium-py-writer/references/best-practices.md +175 -0
  201. package/skills/qa-selenium-py-writer/references/config.md +224 -0
  202. package/skills/qa-selenium-py-writer/references/patterns.md +255 -0
  203. package/skills/qa-shortcut-integration/SKILL.md +143 -0
  204. package/skills/qa-shortcut-integration/references/api-patterns.md +126 -0
  205. package/skills/qa-shortcut-integration/references/field-mapping.md +66 -0
  206. package/skills/qa-spec-auditor/SKILL.md +162 -0
  207. package/skills/qa-spec-auditor/references/audit-checklist.md +144 -0
  208. package/skills/qa-spec-auditor/references/drift-patterns.md +207 -0
  209. package/skills/qa-spec-writer/SKILL.md +143 -0
  210. package/skills/qa-spec-writer/references/gherkin-guide.md +253 -0
  211. package/skills/qa-spec-writer/references/specification-patterns.md +274 -0
  212. package/skills/qa-spring-test-writer/SKILL.md +170 -0
  213. package/skills/qa-spring-test-writer/references/best-practices.md +57 -0
  214. package/skills/qa-spring-test-writer/references/config.md +179 -0
  215. package/skills/qa-spring-test-writer/references/patterns.md +235 -0
  216. package/skills/qa-supertest-writer/SKILL.md +150 -0
  217. package/skills/qa-supertest-writer/references/assertions.md +192 -0
  218. package/skills/qa-supertest-writer/references/best-practices.md +102 -0
  219. package/skills/qa-supertest-writer/references/config.md +166 -0
  220. package/skills/qa-supertest-writer/references/patterns.md +242 -0
  221. package/skills/qa-task-creator/SKILL.md +142 -0
  222. package/skills/qa-task-creator/references/linking-patterns.md +127 -0
  223. package/skills/qa-task-creator/references/task-types.md +169 -0
  224. package/skills/qa-task-creator/templates/task-template.md +24 -0
  225. package/skills/qa-test-doc-compiler/SKILL.md +114 -0
  226. package/skills/qa-test-doc-compiler/references/agile-tailoring.md +220 -0
  227. package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +302 -0
  228. package/skills/qa-test-healer/SKILL.md +101 -0
  229. package/skills/qa-test-healer/references/diagnosis-patterns.md +142 -0
  230. package/skills/qa-test-healer/references/fix-strategies.md +177 -0
  231. package/skills/qa-test-reporter/SKILL.md +130 -0
  232. package/skills/qa-test-reporter/references/best-practices.md +162 -0
  233. package/skills/qa-test-reporter/references/iso-29119-reports.md +236 -0
  234. package/skills/qa-test-reporter/references/report-formats.md +287 -0
  235. package/skills/qa-test-reviewer/SKILL.md +142 -0
  236. package/skills/qa-test-reviewer/references/anti-patterns.md +268 -0
  237. package/skills/qa-test-reviewer/references/review-checklist.md +93 -0
  238. package/skills/qa-test-strategy/SKILL.md +133 -0
  239. package/skills/qa-test-strategy/references/entry-exit-criteria.md +176 -0
  240. package/skills/qa-test-strategy/references/risk-matrix.md +102 -0
  241. package/skills/qa-test-strategy/references/testing-types.md +143 -0
  242. package/skills/qa-testcase-from-docs/SKILL.md +161 -0
  243. package/skills/qa-testcase-from-docs/references/test-case-format.md +196 -0
  244. package/skills/qa-testcase-from-docs/references/test-design-techniques.md +126 -0
  245. package/skills/qa-testcase-from-docs/templates/test-case-template.md +31 -0
  246. package/skills/qa-testcase-from-ui/SKILL.md +109 -0
  247. package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +126 -0
  248. package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +146 -0
  249. package/skills/qa-testcase-from-ui/templates/test-case-template.md +31 -0
  250. package/skills/qa-visual-regression-writer/SKILL.md +175 -0
  251. package/skills/qa-visual-regression-writer/references/best-practices.md +154 -0
  252. package/skills/qa-visual-regression-writer/references/config.md +220 -0
  253. package/skills/qa-visual-regression-writer/references/patterns.md +213 -0
  254. package/skills/qa-vitest-writer/SKILL.md +141 -0
  255. package/skills/qa-vitest-writer/references/assertions.md +105 -0
  256. package/skills/qa-vitest-writer/references/best-practices.md +62 -0
  257. package/skills/qa-vitest-writer/references/config.md +127 -0
  258. package/skills/qa-vitest-writer/references/patterns.md +141 -0
  259. package/skills/qa-webdriverio-writer/SKILL.md +145 -0
  260. package/skills/qa-webdriverio-writer/references/best-practices.md +176 -0
  261. package/skills/qa-webdriverio-writer/references/config.md +240 -0
  262. package/skills/qa-webdriverio-writer/references/patterns.md +269 -0
@@ -0,0 +1,309 @@
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 |
@@ -0,0 +1,304 @@
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
+ ```