agentic-qe 1.4.4 → 1.5.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 (390) hide show
  1. package/.claude/agents/qe-api-contract-validator.md +133 -27
  2. package/.claude/agents/qe-api-contract-validator.md.backup +1148 -0
  3. package/.claude/agents/qe-api-contract-validator.md.backup-20251107-134747 +1148 -0
  4. package/.claude/agents/qe-api-contract-validator.md.backup-phase2-20251107-140039 +1123 -0
  5. package/.claude/agents/qe-chaos-engineer.md +142 -23
  6. package/.claude/agents/qe-chaos-engineer.md.backup +808 -0
  7. package/.claude/agents/qe-chaos-engineer.md.backup-20251107-134747 +808 -0
  8. package/.claude/agents/qe-chaos-engineer.md.backup-phase2-20251107-140039 +787 -0
  9. package/.claude/agents/qe-code-complexity.md +111 -23
  10. package/.claude/agents/qe-code-complexity.md.backup +291 -0
  11. package/.claude/agents/qe-code-complexity.md.backup-20251107-134747 +291 -0
  12. package/.claude/agents/qe-code-complexity.md.backup-phase2-20251107-140039 +286 -0
  13. package/.claude/agents/qe-coverage-analyzer.md +306 -30
  14. package/.claude/agents/qe-coverage-analyzer.md.backup +467 -0
  15. package/.claude/agents/qe-coverage-analyzer.md.backup-20251107-134747 +467 -0
  16. package/.claude/agents/qe-coverage-analyzer.md.backup-phase2-20251107-140039 +438 -0
  17. package/.claude/agents/qe-deployment-readiness.md +84 -28
  18. package/.claude/agents/qe-deployment-readiness.md.backup +1166 -0
  19. package/.claude/agents/qe-deployment-readiness.md.backup-20251107-134747 +1166 -0
  20. package/.claude/agents/qe-deployment-readiness.md.backup-phase2-20251107-140039 +1140 -0
  21. package/.claude/agents/qe-flaky-test-hunter.md +277 -35
  22. package/.claude/agents/qe-flaky-test-hunter.md.backup +1195 -0
  23. package/.claude/agents/qe-flaky-test-hunter.md.backup-20251107-134747 +1195 -0
  24. package/.claude/agents/qe-flaky-test-hunter.md.backup-phase2-20251107-140039 +1162 -0
  25. package/.claude/agents/qe-fleet-commander.md +126 -23
  26. package/.claude/agents/qe-fleet-commander.md.backup +718 -0
  27. package/.claude/agents/qe-fleet-commander.md.backup-20251107-134747 +718 -0
  28. package/.claude/agents/qe-fleet-commander.md.backup-phase2-20251107-140039 +697 -0
  29. package/.claude/agents/qe-performance-tester.md +314 -57
  30. package/.claude/agents/qe-performance-tester.md.backup +428 -0
  31. package/.claude/agents/qe-performance-tester.md.backup-20251107-134747 +428 -0
  32. package/.claude/agents/qe-performance-tester.md.backup-phase2-20251107-140039 +372 -0
  33. package/.claude/agents/qe-production-intelligence.md +126 -27
  34. package/.claude/agents/qe-production-intelligence.md.backup +1219 -0
  35. package/.claude/agents/qe-production-intelligence.md.backup-20251107-134747 +1219 -0
  36. package/.claude/agents/qe-production-intelligence.md.backup-phase2-20251107-140039 +1194 -0
  37. package/.claude/agents/qe-quality-analyzer.md +127 -32
  38. package/.claude/agents/qe-quality-analyzer.md.backup +425 -0
  39. package/.claude/agents/qe-quality-analyzer.md.backup-20251107-134747 +425 -0
  40. package/.claude/agents/qe-quality-analyzer.md.backup-phase2-20251107-140039 +394 -0
  41. package/.claude/agents/qe-quality-gate.md +148 -33
  42. package/.claude/agents/qe-quality-gate.md.backup +446 -0
  43. package/.claude/agents/qe-quality-gate.md.backup-20251107-134747 +446 -0
  44. package/.claude/agents/qe-quality-gate.md.backup-phase2-20251107-140039 +415 -0
  45. package/.claude/agents/qe-regression-risk-analyzer.md +78 -27
  46. package/.claude/agents/qe-regression-risk-analyzer.md.backup +1009 -0
  47. package/.claude/agents/qe-regression-risk-analyzer.md.backup-20251107-134747 +1009 -0
  48. package/.claude/agents/qe-regression-risk-analyzer.md.backup-phase2-20251107-140039 +984 -0
  49. package/.claude/agents/qe-requirements-validator.md +131 -27
  50. package/.claude/agents/qe-requirements-validator.md.backup +748 -0
  51. package/.claude/agents/qe-requirements-validator.md.backup-20251107-134747 +748 -0
  52. package/.claude/agents/qe-requirements-validator.md.backup-phase2-20251107-140039 +723 -0
  53. package/.claude/agents/qe-security-scanner.md +137 -62
  54. package/.claude/agents/qe-security-scanner.md.backup +634 -0
  55. package/.claude/agents/qe-security-scanner.md.backup-20251107-134747 +634 -0
  56. package/.claude/agents/qe-security-scanner.md.backup-phase2-20251107-140039 +573 -0
  57. package/.claude/agents/qe-test-data-architect.md +129 -26
  58. package/.claude/agents/qe-test-data-architect.md.backup +1064 -0
  59. package/.claude/agents/qe-test-data-architect.md.backup-20251107-134747 +1064 -0
  60. package/.claude/agents/qe-test-data-architect.md.backup-phase2-20251107-140039 +1040 -0
  61. package/.claude/agents/qe-test-executor.md +165 -21
  62. package/.claude/agents/qe-test-executor.md.backup +389 -0
  63. package/.claude/agents/qe-test-executor.md.backup-20251107-134747 +389 -0
  64. package/.claude/agents/qe-test-executor.md.backup-phase2-20251107-140039 +369 -0
  65. package/.claude/agents/qe-test-generator.md +379 -34
  66. package/.claude/agents/qe-test-generator.md.backup +997 -0
  67. package/.claude/agents/qe-test-generator.md.backup-20251107-134747 +997 -0
  68. package/.claude/agents/qe-visual-tester.md +236 -23
  69. package/.claude/agents/qe-visual-tester.md.backup +777 -0
  70. package/.claude/agents/qe-visual-tester.md.backup-20251107-134747 +777 -0
  71. package/.claude/agents/qe-visual-tester.md.backup-phase2-20251107-140039 +756 -0
  72. package/.claude/agents/subagents/qe-code-reviewer.md +59 -0
  73. package/.claude/agents/subagents/qe-data-generator.md +60 -0
  74. package/.claude/agents/subagents/qe-integration-tester.md +77 -0
  75. package/.claude/agents/subagents/qe-performance-validator.md +55 -0
  76. package/.claude/agents/subagents/qe-security-auditor.md +51 -0
  77. package/.claude/agents/subagents/qe-test-implementer.md +371 -0
  78. package/.claude/agents/subagents/qe-test-refactorer.md +510 -0
  79. package/.claude/agents/subagents/qe-test-writer.md +603 -0
  80. package/.claude/skills/accessibility-testing/SKILL.md +764 -777
  81. package/.claude/skills/agentic-quality-engineering/SKILL.md +0 -6
  82. package/.claude/skills/api-testing-patterns/SKILL.md +0 -12
  83. package/.claude/skills/bug-reporting-excellence/SKILL.md +0 -6
  84. package/.claude/skills/chaos-engineering-resilience/SKILL.md +0 -6
  85. package/.claude/skills/code-review-quality/SKILL.md +0 -6
  86. package/.claude/skills/compatibility-testing/SKILL.md +0 -6
  87. package/.claude/skills/compliance-testing/SKILL.md +0 -6
  88. package/.claude/skills/consultancy-practices/SKILL.md +0 -6
  89. package/.claude/skills/context-driven-testing/SKILL.md +0 -6
  90. package/.claude/skills/contract-testing/SKILL.md +0 -6
  91. package/.claude/skills/database-testing/SKILL.md +0 -6
  92. package/.claude/skills/exploratory-testing-advanced/SKILL.md +0 -6
  93. package/.claude/skills/holistic-testing-pact/SKILL.md +0 -6
  94. package/.claude/skills/localization-testing/SKILL.md +0 -6
  95. package/.claude/skills/mobile-testing/SKILL.md +535 -548
  96. package/.claude/skills/mutation-testing/SKILL.md +0 -6
  97. package/.claude/skills/performance-testing/SKILL.md +0 -6
  98. package/.claude/skills/quality-metrics/SKILL.md +0 -12
  99. package/.claude/skills/refactoring-patterns/SKILL.md +0 -6
  100. package/.claude/skills/regression-testing/SKILL.md +1033 -1045
  101. package/.claude/skills/risk-based-testing/SKILL.md +0 -12
  102. package/.claude/skills/security-testing/SKILL.md +0 -6
  103. package/.claude/skills/shift-left-testing/SKILL.md +529 -535
  104. package/.claude/skills/shift-right-testing/SKILL.md +585 -591
  105. package/.claude/skills/tdd-london-chicago/SKILL.md +0 -6
  106. package/.claude/skills/technical-writing/SKILL.md +0 -6
  107. package/.claude/skills/test-automation-strategy/SKILL.md +0 -6
  108. package/.claude/skills/test-data-management/SKILL.md +1054 -1067
  109. package/.claude/skills/test-design-techniques/SKILL.md +0 -6
  110. package/.claude/skills/test-environment-management/SKILL.md +0 -6
  111. package/.claude/skills/test-reporting-analytics/SKILL.md +0 -6
  112. package/.claude/skills/visual-testing-advanced/SKILL.md +0 -6
  113. package/.claude/skills/xp-practices/SKILL.md +0 -6
  114. package/CHANGELOG.md +397 -5
  115. package/README.md +24 -19
  116. package/dist/cli/commands/init.d.ts +4 -0
  117. package/dist/cli/commands/init.d.ts.map +1 -1
  118. package/dist/cli/commands/init.js +97 -44
  119. package/dist/cli/commands/init.js.map +1 -1
  120. package/dist/mcp/handlers/coordination/index.d.ts +14 -14
  121. package/dist/mcp/handlers/coordination/index.d.ts.map +1 -1
  122. package/dist/mcp/handlers/coordination/index.js +14 -14
  123. package/dist/mcp/handlers/coordination/index.js.map +1 -1
  124. package/dist/mcp/handlers/phase2/Phase2Tools.d.ts.map +1 -1
  125. package/dist/mcp/handlers/phase2/Phase2Tools.js +39 -10
  126. package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -1
  127. package/dist/mcp/handlers/phase3/Phase3DomainTools.d.ts +63 -0
  128. package/dist/mcp/handlers/phase3/Phase3DomainTools.d.ts.map +1 -0
  129. package/dist/mcp/handlers/phase3/Phase3DomainTools.js +885 -0
  130. package/dist/mcp/handlers/phase3/Phase3DomainTools.js.map +1 -0
  131. package/dist/mcp/handlers/phase3/index.d.ts +6 -0
  132. package/dist/mcp/handlers/phase3/index.d.ts.map +1 -0
  133. package/dist/mcp/handlers/phase3/index.js +10 -0
  134. package/dist/mcp/handlers/phase3/index.js.map +1 -0
  135. package/dist/mcp/handlers/prediction/index.d.ts +10 -10
  136. package/dist/mcp/handlers/prediction/index.d.ts.map +1 -1
  137. package/dist/mcp/handlers/prediction/index.js +10 -10
  138. package/dist/mcp/handlers/prediction/index.js.map +1 -1
  139. package/dist/mcp/handlers/security/check-authz.d.ts +152 -0
  140. package/dist/mcp/handlers/security/check-authz.d.ts.map +1 -0
  141. package/dist/mcp/handlers/security/check-authz.js +434 -0
  142. package/dist/mcp/handlers/security/check-authz.js.map +1 -0
  143. package/dist/mcp/handlers/security/generate-report.d.ts +156 -0
  144. package/dist/mcp/handlers/security/generate-report.d.ts.map +1 -0
  145. package/dist/mcp/handlers/security/generate-report.js +469 -0
  146. package/dist/mcp/handlers/security/generate-report.js.map +1 -0
  147. package/dist/mcp/handlers/security/index.d.ts +80 -0
  148. package/dist/mcp/handlers/security/index.d.ts.map +1 -0
  149. package/dist/mcp/handlers/security/index.js +91 -0
  150. package/dist/mcp/handlers/security/index.js.map +1 -0
  151. package/dist/mcp/handlers/security/scan-comprehensive.d.ts +66 -0
  152. package/dist/mcp/handlers/security/scan-comprehensive.d.ts.map +1 -0
  153. package/dist/mcp/handlers/security/scan-comprehensive.js +296 -0
  154. package/dist/mcp/handlers/security/scan-comprehensive.js.map +1 -0
  155. package/dist/mcp/handlers/security/scan-dependencies.d.ts +148 -0
  156. package/dist/mcp/handlers/security/scan-dependencies.d.ts.map +1 -0
  157. package/dist/mcp/handlers/security/scan-dependencies.js +354 -0
  158. package/dist/mcp/handlers/security/scan-dependencies.js.map +1 -0
  159. package/dist/mcp/handlers/security/validate-auth.d.ts +128 -0
  160. package/dist/mcp/handlers/security/validate-auth.d.ts.map +1 -0
  161. package/dist/mcp/handlers/security/validate-auth.js +294 -0
  162. package/dist/mcp/handlers/security/validate-auth.js.map +1 -0
  163. package/dist/mcp/handlers/test/generate-integration-tests.d.ts +95 -0
  164. package/dist/mcp/handlers/test/generate-integration-tests.d.ts.map +1 -0
  165. package/dist/mcp/handlers/test/generate-integration-tests.js +286 -0
  166. package/dist/mcp/handlers/test/generate-integration-tests.js.map +1 -0
  167. package/dist/mcp/handlers/test/generate-unit-tests.d.ts +89 -0
  168. package/dist/mcp/handlers/test/generate-unit-tests.d.ts.map +1 -0
  169. package/dist/mcp/handlers/test/generate-unit-tests.js +273 -0
  170. package/dist/mcp/handlers/test/generate-unit-tests.js.map +1 -0
  171. package/dist/mcp/handlers/test/optimize-test-suite.d.ts +97 -0
  172. package/dist/mcp/handlers/test/optimize-test-suite.d.ts.map +1 -0
  173. package/dist/mcp/handlers/test/optimize-test-suite.js +282 -0
  174. package/dist/mcp/handlers/test/optimize-test-suite.js.map +1 -0
  175. package/dist/mcp/server.d.ts.map +1 -1
  176. package/dist/mcp/server.js +211 -0
  177. package/dist/mcp/server.js.map +1 -1
  178. package/dist/mcp/tools/deprecated.d.ts +1390 -0
  179. package/dist/mcp/tools/deprecated.d.ts.map +1 -0
  180. package/dist/mcp/tools/deprecated.js +859 -0
  181. package/dist/mcp/tools/deprecated.js.map +1 -0
  182. package/dist/mcp/tools/qe/api-contract/index.d.ts +138 -0
  183. package/dist/mcp/tools/qe/api-contract/index.d.ts.map +1 -0
  184. package/dist/mcp/tools/qe/api-contract/index.js +572 -0
  185. package/dist/mcp/tools/qe/api-contract/index.js.map +1 -0
  186. package/dist/mcp/tools/qe/code-quality/analyze-complexity.d.ts +110 -0
  187. package/dist/mcp/tools/qe/code-quality/analyze-complexity.d.ts.map +1 -0
  188. package/dist/mcp/tools/qe/code-quality/analyze-complexity.js +381 -0
  189. package/dist/mcp/tools/qe/code-quality/analyze-complexity.js.map +1 -0
  190. package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.d.ts +115 -0
  191. package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.d.ts.map +1 -0
  192. package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.js +461 -0
  193. package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.js.map +1 -0
  194. package/dist/mcp/tools/qe/code-quality/index.d.ts +12 -0
  195. package/dist/mcp/tools/qe/code-quality/index.d.ts.map +1 -0
  196. package/dist/mcp/tools/qe/code-quality/index.js +30 -0
  197. package/dist/mcp/tools/qe/code-quality/index.js.map +1 -0
  198. package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.d.ts +58 -0
  199. package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.d.ts.map +1 -0
  200. package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.js +172 -0
  201. package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.js.map +1 -0
  202. package/dist/mcp/tools/qe/coverage/calculate-trends.d.ts +73 -0
  203. package/dist/mcp/tools/qe/coverage/calculate-trends.d.ts.map +1 -0
  204. package/dist/mcp/tools/qe/coverage/calculate-trends.js +240 -0
  205. package/dist/mcp/tools/qe/coverage/calculate-trends.js.map +1 -0
  206. package/dist/mcp/tools/qe/coverage/detect-gaps-ml.d.ts +38 -0
  207. package/dist/mcp/tools/qe/coverage/detect-gaps-ml.d.ts.map +1 -0
  208. package/dist/mcp/tools/qe/coverage/detect-gaps-ml.js +204 -0
  209. package/dist/mcp/tools/qe/coverage/detect-gaps-ml.js.map +1 -0
  210. package/dist/mcp/tools/qe/coverage/index.d.ts +12 -0
  211. package/dist/mcp/tools/qe/coverage/index.d.ts.map +1 -0
  212. package/dist/mcp/tools/qe/coverage/index.js +23 -0
  213. package/dist/mcp/tools/qe/coverage/index.js.map +1 -0
  214. package/dist/mcp/tools/qe/coverage/recommend-tests.d.ts +46 -0
  215. package/dist/mcp/tools/qe/coverage/recommend-tests.d.ts.map +1 -0
  216. package/dist/mcp/tools/qe/coverage/recommend-tests.js +248 -0
  217. package/dist/mcp/tools/qe/coverage/recommend-tests.js.map +1 -0
  218. package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.d.ts +179 -0
  219. package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.d.ts.map +1 -0
  220. package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.js +554 -0
  221. package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.js.map +1 -0
  222. package/dist/mcp/tools/qe/flaky-detection/detect-statistical.d.ts +172 -0
  223. package/dist/mcp/tools/qe/flaky-detection/detect-statistical.d.ts.map +1 -0
  224. package/dist/mcp/tools/qe/flaky-detection/detect-statistical.js +498 -0
  225. package/dist/mcp/tools/qe/flaky-detection/detect-statistical.js.map +1 -0
  226. package/dist/mcp/tools/qe/flaky-detection/index.d.ts +35 -0
  227. package/dist/mcp/tools/qe/flaky-detection/index.d.ts.map +1 -0
  228. package/dist/mcp/tools/qe/flaky-detection/index.js +66 -0
  229. package/dist/mcp/tools/qe/flaky-detection/index.js.map +1 -0
  230. package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.d.ts +159 -0
  231. package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.d.ts.map +1 -0
  232. package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.js +462 -0
  233. package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.js.map +1 -0
  234. package/dist/mcp/tools/qe/fleet/index.d.ts +422 -0
  235. package/dist/mcp/tools/qe/fleet/index.d.ts.map +1 -0
  236. package/dist/mcp/tools/qe/fleet/index.js +652 -0
  237. package/dist/mcp/tools/qe/fleet/index.js.map +1 -0
  238. package/dist/mcp/tools/qe/performance/analyze-bottlenecks.d.ts +180 -0
  239. package/dist/mcp/tools/qe/performance/analyze-bottlenecks.d.ts.map +1 -0
  240. package/dist/mcp/tools/qe/performance/analyze-bottlenecks.js +347 -0
  241. package/dist/mcp/tools/qe/performance/analyze-bottlenecks.js.map +1 -0
  242. package/dist/mcp/tools/qe/performance/generate-report.d.ts +146 -0
  243. package/dist/mcp/tools/qe/performance/generate-report.d.ts.map +1 -0
  244. package/dist/mcp/tools/qe/performance/generate-report.js +354 -0
  245. package/dist/mcp/tools/qe/performance/generate-report.js.map +1 -0
  246. package/dist/mcp/tools/qe/performance/index.d.ts +13 -0
  247. package/dist/mcp/tools/qe/performance/index.d.ts.map +1 -0
  248. package/dist/mcp/tools/qe/performance/index.js +24 -0
  249. package/dist/mcp/tools/qe/performance/index.js.map +1 -0
  250. package/dist/mcp/tools/qe/performance/monitor-realtime.d.ts +120 -0
  251. package/dist/mcp/tools/qe/performance/monitor-realtime.d.ts.map +1 -0
  252. package/dist/mcp/tools/qe/performance/monitor-realtime.js +215 -0
  253. package/dist/mcp/tools/qe/performance/monitor-realtime.js.map +1 -0
  254. package/dist/mcp/tools/qe/performance/run-benchmark.d.ts +68 -0
  255. package/dist/mcp/tools/qe/performance/run-benchmark.d.ts.map +1 -0
  256. package/dist/mcp/tools/qe/performance/run-benchmark.js +120 -0
  257. package/dist/mcp/tools/qe/performance/run-benchmark.js.map +1 -0
  258. package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.d.ts +239 -0
  259. package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.d.ts.map +1 -0
  260. package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.js +671 -0
  261. package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.js.map +1 -0
  262. package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.d.ts +219 -0
  263. package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.d.ts.map +1 -0
  264. package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.js +732 -0
  265. package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.js.map +1 -0
  266. package/dist/mcp/tools/qe/quality-gates/generate-quality-report.d.ts +447 -0
  267. package/dist/mcp/tools/qe/quality-gates/generate-quality-report.d.ts.map +1 -0
  268. package/dist/mcp/tools/qe/quality-gates/generate-quality-report.js +551 -0
  269. package/dist/mcp/tools/qe/quality-gates/generate-quality-report.js.map +1 -0
  270. package/dist/mcp/tools/qe/quality-gates/index.d.ts +40 -0
  271. package/dist/mcp/tools/qe/quality-gates/index.d.ts.map +1 -0
  272. package/dist/mcp/tools/qe/quality-gates/index.js +56 -0
  273. package/dist/mcp/tools/qe/quality-gates/index.js.map +1 -0
  274. package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.d.ts +226 -0
  275. package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.d.ts.map +1 -0
  276. package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.js +603 -0
  277. package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.js.map +1 -0
  278. package/dist/mcp/tools/qe/regression/analyze-risk.d.ts +212 -0
  279. package/dist/mcp/tools/qe/regression/analyze-risk.d.ts.map +1 -0
  280. package/dist/mcp/tools/qe/regression/analyze-risk.js +617 -0
  281. package/dist/mcp/tools/qe/regression/analyze-risk.js.map +1 -0
  282. package/dist/mcp/tools/qe/regression/index.d.ts +36 -0
  283. package/dist/mcp/tools/qe/regression/index.d.ts.map +1 -0
  284. package/dist/mcp/tools/qe/regression/index.js +63 -0
  285. package/dist/mcp/tools/qe/regression/index.js.map +1 -0
  286. package/dist/mcp/tools/qe/regression/select-tests.d.ts +241 -0
  287. package/dist/mcp/tools/qe/regression/select-tests.d.ts.map +1 -0
  288. package/dist/mcp/tools/qe/regression/select-tests.js +601 -0
  289. package/dist/mcp/tools/qe/regression/select-tests.js.map +1 -0
  290. package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.d.ts +134 -0
  291. package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.d.ts.map +1 -0
  292. package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.js +737 -0
  293. package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.js.map +1 -0
  294. package/dist/mcp/tools/qe/requirements/index.d.ts +40 -0
  295. package/dist/mcp/tools/qe/requirements/index.d.ts.map +1 -0
  296. package/dist/mcp/tools/qe/requirements/index.js +84 -0
  297. package/dist/mcp/tools/qe/requirements/index.js.map +1 -0
  298. package/dist/mcp/tools/qe/requirements/validate-requirements.d.ts +196 -0
  299. package/dist/mcp/tools/qe/requirements/validate-requirements.d.ts.map +1 -0
  300. package/dist/mcp/tools/qe/requirements/validate-requirements.js +740 -0
  301. package/dist/mcp/tools/qe/requirements/validate-requirements.js.map +1 -0
  302. package/dist/mcp/tools/qe/security/detect-vulnerabilities.d.ts +300 -0
  303. package/dist/mcp/tools/qe/security/detect-vulnerabilities.d.ts.map +1 -0
  304. package/dist/mcp/tools/qe/security/detect-vulnerabilities.js +492 -0
  305. package/dist/mcp/tools/qe/security/detect-vulnerabilities.js.map +1 -0
  306. package/dist/mcp/tools/qe/security/index.d.ts +34 -0
  307. package/dist/mcp/tools/qe/security/index.d.ts.map +1 -0
  308. package/dist/mcp/tools/qe/security/index.js +44 -0
  309. package/dist/mcp/tools/qe/security/index.js.map +1 -0
  310. package/dist/mcp/tools/qe/security/scan-comprehensive.d.ts +240 -0
  311. package/dist/mcp/tools/qe/security/scan-comprehensive.d.ts.map +1 -0
  312. package/dist/mcp/tools/qe/security/scan-comprehensive.js +535 -0
  313. package/dist/mcp/tools/qe/security/scan-comprehensive.js.map +1 -0
  314. package/dist/mcp/tools/qe/security/validate-compliance.d.ts +299 -0
  315. package/dist/mcp/tools/qe/security/validate-compliance.d.ts.map +1 -0
  316. package/dist/mcp/tools/qe/security/validate-compliance.js +517 -0
  317. package/dist/mcp/tools/qe/security/validate-compliance.js.map +1 -0
  318. package/dist/mcp/tools/qe/shared/types.d.ts +840 -0
  319. package/dist/mcp/tools/qe/shared/types.d.ts.map +1 -0
  320. package/dist/mcp/tools/qe/shared/types.js +13 -0
  321. package/dist/mcp/tools/qe/shared/types.js.map +1 -0
  322. package/dist/mcp/tools/qe/test-data/analyze-schema.d.ts +264 -0
  323. package/dist/mcp/tools/qe/test-data/analyze-schema.d.ts.map +1 -0
  324. package/dist/mcp/tools/qe/test-data/analyze-schema.js +553 -0
  325. package/dist/mcp/tools/qe/test-data/analyze-schema.js.map +1 -0
  326. package/dist/mcp/tools/qe/test-data/generate-test-data.d.ts +167 -0
  327. package/dist/mcp/tools/qe/test-data/generate-test-data.d.ts.map +1 -0
  328. package/dist/mcp/tools/qe/test-data/generate-test-data.js +336 -0
  329. package/dist/mcp/tools/qe/test-data/generate-test-data.js.map +1 -0
  330. package/dist/mcp/tools/qe/test-data/index.d.ts +44 -0
  331. package/dist/mcp/tools/qe/test-data/index.d.ts.map +1 -0
  332. package/dist/mcp/tools/qe/test-data/index.js +90 -0
  333. package/dist/mcp/tools/qe/test-data/index.js.map +1 -0
  334. package/dist/mcp/tools/qe/test-data/mask-sensitive-data.d.ts +165 -0
  335. package/dist/mcp/tools/qe/test-data/mask-sensitive-data.d.ts.map +1 -0
  336. package/dist/mcp/tools/qe/test-data/mask-sensitive-data.js +342 -0
  337. package/dist/mcp/tools/qe/test-data/mask-sensitive-data.js.map +1 -0
  338. package/dist/mcp/tools/qe/test-generation/analyze-test-quality.d.ts +144 -0
  339. package/dist/mcp/tools/qe/test-generation/analyze-test-quality.d.ts.map +1 -0
  340. package/dist/mcp/tools/qe/test-generation/analyze-test-quality.js +432 -0
  341. package/dist/mcp/tools/qe/test-generation/analyze-test-quality.js.map +1 -0
  342. package/dist/mcp/tools/qe/test-generation/generate-integration-tests.d.ts +98 -0
  343. package/dist/mcp/tools/qe/test-generation/generate-integration-tests.d.ts.map +1 -0
  344. package/dist/mcp/tools/qe/test-generation/generate-integration-tests.js +459 -0
  345. package/dist/mcp/tools/qe/test-generation/generate-integration-tests.js.map +1 -0
  346. package/dist/mcp/tools/qe/test-generation/generate-unit-tests.d.ts +83 -0
  347. package/dist/mcp/tools/qe/test-generation/generate-unit-tests.d.ts.map +1 -0
  348. package/dist/mcp/tools/qe/test-generation/generate-unit-tests.js +483 -0
  349. package/dist/mcp/tools/qe/test-generation/generate-unit-tests.js.map +1 -0
  350. package/dist/mcp/tools/qe/test-generation/index.d.ts +56 -0
  351. package/dist/mcp/tools/qe/test-generation/index.d.ts.map +1 -0
  352. package/dist/mcp/tools/qe/test-generation/index.js +97 -0
  353. package/dist/mcp/tools/qe/test-generation/index.js.map +1 -0
  354. package/dist/mcp/tools/qe/test-generation/optimize-test-suite.d.ts +124 -0
  355. package/dist/mcp/tools/qe/test-generation/optimize-test-suite.d.ts.map +1 -0
  356. package/dist/mcp/tools/qe/test-generation/optimize-test-suite.js +362 -0
  357. package/dist/mcp/tools/qe/test-generation/optimize-test-suite.js.map +1 -0
  358. package/dist/mcp/tools/qe/visual/compare-screenshots.d.ts +119 -0
  359. package/dist/mcp/tools/qe/visual/compare-screenshots.d.ts.map +1 -0
  360. package/dist/mcp/tools/qe/visual/compare-screenshots.js +280 -0
  361. package/dist/mcp/tools/qe/visual/compare-screenshots.js.map +1 -0
  362. package/dist/mcp/tools/qe/visual/detect-regression.d.ts +138 -0
  363. package/dist/mcp/tools/qe/visual/detect-regression.d.ts.map +1 -0
  364. package/dist/mcp/tools/qe/visual/detect-regression.js +271 -0
  365. package/dist/mcp/tools/qe/visual/detect-regression.js.map +1 -0
  366. package/dist/mcp/tools/qe/visual/index.d.ts +16 -0
  367. package/dist/mcp/tools/qe/visual/index.d.ts.map +1 -0
  368. package/dist/mcp/tools/qe/visual/index.js +22 -0
  369. package/dist/mcp/tools/qe/visual/index.js.map +1 -0
  370. package/dist/mcp/tools/qe/visual/validate-accessibility.d.ts +276 -0
  371. package/dist/mcp/tools/qe/visual/validate-accessibility.d.ts.map +1 -0
  372. package/dist/mcp/tools/qe/visual/validate-accessibility.js +413 -0
  373. package/dist/mcp/tools/qe/visual/validate-accessibility.js.map +1 -0
  374. package/dist/mcp/tools.d.ts +44 -0
  375. package/dist/mcp/tools.d.ts.map +1 -1
  376. package/dist/mcp/tools.js +1980 -1
  377. package/dist/mcp/tools.js.map +1 -1
  378. package/package.json +2 -2
  379. package/dist/learning/__mocks__/LearningEngine.d.ts +0 -39
  380. package/dist/learning/__mocks__/LearningEngine.d.ts.map +0 -1
  381. package/dist/learning/__mocks__/LearningEngine.js +0 -116
  382. package/dist/learning/__mocks__/LearningEngine.js.map +0 -1
  383. package/dist/utils/__mocks__/Database.d.ts +0 -85
  384. package/dist/utils/__mocks__/Database.d.ts.map +0 -1
  385. package/dist/utils/__mocks__/Database.js +0 -125
  386. package/dist/utils/__mocks__/Database.js.map +0 -1
  387. package/dist/utils/__mocks__/Logger.d.ts +0 -26
  388. package/dist/utils/__mocks__/Logger.d.ts.map +0 -1
  389. package/dist/utils/__mocks__/Logger.js +0 -44
  390. package/dist/utils/__mocks__/Logger.js.map +0 -1
@@ -1,1067 +1,1054 @@
1
- ---
2
- name: test-data-management
3
- description: Strategic test data generation, management, and privacy compliance. Use when creating test data, handling PII, ensuring GDPR/CCPA compliance, or scaling data generation for realistic testing scenarios.
4
- version: 1.0.0
5
- category: testing-infrastructure
6
- tags:
7
- - test-data
8
- - data-generation
9
- - data-privacy
10
- - gdpr-compliance
11
- - synthetic-data
12
- - data-masking
13
- - test-fixtures
14
- difficulty: intermediate
15
- estimated_time: 60-90 minutes
16
- author: agentic-qe
17
- ---
18
-
19
- # Test Data Management
20
-
21
- ## Core Principle
22
-
23
- **Test data is the fuel for testing. Poor data = poor tests.**
24
-
25
- 78% of QE teams cite test data as their #1 bottleneck. Good test data management enables fast, reliable, compliant testing at scale.
26
-
27
- ## What is Test Data Management?
28
-
29
- **Test Data Management:** Strategic creation, maintenance, and lifecycle management of data needed for testing, while ensuring privacy compliance and realistic scenarios.
30
-
31
- **Why Critical:**
32
- - 40% of test failures caused by inadequate test data
33
- - GDPR/CCPA fines up to $20M or 4% of revenue
34
- - Production data contains PII (illegal to use directly)
35
- - AI/ML systems need massive, diverse datasets
36
- - Manual data creation doesn't scale
37
-
38
- **Goal:** Fast, realistic, compliant, scalable test data generation.
39
-
40
- ## Test Data Strategies
41
-
42
- ### Strategy 1: Minimal vs Realistic Data
43
-
44
- **Minimal Data (Fast Tests)**
45
- ```javascript
46
- // Just enough to test logic
47
- const user = {
48
- id: 1,
49
- email: 'test@example.com',
50
- role: 'customer'
51
- };
52
-
53
- // Benefits:
54
- // - Fast test execution
55
- // - Easy to understand
56
- // - Deterministic
57
- // - No cleanup needed
58
-
59
- // Use when:
60
- // - Unit tests
61
- // - Logic validation
62
- // - Fast feedback needed
63
- ```
64
-
65
- **Realistic Data (Production-Like)**
66
- ```javascript
67
- // Production-like complexity
68
- const user = {
69
- id: '7f3a9c2e-4b1d-4e8a-9f2c-6d5e8a1b3c4d',
70
- email: 'sarah.johnson@techcorp.com',
71
- firstName: 'Sarah',
72
- lastName: 'Johnson',
73
- phone: '+1-555-0123',
74
- address: {
75
- street: '742 Evergreen Terrace',
76
- city: 'Springfield',
77
- state: 'IL',
78
- zip: '62701',
79
- country: 'US'
80
- },
81
- preferences: {
82
- newsletter: true,
83
- language: 'en-US',
84
- timezone: 'America/Chicago'
85
- },
86
- createdAt: '2025-01-15T10:30:00Z',
87
- lastLogin: '2025-10-24T14:22:15Z'
88
- };
89
-
90
- // Benefits:
91
- // - Catches edge cases
92
- // - Tests real-world scenarios
93
- // - Validates integrations
94
- // - Performance realistic
95
-
96
- // Use when:
97
- // - Integration tests
98
- // - E2E tests
99
- // - Performance tests
100
- // - Production validation
101
- ```
102
-
103
- **Hybrid Approach (Best Practice)**
104
- ```javascript
105
- // Minimal for fast tests, realistic for critical paths
106
- describe('User Service', () => {
107
- // Unit test: minimal data
108
- test('validates email format', () => {
109
- expect(validateEmail('test@example.com')).toBe(true);
110
- });
111
-
112
- // Integration test: realistic data
113
- test('creates user with full profile', async () => {
114
- const user = generateRealisticUser(); // Full data
115
- const result = await userService.create(user);
116
- expect(result.profile.address.country).toBe('US');
117
- });
118
- });
119
- ```
120
-
121
- ---
122
-
123
- ### Strategy 2: Shared vs Isolated Data
124
-
125
- **Shared Data (Read-Only)**
126
- ```javascript
127
- // Seed database once, many tests use it
128
- beforeAll(async () => {
129
- await db.seed({
130
- users: [
131
- { id: 1, email: 'admin@example.com', role: 'admin' },
132
- { id: 2, email: 'user@example.com', role: 'customer' }
133
- ],
134
- products: [
135
- { id: 1, name: 'Widget', price: 9.99 },
136
- { id: 2, name: 'Gadget', price: 19.99 }
137
- ]
138
- });
139
- });
140
-
141
- // Tests can read but not modify
142
- test('admin can list all products', async () => {
143
- const admin = await db.users.find({ id: 1 });
144
- const products = await productService.list(admin);
145
- expect(products.length).toBeGreaterThan(0);
146
- });
147
-
148
- // Benefits:
149
- // - Fast (no setup per test)
150
- // - Can run tests in parallel
151
- // - Low resource usage
152
-
153
- // Risks:
154
- // - Tests must not modify data
155
- // - Harder to debug (shared state)
156
- ```
157
-
158
- **Isolated Data (Per-Test)**
159
- ```javascript
160
- // Each test gets its own data
161
- test('user can update profile', async () => {
162
- // Generate unique data for this test
163
- const user = await createTestUser({
164
- email: `test-${Date.now()}@example.com`
165
- });
166
-
167
- await userService.updateProfile(user.id, { firstName: 'Updated' });
168
-
169
- const updated = await db.users.find({ id: user.id });
170
- expect(updated.firstName).toBe('Updated');
171
-
172
- // Cleanup
173
- await db.users.delete({ id: user.id });
174
- });
175
-
176
- // Benefits:
177
- // - Tests independent
178
- // - Can modify data freely
179
- // - Easy to debug
180
- // - No test pollution
181
-
182
- // Costs:
183
- // - Slower (setup per test)
184
- // - More resource usage
185
- // - Cleanup needed
186
- ```
187
-
188
- **Database Transactions (Best of Both)**
189
- ```javascript
190
- // Use transactions for isolation without cleanup
191
- beforeEach(async () => {
192
- await db.beginTransaction();
193
- });
194
-
195
- afterEach(async () => {
196
- await db.rollbackTransaction(); // Auto cleanup!
197
- });
198
-
199
- test('user registration', async () => {
200
- // Data exists only in this transaction
201
- const user = await userService.register({
202
- email: 'test@example.com'
203
- });
204
-
205
- expect(user.id).toBeDefined();
206
- // Automatic rollback after test
207
- });
208
-
209
- // Benefits:
210
- // - Isolated (transaction boundary)
211
- // - Fast (no manual cleanup)
212
- // - Reliable (guaranteed cleanup)
213
- ```
214
-
215
- ---
216
-
217
- ### Strategy 3: Production Data vs Synthetic Data
218
-
219
- **❌ Production Data (DANGER!)**
220
- ```javascript
221
- // NEVER do this:
222
- const prodDb = connectTo('production://...');
223
- const users = await prodDb.users.findAll(); // ⚠️ PII exposure!
224
-
225
- // Problems:
226
- // - Contains real PII (GDPR/CCPA violation)
227
- // - Can modify production data accidentally
228
- // - Performance impact on prod
229
- // - Security risk
230
- // - Legal liability
231
- ```
232
-
233
- **✅ Anonymized Production Data**
234
- ```javascript
235
- // Mask/anonymize production data
236
- const anonymizedUsers = prodUsers.map(user => ({
237
- id: user.id, // Keep ID for relationships
238
- email: `user-${user.id}@example.com`, // Fake email
239
- firstName: faker.name.firstName(), // Generated name
240
- lastName: faker.name.lastName(),
241
- phone: null, // Remove PII
242
- address: {
243
- city: user.address.city, // Keep non-PII
244
- state: user.address.state,
245
- zip: user.address.zip.substring(0, 3) + 'XX', // Partial zip
246
- street: '***REDACTED***'
247
- },
248
- createdAt: user.createdAt // Keep timestamps
249
- }));
250
-
251
- // Benefits:
252
- // - Realistic data patterns
253
- // - Compliant with privacy laws
254
- // - Safe for testing
255
- ```
256
-
257
- **✅ Synthetic Data (Best Practice)**
258
- ```javascript
259
- import { faker } from '@faker-js/faker';
260
-
261
- // Generate realistic but fake data
262
- function generateUser() {
263
- return {
264
- id: faker.string.uuid(),
265
- email: faker.internet.email(),
266
- firstName: faker.person.firstName(),
267
- lastName: faker.person.lastName(),
268
- phone: faker.phone.number(),
269
- address: {
270
- street: faker.location.streetAddress(),
271
- city: faker.location.city(),
272
- state: faker.location.state({ abbreviated: true }),
273
- zip: faker.location.zipCode(),
274
- country: 'US'
275
- },
276
- age: faker.number.int({ min: 18, max: 90 }),
277
- createdAt: faker.date.past()
278
- };
279
- }
280
-
281
- // Benefits:
282
- // - No PII (privacy compliant)
283
- // - Unlimited volume
284
- // - Controlled characteristics
285
- // - Repeatable with seeds
286
- ```
287
-
288
- ---
289
-
290
- ## Data Generation Techniques
291
-
292
- ### Technique 1: Faker Libraries
293
-
294
- **Basic Usage**
295
- ```javascript
296
- import { faker } from '@faker-js/faker';
297
-
298
- // Seed for reproducibility
299
- faker.seed(123);
300
-
301
- // Generate various data types
302
- const testData = {
303
- // Personal
304
- name: faker.person.fullName(),
305
- email: faker.internet.email(),
306
- avatar: faker.image.avatar(),
307
- bio: faker.person.bio(),
308
-
309
- // Location
310
- address: faker.location.streetAddress(),
311
- city: faker.location.city(),
312
- country: faker.location.country(),
313
- coordinates: faker.location.nearbyGPSCoordinate(),
314
-
315
- // Financial
316
- accountNumber: faker.finance.accountNumber(),
317
- amount: faker.finance.amount(),
318
- currency: faker.finance.currencyCode(),
319
- iban: faker.finance.iban(),
320
-
321
- // Commerce
322
- product: faker.commerce.productName(),
323
- price: faker.commerce.price(),
324
- department: faker.commerce.department(),
325
-
326
- // Internet
327
- username: faker.internet.userName(),
328
- password: faker.internet.password(),
329
- url: faker.internet.url(),
330
- ipv4: faker.internet.ipv4(),
331
-
332
- // Date/Time
333
- pastDate: faker.date.past(),
334
- futureDate: faker.date.future(),
335
- recentDate: faker.date.recent(),
336
-
337
- // Random
338
- uuid: faker.string.uuid(),
339
- alphanumeric: faker.string.alphanumeric(10),
340
- hexadecimal: faker.string.hexadecimal(16)
341
- };
342
- ```
343
-
344
- **Schema-Based Generation**
345
- ```typescript
346
- interface User {
347
- id: string;
348
- email: string;
349
- profile: {
350
- firstName: string;
351
- lastName: string;
352
- age: number;
353
- };
354
- roles: string[];
355
- }
356
-
357
- function generateUsers(count: number): User[] {
358
- return Array.from({ length: count }, () => ({
359
- id: faker.string.uuid(),
360
- email: faker.internet.email(),
361
- profile: {
362
- firstName: faker.person.firstName(),
363
- lastName: faker.person.lastName(),
364
- age: faker.number.int({ min: 18, max: 90 })
365
- },
366
- roles: faker.helpers.arrayElements(['user', 'admin', 'moderator'])
367
- }));
368
- }
369
-
370
- // Generate 1000 users
371
- const users = generateUsers(1000);
372
- ```
373
-
374
- ---
375
-
376
- ### Technique 2: Test Data Builders
377
-
378
- **Builder Pattern**
379
- ```typescript
380
- class UserBuilder {
381
- private user: Partial<User> = {};
382
-
383
- withId(id: string) {
384
- this.user.id = id;
385
- return this;
386
- }
387
-
388
- withEmail(email: string) {
389
- this.user.email = email;
390
- return this;
391
- }
392
-
393
- withRole(role: string) {
394
- this.user.role = role;
395
- return this;
396
- }
397
-
398
- asAdmin() {
399
- this.user.role = 'admin';
400
- this.user.permissions = ['read', 'write', 'delete'];
401
- return this;
402
- }
403
-
404
- asCustomer() {
405
- this.user.role = 'customer';
406
- this.user.permissions = ['read'];
407
- return this;
408
- }
409
-
410
- build(): User {
411
- // Fill in defaults for missing fields
412
- return {
413
- id: this.user.id ?? faker.string.uuid(),
414
- email: this.user.email ?? faker.internet.email(),
415
- role: this.user.role ?? 'customer',
416
- permissions: this.user.permissions ?? ['read'],
417
- createdAt: new Date()
418
- } as User;
419
- }
420
- }
421
-
422
- // Usage
423
- const admin = new UserBuilder()
424
- .asAdmin()
425
- .withEmail('admin@example.com')
426
- .build();
427
-
428
- const customer = new UserBuilder()
429
- .asCustomer()
430
- .build();
431
-
432
- // Flexible, readable, maintainable
433
- ```
434
-
435
- ---
436
-
437
- ### Technique 3: Fixtures and Factories
438
-
439
- **Fixture Files**
440
- ```javascript
441
- // fixtures/users.js
442
- export const fixtures = {
443
- adminUser: {
444
- id: 1,
445
- email: 'admin@example.com',
446
- role: 'admin',
447
- verified: true
448
- },
449
-
450
- regularUser: {
451
- id: 2,
452
- email: 'user@example.com',
453
- role: 'customer',
454
- verified: true
455
- },
456
-
457
- unverifiedUser: {
458
- id: 3,
459
- email: 'unverified@example.com',
460
- role: 'customer',
461
- verified: false
462
- }
463
- };
464
-
465
- // Use in tests
466
- import { fixtures } from './fixtures/users';
467
-
468
- test('admin can delete users', async () => {
469
- const admin = await createUser(fixtures.adminUser);
470
- const user = await createUser(fixtures.regularUser);
471
-
472
- await userService.delete(admin, user.id);
473
- expect(await db.users.find(user.id)).toBeNull();
474
- });
475
- ```
476
-
477
- **Factory Functions**
478
- ```javascript
479
- // factories/userFactory.js
480
- export function createUser(overrides = {}) {
481
- const defaults = {
482
- id: faker.string.uuid(),
483
- email: faker.internet.email(),
484
- firstName: faker.person.firstName(),
485
- lastName: faker.person.lastName(),
486
- role: 'customer',
487
- verified: true,
488
- createdAt: new Date()
489
- };
490
-
491
- return { ...defaults, ...overrides };
492
- }
493
-
494
- export function createAdmin(overrides = {}) {
495
- return createUser({
496
- role: 'admin',
497
- permissions: ['read', 'write', 'delete'],
498
- ...overrides
499
- });
500
- }
501
-
502
- // Use in tests
503
- test('admin dashboard', async () => {
504
- const admin = createAdmin({ email: 'specific@example.com' });
505
- // Test with admin user
506
- });
507
- ```
508
-
509
- ---
510
-
511
- ## Data Privacy & Compliance
512
-
513
- ### GDPR/CCPA Requirements
514
-
515
- **What You Must Do:**
516
- 1. **Minimize PII Collection**
517
- - Only collect necessary data for testing
518
- - Use synthetic data instead of production data
519
- - Delete test data after use
520
-
521
- 2. **Secure Storage**
522
- - Encrypt sensitive test data
523
- - Access controls on test databases
524
- - Separate test from production
525
-
526
- 3. **Data Anonymization**
527
- - Mask/pseudonymize production data if used
528
- - Remove direct identifiers
529
- - K-anonymity for aggregate data
530
-
531
- 4. **Right to Erasure**
532
- - Easy deletion of test accounts
533
- - Automated cleanup processes
534
- - Audit trail of deletions
535
-
536
- **Anonymization Techniques**
537
- ```javascript
538
- // Data masking
539
- function maskEmail(email) {
540
- const [user, domain] = email.split('@');
541
- return `${user[0]}***@${domain}`;
542
- }
543
-
544
- function maskPhone(phone) {
545
- return phone.replace(/\d(?=\d{4})/g, '*');
546
- }
547
-
548
- function maskCreditCard(cc) {
549
- return `****-****-****-${cc.slice(-4)}`;
550
- }
551
-
552
- // Pseudonymization (reversible with key)
553
- const crypto = require('crypto');
554
-
555
- function pseudonymize(value, key) {
556
- const cipher = crypto.createCipher('aes-256-cbc', key);
557
- return cipher.update(value, 'utf8', 'hex') + cipher.final('hex');
558
- }
559
-
560
- function depseudonymize(encrypted, key) {
561
- const decipher = crypto.createDecipher('aes-256-cbc', key);
562
- return decipher.update(encrypted, 'hex', 'utf8') + decipher.final('utf8');
563
- }
564
-
565
- // Use in tests
566
- const user = {
567
- realEmail: 'john@example.com',
568
- maskedEmail: maskEmail('john@example.com'), // 'j***@example.com'
569
- pseudoEmail: pseudonymize('john@example.com', SECRET_KEY)
570
- };
571
- ```
572
-
573
- **Data Retention Policies**
574
- ```javascript
575
- // Auto-delete old test data
576
- async function cleanupOldTestData() {
577
- const thirtyDaysAgo = new Date();
578
- thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
579
-
580
- // Delete test users older than 30 days
581
- await db.users.deleteMany({
582
- email: { $regex: /@example\.com$/ }, // Test emails
583
- createdAt: { $lt: thirtyDaysAgo }
584
- });
585
-
586
- console.log('Cleaned up old test data');
587
- }
588
-
589
- // Run daily
590
- schedule.scheduleJob('0 2 * * *', cleanupOldTestData);
591
- ```
592
-
593
- ---
594
-
595
- ## Test Data Lifecycle
596
-
597
- ### Phase 1: Setup/Seeding
598
-
599
- **Database Seeding**
600
- ```javascript
601
- // seed.js
602
- const seedData = {
603
- users: [
604
- { id: 1, email: 'admin@example.com', role: 'admin' },
605
- { id: 2, email: 'user@example.com', role: 'customer' }
606
- ],
607
- products: [
608
- { id: 1, name: 'Widget', price: 9.99, inStock: true },
609
- { id: 2, name: 'Gadget', price: 19.99, inStock: true }
610
- ]
611
- };
612
-
613
- async function seedDatabase() {
614
- await db.users.insertMany(seedData.users);
615
- await db.products.insertMany(seedData.products);
616
- console.log('Database seeded');
617
- }
618
-
619
- // Run before tests
620
- beforeAll(async () => {
621
- await seedDatabase();
622
- });
623
- ```
624
-
625
- ---
626
-
627
- ### Phase 2: Test Execution
628
-
629
- **Data Isolation During Tests**
630
- ```javascript
631
- describe('Order Service', () => {
632
- let testUser;
633
- let testProduct;
634
-
635
- beforeEach(async () => {
636
- // Create fresh data per test
637
- testUser = await createTestUser();
638
- testProduct = await createTestProduct();
639
- });
640
-
641
- afterEach(async () => {
642
- // Cleanup after test
643
- await deleteTestUser(testUser.id);
644
- await deleteTestProduct(testProduct.id);
645
- });
646
-
647
- test('user can place order', async () => {
648
- const order = await orderService.create({
649
- userId: testUser.id,
650
- productId: testProduct.id,
651
- quantity: 1
652
- });
653
-
654
- expect(order.total).toBe(testProduct.price);
655
- });
656
- });
657
- ```
658
-
659
- ---
660
-
661
- ### Phase 3: Cleanup/Reset
662
-
663
- **Transaction-Based Cleanup**
664
- ```javascript
665
- // Best practice: use transactions
666
- beforeEach(async () => {
667
- await db.beginTransaction();
668
- });
669
-
670
- afterEach(async () => {
671
- await db.rollbackTransaction(); // Auto cleanup
672
- });
673
- ```
674
-
675
- **Manual Cleanup**
676
- ```javascript
677
- // Track created entities
678
- const createdIds = {
679
- users: [],
680
- orders: [],
681
- products: []
682
- };
683
-
684
- afterEach(async () => {
685
- // Delete in reverse order (handle foreign keys)
686
- await db.orders.deleteMany({ id: { $in: createdIds.orders } });
687
- await db.products.deleteMany({ id: { $in: createdIds.products } });
688
- await db.users.deleteMany({ id: { $in: createdIds.users } });
689
-
690
- // Reset tracking
691
- createdIds.users = [];
692
- createdIds.orders = [];
693
- createdIds.products = [];
694
- });
695
- ```
696
-
697
- ---
698
-
699
- ## Advanced Patterns
700
-
701
- ### Pattern 1: Relational Data Generation
702
-
703
- **Generate Related Entities**
704
- ```javascript
705
- async function generateOrderWithRelations() {
706
- // Create user
707
- const user = await db.users.create({
708
- email: faker.internet.email(),
709
- firstName: faker.person.firstName()
710
- });
711
-
712
- // Create products
713
- const products = await Promise.all([
714
- db.products.create({
715
- name: faker.commerce.productName(),
716
- price: faker.commerce.price()
717
- }),
718
- db.products.create({
719
- name: faker.commerce.productName(),
720
- price: faker.commerce.price()
721
- })
722
- ]);
723
-
724
- // Create order with line items
725
- const order = await db.orders.create({
726
- userId: user.id,
727
- status: 'pending',
728
- lineItems: products.map(p => ({
729
- productId: p.id,
730
- quantity: faker.number.int({ min: 1, max: 5 }),
731
- price: p.price
732
- }))
733
- });
734
-
735
- return { user, products, order };
736
- }
737
-
738
- // Use in test
739
- test('order total calculation', async () => {
740
- const { order } = await generateOrderWithRelations();
741
- expect(order.total).toBeGreaterThan(0);
742
- });
743
- ```
744
-
745
- ---
746
-
747
- ### Pattern 2: Edge Case Data
748
-
749
- **Generate Boundary Values**
750
- ```javascript
751
- function generateEdgeCaseUsers() {
752
- return [
753
- // Minimum values
754
- {
755
- email: 'a@b.c', // Shortest valid email
756
- age: 18, // Minimum age
757
- name: 'A' // Single character
758
- },
759
-
760
- // Maximum values
761
- {
762
- email: 'a'.repeat(64) + '@' + 'b'.repeat(255), // Max length
763
- age: 120,
764
- name: 'A'.repeat(255)
765
- },
766
-
767
- // Special characters
768
- {
769
- email: "test+tag@example.com",
770
- name: "O'Brien",
771
- bio: "Test <script>alert('xss')</script>"
772
- },
773
-
774
- // Unicode
775
- {
776
- email: 'user@例え.jp',
777
- name: '山田太郎',
778
- city: '北京'
779
- },
780
-
781
- // Empty/null
782
- {
783
- email: 'empty@example.com',
784
- middleName: null,
785
- phone: ''
786
- }
787
- ];
788
- }
789
- ```
790
-
791
- ---
792
-
793
- ### Pattern 3: Volume Data Generation
794
-
795
- **Generate Large Datasets**
796
- ```javascript
797
- // Generate 10,000 users efficiently
798
- async function generateLargeUserDataset(count = 10000) {
799
- const batchSize = 1000;
800
- const batches = Math.ceil(count / batchSize);
801
-
802
- for (let i = 0; i < batches; i++) {
803
- const users = Array.from({ length: batchSize }, (_, index) => ({
804
- id: i * batchSize + index,
805
- email: `user${i * batchSize + index}@example.com`,
806
- firstName: faker.person.firstName(),
807
- lastName: faker.person.lastName(),
808
- createdAt: faker.date.past()
809
- }));
810
-
811
- // Batch insert for performance
812
- await db.users.insertMany(users);
813
-
814
- console.log(`Inserted batch ${i + 1}/${batches}`);
815
- }
816
- }
817
-
818
- // Performance test with realistic volume
819
- test('search performs well with 10k users', async () => {
820
- await generateLargeUserDataset(10000);
821
-
822
- const start = Date.now();
823
- const results = await userService.search('John');
824
- const duration = Date.now() - start;
825
-
826
- expect(duration).toBeLessThan(100); // < 100ms
827
- });
828
- ```
829
-
830
- ---
831
-
832
- ## Using with QE Agents
833
-
834
- ### qe-test-data-architect: High-Speed Generation
835
-
836
- **Generate 10k+ Records per Second**
837
- ```typescript
838
- // Agent generates realistic, schema-aware data
839
- const testData = await agent.generateTestData({
840
- schema: 'users',
841
- count: 10000,
842
- realistic: true,
843
- constraints: {
844
- age: { min: 18, max: 90 },
845
- roles: ['customer', 'admin', 'moderator'],
846
- emailDomain: 'example.com'
847
- }
848
- });
849
-
850
- // Returns 10,000 fully populated user records
851
- // With relationships, constraints, realistic patterns
852
- ```
853
-
854
- **Edge Case Discovery**
855
- ```typescript
856
- // Agent auto-discovers edge cases
857
- const edgeCases = await agent.generateEdgeCases({
858
- field: 'email',
859
- patterns: [
860
- 'special-chars',
861
- 'unicode',
862
- 'max-length',
863
- 'min-length',
864
- 'sql-injection',
865
- 'xss-attempts'
866
- ]
867
- });
868
-
869
- // Returns comprehensive edge case dataset
870
- // 50+ edge cases for email field
871
- ```
872
-
873
- **GDPR-Compliant Data**
874
- ```typescript
875
- // Agent ensures privacy compliance
876
- const anonymizedData = await agent.anonymizeProductionData({
877
- source: productionSnapshot,
878
- piiFields: ['email', 'phone', 'ssn', 'address'],
879
- method: 'pseudonymization',
880
- retainStructure: true
881
- });
882
-
883
- // Returns anonymized data maintaining referential integrity
884
- ```
885
-
886
- ---
887
-
888
- ### Fleet Coordination for Complex Data Graphs
889
-
890
- ```typescript
891
- // Multiple agents coordinate for complex data
892
- const dataFleet = await FleetManager.coordinate({
893
- strategy: 'test-data-generation',
894
- agents: [
895
- 'qe-test-data-architect', // Generate base data
896
- 'qe-test-generator', // Generate tests using data
897
- 'qe-test-executor' // Execute with generated data
898
- ],
899
- topology: 'sequential'
900
- });
901
-
902
- await dataFleet.execute({
903
- scenario: 'e-commerce-checkout',
904
- volume: {
905
- users: 1000,
906
- products: 500,
907
- orders: 5000
908
- },
909
- relationships: true,
910
- realistic: true
911
- });
912
-
913
- // Generates full data graph:
914
- // - 1000 users with profiles
915
- // - 500 products with inventory
916
- // - 5000 orders with line items
917
- // - All relationships maintained
918
- // - Tests generated and executed
919
- ```
920
-
921
- ---
922
-
923
- ## Tools & Libraries
924
-
925
- ### Data Generation
926
- - **@faker-js/faker** - Comprehensive fake data generation
927
- - **Mockaroo** - Online data generator (CSV, JSON, SQL)
928
- - **Chance.js** - Random data generation
929
- - **Casual** - Minimalist fake data
930
- - **JSON Schema Faker** - Generate from JSON schemas
931
-
932
- ### Database Tools
933
- - **Factory Bot** (Ruby) - Test data factories
934
- - **FactoryGuy** (JavaScript) - Ember.js factories
935
- - **Fishery** (TypeScript) - Type-safe factories
936
- - **Knex.js** - SQL query builder with seeding
937
- - **Prisma** - ORM with seeding support
938
-
939
- ### Privacy Tools
940
- - **ARX Data Anonymization Tool** - GDPR compliance
941
- - **sdv (Synthetic Data Vault)** - AI-generated synthetic data
942
- - **Presidio** - PII detection and anonymization
943
- - **Faker** - Built-in data masking
944
-
945
- ---
946
-
947
- ## Common Pitfalls
948
-
949
- ### Using Production Data Directly
950
- ```javascript
951
- // NEVER do this
952
- const prodUsers = await prodDb.query('SELECT * FROM users');
953
- await testDb.insertMany(prodUsers); // ⚠️ PII violation
954
- ```
955
-
956
- **Fix:** Anonymize first or use synthetic data
957
-
958
- ### ❌ Not Cleaning Up Test Data
959
- ```javascript
960
- // Creates 100 users per test, never deleted
961
- test('many tests', async () => {
962
- const users = await generateUsers(100);
963
- // ... test code
964
- // No cleanup! Database fills up
965
- });
966
- ```
967
-
968
- **Fix:** Use transactions or cleanup hooks
969
-
970
- ### Hard-Coded IDs
971
- ```javascript
972
- // Breaks when run in parallel or multiple times
973
- const user = await createUser({ id: 1 }); // ⚠️ Collision risk
974
- ```
975
-
976
- **Fix:** Use generated UUIDs or auto-increment
977
-
978
- ### ❌ Shared Mutable Data
979
- ```javascript
980
- // Tests pollute shared data
981
- const sharedUser = createUser();
982
-
983
- test('update email', () => {
984
- sharedUser.email = 'new@example.com'; // Affects other tests!
985
- });
986
- ```
987
-
988
- **Fix:** Create fresh data per test
989
-
990
- ---
991
-
992
- ## Best Practices Checklist
993
-
994
- **Data Generation:**
995
- - [ ] Use faker or similar library for realistic data
996
- - [ ] Generate data with proper constraints
997
- - [ ] Create both minimal and realistic datasets
998
- - [ ] Include edge cases and boundary values
999
- - [ ] Use builders/factories for complex entities
1000
-
1001
- **Privacy & Compliance:**
1002
- - [ ] Never use production PII directly
1003
- - [ ] Anonymize/pseudonymize production data snapshots
1004
- - [ ] Use synthetic data as default
1005
- - [ ] Implement data retention policies
1006
- - [ ] Document data handling procedures
1007
-
1008
- **Performance:**
1009
- - [ ] Batch insert for large datasets
1010
- - [ ] Use database transactions for isolation
1011
- - [ ] Generate data lazily when possible
1012
- - [ ] Cache commonly used fixtures
1013
- - [ ] Clean up data after tests
1014
-
1015
- **Maintainability:**
1016
- - [ ] Centralize test data generation
1017
- - [ ] Version control seed data
1018
- - [ ] Document data schemas
1019
- - [ ] Use type-safe factories (TypeScript)
1020
- - [ ] Keep data generation DRY
1021
-
1022
- ---
1023
-
1024
- ## Related Skills
1025
-
1026
- **Testing Infrastructure:**
1027
- - [test-automation-strategy](../test-automation-strategy/) - Automation includes data setup
1028
- - [test-environment-management](../test-environment-management/) - Environments need data
1029
- - [database-testing](../database-testing/) - Database schema and data integrity
1030
-
1031
- **Testing Methodologies:**
1032
- - [regression-testing](../regression-testing/) - Regression needs stable test data
1033
- - [performance-testing](../performance-testing/) - Performance tests need volume data
1034
- - [api-testing-patterns](../api-testing-patterns/) - API tests need request data
1035
-
1036
- **Quality Management:**
1037
- - [agentic-quality-engineering](../agentic-quality-engineering/) - Agent-driven data generation
1038
- - [compliance-testing](../compliance-testing/) - GDPR/CCPA compliance validation
1039
-
1040
- ---
1041
-
1042
- ## Remember
1043
-
1044
- **Test data is infrastructure, not an afterthought.**
1045
-
1046
- Poor test data causes:
1047
- - 40% of test failures
1048
- - Hours wasted debugging
1049
- - Unreliable test results
1050
- - Privacy violations
1051
- - Scaling bottlenecks
1052
-
1053
- **Good test data management enables:**
1054
- - Fast, reliable tests
1055
- - Realistic scenarios
1056
- - Privacy compliance
1057
- - Scalable testing
1058
- - Confident deployments
1059
-
1060
- **Golden Rules:**
1061
- 1. Never use production PII
1062
- 2. Automate data generation
1063
- 3. Clean up after tests
1064
- 4. Use transactions for isolation
1065
- 5. Generate edge cases systematically
1066
-
1067
- **With Agents:** `qe-test-data-architect` generates 10k+ records/sec with realistic patterns, constraints, and relationships. Use agents to eliminate test data bottlenecks and ensure GDPR/CCPA compliance automatically.
1
+ ---
2
+ name: test-data-management
3
+ description: Strategic test data generation, management, and privacy compliance. Use when creating test data, handling PII, ensuring GDPR/CCPA compliance, or scaling data generation for realistic testing scenarios.
4
+ ---
5
+
6
+ # Test Data Management
7
+
8
+ ## Core Principle
9
+
10
+ **Test data is the fuel for testing. Poor data = poor tests.**
11
+
12
+ 78% of QE teams cite test data as their #1 bottleneck. Good test data management enables fast, reliable, compliant testing at scale.
13
+
14
+ ## What is Test Data Management?
15
+
16
+ **Test Data Management:** Strategic creation, maintenance, and lifecycle management of data needed for testing, while ensuring privacy compliance and realistic scenarios.
17
+
18
+ **Why Critical:**
19
+ - 40% of test failures caused by inadequate test data
20
+ - GDPR/CCPA fines up to $20M or 4% of revenue
21
+ - Production data contains PII (illegal to use directly)
22
+ - AI/ML systems need massive, diverse datasets
23
+ - Manual data creation doesn't scale
24
+
25
+ **Goal:** Fast, realistic, compliant, scalable test data generation.
26
+
27
+ ## Test Data Strategies
28
+
29
+ ### Strategy 1: Minimal vs Realistic Data
30
+
31
+ **Minimal Data (Fast Tests)**
32
+ ```javascript
33
+ // Just enough to test logic
34
+ const user = {
35
+ id: 1,
36
+ email: 'test@example.com',
37
+ role: 'customer'
38
+ };
39
+
40
+ // Benefits:
41
+ // - Fast test execution
42
+ // - Easy to understand
43
+ // - Deterministic
44
+ // - No cleanup needed
45
+
46
+ // Use when:
47
+ // - Unit tests
48
+ // - Logic validation
49
+ // - Fast feedback needed
50
+ ```
51
+
52
+ **Realistic Data (Production-Like)**
53
+ ```javascript
54
+ // Production-like complexity
55
+ const user = {
56
+ id: '7f3a9c2e-4b1d-4e8a-9f2c-6d5e8a1b3c4d',
57
+ email: 'sarah.johnson@techcorp.com',
58
+ firstName: 'Sarah',
59
+ lastName: 'Johnson',
60
+ phone: '+1-555-0123',
61
+ address: {
62
+ street: '742 Evergreen Terrace',
63
+ city: 'Springfield',
64
+ state: 'IL',
65
+ zip: '62701',
66
+ country: 'US'
67
+ },
68
+ preferences: {
69
+ newsletter: true,
70
+ language: 'en-US',
71
+ timezone: 'America/Chicago'
72
+ },
73
+ createdAt: '2025-01-15T10:30:00Z',
74
+ lastLogin: '2025-10-24T14:22:15Z'
75
+ };
76
+
77
+ // Benefits:
78
+ // - Catches edge cases
79
+ // - Tests real-world scenarios
80
+ // - Validates integrations
81
+ // - Performance realistic
82
+
83
+ // Use when:
84
+ // - Integration tests
85
+ // - E2E tests
86
+ // - Performance tests
87
+ // - Production validation
88
+ ```
89
+
90
+ **Hybrid Approach (Best Practice)**
91
+ ```javascript
92
+ // Minimal for fast tests, realistic for critical paths
93
+ describe('User Service', () => {
94
+ // Unit test: minimal data
95
+ test('validates email format', () => {
96
+ expect(validateEmail('test@example.com')).toBe(true);
97
+ });
98
+
99
+ // Integration test: realistic data
100
+ test('creates user with full profile', async () => {
101
+ const user = generateRealisticUser(); // Full data
102
+ const result = await userService.create(user);
103
+ expect(result.profile.address.country).toBe('US');
104
+ });
105
+ });
106
+ ```
107
+
108
+ ---
109
+
110
+ ### Strategy 2: Shared vs Isolated Data
111
+
112
+ **Shared Data (Read-Only)**
113
+ ```javascript
114
+ // Seed database once, many tests use it
115
+ beforeAll(async () => {
116
+ await db.seed({
117
+ users: [
118
+ { id: 1, email: 'admin@example.com', role: 'admin' },
119
+ { id: 2, email: 'user@example.com', role: 'customer' }
120
+ ],
121
+ products: [
122
+ { id: 1, name: 'Widget', price: 9.99 },
123
+ { id: 2, name: 'Gadget', price: 19.99 }
124
+ ]
125
+ });
126
+ });
127
+
128
+ // Tests can read but not modify
129
+ test('admin can list all products', async () => {
130
+ const admin = await db.users.find({ id: 1 });
131
+ const products = await productService.list(admin);
132
+ expect(products.length).toBeGreaterThan(0);
133
+ });
134
+
135
+ // Benefits:
136
+ // - Fast (no setup per test)
137
+ // - Can run tests in parallel
138
+ // - Low resource usage
139
+
140
+ // Risks:
141
+ // - Tests must not modify data
142
+ // - Harder to debug (shared state)
143
+ ```
144
+
145
+ **Isolated Data (Per-Test)**
146
+ ```javascript
147
+ // Each test gets its own data
148
+ test('user can update profile', async () => {
149
+ // Generate unique data for this test
150
+ const user = await createTestUser({
151
+ email: `test-${Date.now()}@example.com`
152
+ });
153
+
154
+ await userService.updateProfile(user.id, { firstName: 'Updated' });
155
+
156
+ const updated = await db.users.find({ id: user.id });
157
+ expect(updated.firstName).toBe('Updated');
158
+
159
+ // Cleanup
160
+ await db.users.delete({ id: user.id });
161
+ });
162
+
163
+ // Benefits:
164
+ // - Tests independent
165
+ // - Can modify data freely
166
+ // - Easy to debug
167
+ // - No test pollution
168
+
169
+ // Costs:
170
+ // - Slower (setup per test)
171
+ // - More resource usage
172
+ // - Cleanup needed
173
+ ```
174
+
175
+ **Database Transactions (Best of Both)**
176
+ ```javascript
177
+ // Use transactions for isolation without cleanup
178
+ beforeEach(async () => {
179
+ await db.beginTransaction();
180
+ });
181
+
182
+ afterEach(async () => {
183
+ await db.rollbackTransaction(); // Auto cleanup!
184
+ });
185
+
186
+ test('user registration', async () => {
187
+ // Data exists only in this transaction
188
+ const user = await userService.register({
189
+ email: 'test@example.com'
190
+ });
191
+
192
+ expect(user.id).toBeDefined();
193
+ // Automatic rollback after test
194
+ });
195
+
196
+ // Benefits:
197
+ // - Isolated (transaction boundary)
198
+ // - Fast (no manual cleanup)
199
+ // - Reliable (guaranteed cleanup)
200
+ ```
201
+
202
+ ---
203
+
204
+ ### Strategy 3: Production Data vs Synthetic Data
205
+
206
+ **❌ Production Data (DANGER!)**
207
+ ```javascript
208
+ // NEVER do this:
209
+ const prodDb = connectTo('production://...');
210
+ const users = await prodDb.users.findAll(); // ⚠️ PII exposure!
211
+
212
+ // Problems:
213
+ // - Contains real PII (GDPR/CCPA violation)
214
+ // - Can modify production data accidentally
215
+ // - Performance impact on prod
216
+ // - Security risk
217
+ // - Legal liability
218
+ ```
219
+
220
+ **✅ Anonymized Production Data**
221
+ ```javascript
222
+ // Mask/anonymize production data
223
+ const anonymizedUsers = prodUsers.map(user => ({
224
+ id: user.id, // Keep ID for relationships
225
+ email: `user-${user.id}@example.com`, // Fake email
226
+ firstName: faker.name.firstName(), // Generated name
227
+ lastName: faker.name.lastName(),
228
+ phone: null, // Remove PII
229
+ address: {
230
+ city: user.address.city, // Keep non-PII
231
+ state: user.address.state,
232
+ zip: user.address.zip.substring(0, 3) + 'XX', // Partial zip
233
+ street: '***REDACTED***'
234
+ },
235
+ createdAt: user.createdAt // Keep timestamps
236
+ }));
237
+
238
+ // Benefits:
239
+ // - Realistic data patterns
240
+ // - Compliant with privacy laws
241
+ // - Safe for testing
242
+ ```
243
+
244
+ **✅ Synthetic Data (Best Practice)**
245
+ ```javascript
246
+ import { faker } from '@faker-js/faker';
247
+
248
+ // Generate realistic but fake data
249
+ function generateUser() {
250
+ return {
251
+ id: faker.string.uuid(),
252
+ email: faker.internet.email(),
253
+ firstName: faker.person.firstName(),
254
+ lastName: faker.person.lastName(),
255
+ phone: faker.phone.number(),
256
+ address: {
257
+ street: faker.location.streetAddress(),
258
+ city: faker.location.city(),
259
+ state: faker.location.state({ abbreviated: true }),
260
+ zip: faker.location.zipCode(),
261
+ country: 'US'
262
+ },
263
+ age: faker.number.int({ min: 18, max: 90 }),
264
+ createdAt: faker.date.past()
265
+ };
266
+ }
267
+
268
+ // Benefits:
269
+ // - No PII (privacy compliant)
270
+ // - Unlimited volume
271
+ // - Controlled characteristics
272
+ // - Repeatable with seeds
273
+ ```
274
+
275
+ ---
276
+
277
+ ## Data Generation Techniques
278
+
279
+ ### Technique 1: Faker Libraries
280
+
281
+ **Basic Usage**
282
+ ```javascript
283
+ import { faker } from '@faker-js/faker';
284
+
285
+ // Seed for reproducibility
286
+ faker.seed(123);
287
+
288
+ // Generate various data types
289
+ const testData = {
290
+ // Personal
291
+ name: faker.person.fullName(),
292
+ email: faker.internet.email(),
293
+ avatar: faker.image.avatar(),
294
+ bio: faker.person.bio(),
295
+
296
+ // Location
297
+ address: faker.location.streetAddress(),
298
+ city: faker.location.city(),
299
+ country: faker.location.country(),
300
+ coordinates: faker.location.nearbyGPSCoordinate(),
301
+
302
+ // Financial
303
+ accountNumber: faker.finance.accountNumber(),
304
+ amount: faker.finance.amount(),
305
+ currency: faker.finance.currencyCode(),
306
+ iban: faker.finance.iban(),
307
+
308
+ // Commerce
309
+ product: faker.commerce.productName(),
310
+ price: faker.commerce.price(),
311
+ department: faker.commerce.department(),
312
+
313
+ // Internet
314
+ username: faker.internet.userName(),
315
+ password: faker.internet.password(),
316
+ url: faker.internet.url(),
317
+ ipv4: faker.internet.ipv4(),
318
+
319
+ // Date/Time
320
+ pastDate: faker.date.past(),
321
+ futureDate: faker.date.future(),
322
+ recentDate: faker.date.recent(),
323
+
324
+ // Random
325
+ uuid: faker.string.uuid(),
326
+ alphanumeric: faker.string.alphanumeric(10),
327
+ hexadecimal: faker.string.hexadecimal(16)
328
+ };
329
+ ```
330
+
331
+ **Schema-Based Generation**
332
+ ```typescript
333
+ interface User {
334
+ id: string;
335
+ email: string;
336
+ profile: {
337
+ firstName: string;
338
+ lastName: string;
339
+ age: number;
340
+ };
341
+ roles: string[];
342
+ }
343
+
344
+ function generateUsers(count: number): User[] {
345
+ return Array.from({ length: count }, () => ({
346
+ id: faker.string.uuid(),
347
+ email: faker.internet.email(),
348
+ profile: {
349
+ firstName: faker.person.firstName(),
350
+ lastName: faker.person.lastName(),
351
+ age: faker.number.int({ min: 18, max: 90 })
352
+ },
353
+ roles: faker.helpers.arrayElements(['user', 'admin', 'moderator'])
354
+ }));
355
+ }
356
+
357
+ // Generate 1000 users
358
+ const users = generateUsers(1000);
359
+ ```
360
+
361
+ ---
362
+
363
+ ### Technique 2: Test Data Builders
364
+
365
+ **Builder Pattern**
366
+ ```typescript
367
+ class UserBuilder {
368
+ private user: Partial<User> = {};
369
+
370
+ withId(id: string) {
371
+ this.user.id = id;
372
+ return this;
373
+ }
374
+
375
+ withEmail(email: string) {
376
+ this.user.email = email;
377
+ return this;
378
+ }
379
+
380
+ withRole(role: string) {
381
+ this.user.role = role;
382
+ return this;
383
+ }
384
+
385
+ asAdmin() {
386
+ this.user.role = 'admin';
387
+ this.user.permissions = ['read', 'write', 'delete'];
388
+ return this;
389
+ }
390
+
391
+ asCustomer() {
392
+ this.user.role = 'customer';
393
+ this.user.permissions = ['read'];
394
+ return this;
395
+ }
396
+
397
+ build(): User {
398
+ // Fill in defaults for missing fields
399
+ return {
400
+ id: this.user.id ?? faker.string.uuid(),
401
+ email: this.user.email ?? faker.internet.email(),
402
+ role: this.user.role ?? 'customer',
403
+ permissions: this.user.permissions ?? ['read'],
404
+ createdAt: new Date()
405
+ } as User;
406
+ }
407
+ }
408
+
409
+ // Usage
410
+ const admin = new UserBuilder()
411
+ .asAdmin()
412
+ .withEmail('admin@example.com')
413
+ .build();
414
+
415
+ const customer = new UserBuilder()
416
+ .asCustomer()
417
+ .build();
418
+
419
+ // Flexible, readable, maintainable
420
+ ```
421
+
422
+ ---
423
+
424
+ ### Technique 3: Fixtures and Factories
425
+
426
+ **Fixture Files**
427
+ ```javascript
428
+ // fixtures/users.js
429
+ export const fixtures = {
430
+ adminUser: {
431
+ id: 1,
432
+ email: 'admin@example.com',
433
+ role: 'admin',
434
+ verified: true
435
+ },
436
+
437
+ regularUser: {
438
+ id: 2,
439
+ email: 'user@example.com',
440
+ role: 'customer',
441
+ verified: true
442
+ },
443
+
444
+ unverifiedUser: {
445
+ id: 3,
446
+ email: 'unverified@example.com',
447
+ role: 'customer',
448
+ verified: false
449
+ }
450
+ };
451
+
452
+ // Use in tests
453
+ import { fixtures } from './fixtures/users';
454
+
455
+ test('admin can delete users', async () => {
456
+ const admin = await createUser(fixtures.adminUser);
457
+ const user = await createUser(fixtures.regularUser);
458
+
459
+ await userService.delete(admin, user.id);
460
+ expect(await db.users.find(user.id)).toBeNull();
461
+ });
462
+ ```
463
+
464
+ **Factory Functions**
465
+ ```javascript
466
+ // factories/userFactory.js
467
+ export function createUser(overrides = {}) {
468
+ const defaults = {
469
+ id: faker.string.uuid(),
470
+ email: faker.internet.email(),
471
+ firstName: faker.person.firstName(),
472
+ lastName: faker.person.lastName(),
473
+ role: 'customer',
474
+ verified: true,
475
+ createdAt: new Date()
476
+ };
477
+
478
+ return { ...defaults, ...overrides };
479
+ }
480
+
481
+ export function createAdmin(overrides = {}) {
482
+ return createUser({
483
+ role: 'admin',
484
+ permissions: ['read', 'write', 'delete'],
485
+ ...overrides
486
+ });
487
+ }
488
+
489
+ // Use in tests
490
+ test('admin dashboard', async () => {
491
+ const admin = createAdmin({ email: 'specific@example.com' });
492
+ // Test with admin user
493
+ });
494
+ ```
495
+
496
+ ---
497
+
498
+ ## Data Privacy & Compliance
499
+
500
+ ### GDPR/CCPA Requirements
501
+
502
+ **What You Must Do:**
503
+ 1. **Minimize PII Collection**
504
+ - Only collect necessary data for testing
505
+ - Use synthetic data instead of production data
506
+ - Delete test data after use
507
+
508
+ 2. **Secure Storage**
509
+ - Encrypt sensitive test data
510
+ - Access controls on test databases
511
+ - Separate test from production
512
+
513
+ 3. **Data Anonymization**
514
+ - Mask/pseudonymize production data if used
515
+ - Remove direct identifiers
516
+ - K-anonymity for aggregate data
517
+
518
+ 4. **Right to Erasure**
519
+ - Easy deletion of test accounts
520
+ - Automated cleanup processes
521
+ - Audit trail of deletions
522
+
523
+ **Anonymization Techniques**
524
+ ```javascript
525
+ // Data masking
526
+ function maskEmail(email) {
527
+ const [user, domain] = email.split('@');
528
+ return `${user[0]}***@${domain}`;
529
+ }
530
+
531
+ function maskPhone(phone) {
532
+ return phone.replace(/\d(?=\d{4})/g, '*');
533
+ }
534
+
535
+ function maskCreditCard(cc) {
536
+ return `****-****-****-${cc.slice(-4)}`;
537
+ }
538
+
539
+ // Pseudonymization (reversible with key)
540
+ const crypto = require('crypto');
541
+
542
+ function pseudonymize(value, key) {
543
+ const cipher = crypto.createCipher('aes-256-cbc', key);
544
+ return cipher.update(value, 'utf8', 'hex') + cipher.final('hex');
545
+ }
546
+
547
+ function depseudonymize(encrypted, key) {
548
+ const decipher = crypto.createDecipher('aes-256-cbc', key);
549
+ return decipher.update(encrypted, 'hex', 'utf8') + decipher.final('utf8');
550
+ }
551
+
552
+ // Use in tests
553
+ const user = {
554
+ realEmail: 'john@example.com',
555
+ maskedEmail: maskEmail('john@example.com'), // 'j***@example.com'
556
+ pseudoEmail: pseudonymize('john@example.com', SECRET_KEY)
557
+ };
558
+ ```
559
+
560
+ **Data Retention Policies**
561
+ ```javascript
562
+ // Auto-delete old test data
563
+ async function cleanupOldTestData() {
564
+ const thirtyDaysAgo = new Date();
565
+ thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
566
+
567
+ // Delete test users older than 30 days
568
+ await db.users.deleteMany({
569
+ email: { $regex: /@example\.com$/ }, // Test emails
570
+ createdAt: { $lt: thirtyDaysAgo }
571
+ });
572
+
573
+ console.log('Cleaned up old test data');
574
+ }
575
+
576
+ // Run daily
577
+ schedule.scheduleJob('0 2 * * *', cleanupOldTestData);
578
+ ```
579
+
580
+ ---
581
+
582
+ ## Test Data Lifecycle
583
+
584
+ ### Phase 1: Setup/Seeding
585
+
586
+ **Database Seeding**
587
+ ```javascript
588
+ // seed.js
589
+ const seedData = {
590
+ users: [
591
+ { id: 1, email: 'admin@example.com', role: 'admin' },
592
+ { id: 2, email: 'user@example.com', role: 'customer' }
593
+ ],
594
+ products: [
595
+ { id: 1, name: 'Widget', price: 9.99, inStock: true },
596
+ { id: 2, name: 'Gadget', price: 19.99, inStock: true }
597
+ ]
598
+ };
599
+
600
+ async function seedDatabase() {
601
+ await db.users.insertMany(seedData.users);
602
+ await db.products.insertMany(seedData.products);
603
+ console.log('Database seeded');
604
+ }
605
+
606
+ // Run before tests
607
+ beforeAll(async () => {
608
+ await seedDatabase();
609
+ });
610
+ ```
611
+
612
+ ---
613
+
614
+ ### Phase 2: Test Execution
615
+
616
+ **Data Isolation During Tests**
617
+ ```javascript
618
+ describe('Order Service', () => {
619
+ let testUser;
620
+ let testProduct;
621
+
622
+ beforeEach(async () => {
623
+ // Create fresh data per test
624
+ testUser = await createTestUser();
625
+ testProduct = await createTestProduct();
626
+ });
627
+
628
+ afterEach(async () => {
629
+ // Cleanup after test
630
+ await deleteTestUser(testUser.id);
631
+ await deleteTestProduct(testProduct.id);
632
+ });
633
+
634
+ test('user can place order', async () => {
635
+ const order = await orderService.create({
636
+ userId: testUser.id,
637
+ productId: testProduct.id,
638
+ quantity: 1
639
+ });
640
+
641
+ expect(order.total).toBe(testProduct.price);
642
+ });
643
+ });
644
+ ```
645
+
646
+ ---
647
+
648
+ ### Phase 3: Cleanup/Reset
649
+
650
+ **Transaction-Based Cleanup**
651
+ ```javascript
652
+ // Best practice: use transactions
653
+ beforeEach(async () => {
654
+ await db.beginTransaction();
655
+ });
656
+
657
+ afterEach(async () => {
658
+ await db.rollbackTransaction(); // Auto cleanup
659
+ });
660
+ ```
661
+
662
+ **Manual Cleanup**
663
+ ```javascript
664
+ // Track created entities
665
+ const createdIds = {
666
+ users: [],
667
+ orders: [],
668
+ products: []
669
+ };
670
+
671
+ afterEach(async () => {
672
+ // Delete in reverse order (handle foreign keys)
673
+ await db.orders.deleteMany({ id: { $in: createdIds.orders } });
674
+ await db.products.deleteMany({ id: { $in: createdIds.products } });
675
+ await db.users.deleteMany({ id: { $in: createdIds.users } });
676
+
677
+ // Reset tracking
678
+ createdIds.users = [];
679
+ createdIds.orders = [];
680
+ createdIds.products = [];
681
+ });
682
+ ```
683
+
684
+ ---
685
+
686
+ ## Advanced Patterns
687
+
688
+ ### Pattern 1: Relational Data Generation
689
+
690
+ **Generate Related Entities**
691
+ ```javascript
692
+ async function generateOrderWithRelations() {
693
+ // Create user
694
+ const user = await db.users.create({
695
+ email: faker.internet.email(),
696
+ firstName: faker.person.firstName()
697
+ });
698
+
699
+ // Create products
700
+ const products = await Promise.all([
701
+ db.products.create({
702
+ name: faker.commerce.productName(),
703
+ price: faker.commerce.price()
704
+ }),
705
+ db.products.create({
706
+ name: faker.commerce.productName(),
707
+ price: faker.commerce.price()
708
+ })
709
+ ]);
710
+
711
+ // Create order with line items
712
+ const order = await db.orders.create({
713
+ userId: user.id,
714
+ status: 'pending',
715
+ lineItems: products.map(p => ({
716
+ productId: p.id,
717
+ quantity: faker.number.int({ min: 1, max: 5 }),
718
+ price: p.price
719
+ }))
720
+ });
721
+
722
+ return { user, products, order };
723
+ }
724
+
725
+ // Use in test
726
+ test('order total calculation', async () => {
727
+ const { order } = await generateOrderWithRelations();
728
+ expect(order.total).toBeGreaterThan(0);
729
+ });
730
+ ```
731
+
732
+ ---
733
+
734
+ ### Pattern 2: Edge Case Data
735
+
736
+ **Generate Boundary Values**
737
+ ```javascript
738
+ function generateEdgeCaseUsers() {
739
+ return [
740
+ // Minimum values
741
+ {
742
+ email: 'a@b.c', // Shortest valid email
743
+ age: 18, // Minimum age
744
+ name: 'A' // Single character
745
+ },
746
+
747
+ // Maximum values
748
+ {
749
+ email: 'a'.repeat(64) + '@' + 'b'.repeat(255), // Max length
750
+ age: 120,
751
+ name: 'A'.repeat(255)
752
+ },
753
+
754
+ // Special characters
755
+ {
756
+ email: "test+tag@example.com",
757
+ name: "O'Brien",
758
+ bio: "Test <script>alert('xss')</script>"
759
+ },
760
+
761
+ // Unicode
762
+ {
763
+ email: 'user@例え.jp',
764
+ name: '山田太郎',
765
+ city: '北京'
766
+ },
767
+
768
+ // Empty/null
769
+ {
770
+ email: 'empty@example.com',
771
+ middleName: null,
772
+ phone: ''
773
+ }
774
+ ];
775
+ }
776
+ ```
777
+
778
+ ---
779
+
780
+ ### Pattern 3: Volume Data Generation
781
+
782
+ **Generate Large Datasets**
783
+ ```javascript
784
+ // Generate 10,000 users efficiently
785
+ async function generateLargeUserDataset(count = 10000) {
786
+ const batchSize = 1000;
787
+ const batches = Math.ceil(count / batchSize);
788
+
789
+ for (let i = 0; i < batches; i++) {
790
+ const users = Array.from({ length: batchSize }, (_, index) => ({
791
+ id: i * batchSize + index,
792
+ email: `user${i * batchSize + index}@example.com`,
793
+ firstName: faker.person.firstName(),
794
+ lastName: faker.person.lastName(),
795
+ createdAt: faker.date.past()
796
+ }));
797
+
798
+ // Batch insert for performance
799
+ await db.users.insertMany(users);
800
+
801
+ console.log(`Inserted batch ${i + 1}/${batches}`);
802
+ }
803
+ }
804
+
805
+ // Performance test with realistic volume
806
+ test('search performs well with 10k users', async () => {
807
+ await generateLargeUserDataset(10000);
808
+
809
+ const start = Date.now();
810
+ const results = await userService.search('John');
811
+ const duration = Date.now() - start;
812
+
813
+ expect(duration).toBeLessThan(100); // < 100ms
814
+ });
815
+ ```
816
+
817
+ ---
818
+
819
+ ## Using with QE Agents
820
+
821
+ ### qe-test-data-architect: High-Speed Generation
822
+
823
+ **Generate 10k+ Records per Second**
824
+ ```typescript
825
+ // Agent generates realistic, schema-aware data
826
+ const testData = await agent.generateTestData({
827
+ schema: 'users',
828
+ count: 10000,
829
+ realistic: true,
830
+ constraints: {
831
+ age: { min: 18, max: 90 },
832
+ roles: ['customer', 'admin', 'moderator'],
833
+ emailDomain: 'example.com'
834
+ }
835
+ });
836
+
837
+ // Returns 10,000 fully populated user records
838
+ // With relationships, constraints, realistic patterns
839
+ ```
840
+
841
+ **Edge Case Discovery**
842
+ ```typescript
843
+ // Agent auto-discovers edge cases
844
+ const edgeCases = await agent.generateEdgeCases({
845
+ field: 'email',
846
+ patterns: [
847
+ 'special-chars',
848
+ 'unicode',
849
+ 'max-length',
850
+ 'min-length',
851
+ 'sql-injection',
852
+ 'xss-attempts'
853
+ ]
854
+ });
855
+
856
+ // Returns comprehensive edge case dataset
857
+ // 50+ edge cases for email field
858
+ ```
859
+
860
+ **GDPR-Compliant Data**
861
+ ```typescript
862
+ // Agent ensures privacy compliance
863
+ const anonymizedData = await agent.anonymizeProductionData({
864
+ source: productionSnapshot,
865
+ piiFields: ['email', 'phone', 'ssn', 'address'],
866
+ method: 'pseudonymization',
867
+ retainStructure: true
868
+ });
869
+
870
+ // Returns anonymized data maintaining referential integrity
871
+ ```
872
+
873
+ ---
874
+
875
+ ### Fleet Coordination for Complex Data Graphs
876
+
877
+ ```typescript
878
+ // Multiple agents coordinate for complex data
879
+ const dataFleet = await FleetManager.coordinate({
880
+ strategy: 'test-data-generation',
881
+ agents: [
882
+ 'qe-test-data-architect', // Generate base data
883
+ 'qe-test-generator', // Generate tests using data
884
+ 'qe-test-executor' // Execute with generated data
885
+ ],
886
+ topology: 'sequential'
887
+ });
888
+
889
+ await dataFleet.execute({
890
+ scenario: 'e-commerce-checkout',
891
+ volume: {
892
+ users: 1000,
893
+ products: 500,
894
+ orders: 5000
895
+ },
896
+ relationships: true,
897
+ realistic: true
898
+ });
899
+
900
+ // Generates full data graph:
901
+ // - 1000 users with profiles
902
+ // - 500 products with inventory
903
+ // - 5000 orders with line items
904
+ // - All relationships maintained
905
+ // - Tests generated and executed
906
+ ```
907
+
908
+ ---
909
+
910
+ ## Tools & Libraries
911
+
912
+ ### Data Generation
913
+ - **@faker-js/faker** - Comprehensive fake data generation
914
+ - **Mockaroo** - Online data generator (CSV, JSON, SQL)
915
+ - **Chance.js** - Random data generation
916
+ - **Casual** - Minimalist fake data
917
+ - **JSON Schema Faker** - Generate from JSON schemas
918
+
919
+ ### Database Tools
920
+ - **Factory Bot** (Ruby) - Test data factories
921
+ - **FactoryGuy** (JavaScript) - Ember.js factories
922
+ - **Fishery** (TypeScript) - Type-safe factories
923
+ - **Knex.js** - SQL query builder with seeding
924
+ - **Prisma** - ORM with seeding support
925
+
926
+ ### Privacy Tools
927
+ - **ARX Data Anonymization Tool** - GDPR compliance
928
+ - **sdv (Synthetic Data Vault)** - AI-generated synthetic data
929
+ - **Presidio** - PII detection and anonymization
930
+ - **Faker** - Built-in data masking
931
+
932
+ ---
933
+
934
+ ## Common Pitfalls
935
+
936
+ ### Using Production Data Directly
937
+ ```javascript
938
+ // NEVER do this
939
+ const prodUsers = await prodDb.query('SELECT * FROM users');
940
+ await testDb.insertMany(prodUsers); // ⚠️ PII violation
941
+ ```
942
+
943
+ **Fix:** Anonymize first or use synthetic data
944
+
945
+ ### ❌ Not Cleaning Up Test Data
946
+ ```javascript
947
+ // Creates 100 users per test, never deleted
948
+ test('many tests', async () => {
949
+ const users = await generateUsers(100);
950
+ // ... test code
951
+ // No cleanup! Database fills up
952
+ });
953
+ ```
954
+
955
+ **Fix:** Use transactions or cleanup hooks
956
+
957
+ ### ❌ Hard-Coded IDs
958
+ ```javascript
959
+ // Breaks when run in parallel or multiple times
960
+ const user = await createUser({ id: 1 }); // ⚠️ Collision risk
961
+ ```
962
+
963
+ **Fix:** Use generated UUIDs or auto-increment
964
+
965
+ ### ❌ Shared Mutable Data
966
+ ```javascript
967
+ // Tests pollute shared data
968
+ const sharedUser = createUser();
969
+
970
+ test('update email', () => {
971
+ sharedUser.email = 'new@example.com'; // Affects other tests!
972
+ });
973
+ ```
974
+
975
+ **Fix:** Create fresh data per test
976
+
977
+ ---
978
+
979
+ ## Best Practices Checklist
980
+
981
+ **Data Generation:**
982
+ - [ ] Use faker or similar library for realistic data
983
+ - [ ] Generate data with proper constraints
984
+ - [ ] Create both minimal and realistic datasets
985
+ - [ ] Include edge cases and boundary values
986
+ - [ ] Use builders/factories for complex entities
987
+
988
+ **Privacy & Compliance:**
989
+ - [ ] Never use production PII directly
990
+ - [ ] Anonymize/pseudonymize production data snapshots
991
+ - [ ] Use synthetic data as default
992
+ - [ ] Implement data retention policies
993
+ - [ ] Document data handling procedures
994
+
995
+ **Performance:**
996
+ - [ ] Batch insert for large datasets
997
+ - [ ] Use database transactions for isolation
998
+ - [ ] Generate data lazily when possible
999
+ - [ ] Cache commonly used fixtures
1000
+ - [ ] Clean up data after tests
1001
+
1002
+ **Maintainability:**
1003
+ - [ ] Centralize test data generation
1004
+ - [ ] Version control seed data
1005
+ - [ ] Document data schemas
1006
+ - [ ] Use type-safe factories (TypeScript)
1007
+ - [ ] Keep data generation DRY
1008
+
1009
+ ---
1010
+
1011
+ ## Related Skills
1012
+
1013
+ **Testing Infrastructure:**
1014
+ - [test-automation-strategy](../test-automation-strategy/) - Automation includes data setup
1015
+ - [test-environment-management](../test-environment-management/) - Environments need data
1016
+ - [database-testing](../database-testing/) - Database schema and data integrity
1017
+
1018
+ **Testing Methodologies:**
1019
+ - [regression-testing](../regression-testing/) - Regression needs stable test data
1020
+ - [performance-testing](../performance-testing/) - Performance tests need volume data
1021
+ - [api-testing-patterns](../api-testing-patterns/) - API tests need request data
1022
+
1023
+ **Quality Management:**
1024
+ - [agentic-quality-engineering](../agentic-quality-engineering/) - Agent-driven data generation
1025
+ - [compliance-testing](../compliance-testing/) - GDPR/CCPA compliance validation
1026
+
1027
+ ---
1028
+
1029
+ ## Remember
1030
+
1031
+ **Test data is infrastructure, not an afterthought.**
1032
+
1033
+ Poor test data causes:
1034
+ - 40% of test failures
1035
+ - Hours wasted debugging
1036
+ - Unreliable test results
1037
+ - Privacy violations
1038
+ - Scaling bottlenecks
1039
+
1040
+ **Good test data management enables:**
1041
+ - Fast, reliable tests
1042
+ - Realistic scenarios
1043
+ - Privacy compliance
1044
+ - Scalable testing
1045
+ - Confident deployments
1046
+
1047
+ **Golden Rules:**
1048
+ 1. Never use production PII
1049
+ 2. Automate data generation
1050
+ 3. Clean up after tests
1051
+ 4. Use transactions for isolation
1052
+ 5. Generate edge cases systematically
1053
+
1054
+ **With Agents:** `qe-test-data-architect` generates 10k+ records/sec with realistic patterns, constraints, and relationships. Use agents to eliminate test data bottlenecks and ensure GDPR/CCPA compliance automatically.