agentic-qe 1.9.4 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/.claude/agents/qe-api-contract-validator.md +95 -1336
  2. package/.claude/agents/qe-chaos-engineer.md +152 -1211
  3. package/.claude/agents/qe-code-complexity.md +144 -707
  4. package/.claude/agents/qe-coverage-analyzer.md +147 -743
  5. package/.claude/agents/qe-deployment-readiness.md +143 -1496
  6. package/.claude/agents/qe-flaky-test-hunter.md +132 -1529
  7. package/.claude/agents/qe-fleet-commander.md +12 -12
  8. package/.claude/agents/qe-performance-tester.md +150 -886
  9. package/.claude/agents/qe-production-intelligence.md +155 -1396
  10. package/.claude/agents/qe-quality-analyzer.md +6 -6
  11. package/.claude/agents/qe-quality-gate.md +151 -648
  12. package/.claude/agents/qe-regression-risk-analyzer.md +132 -1150
  13. package/.claude/agents/qe-requirements-validator.md +149 -932
  14. package/.claude/agents/qe-security-scanner.md +157 -797
  15. package/.claude/agents/qe-test-data-architect.md +96 -1365
  16. package/.claude/agents/qe-test-executor.md +8 -8
  17. package/.claude/agents/qe-test-generator.md +145 -1540
  18. package/.claude/agents/qe-visual-tester.md +153 -1257
  19. package/.claude/agents/qx-partner.md +248 -0
  20. package/.claude/agents/subagents/qe-code-reviewer.md +40 -136
  21. package/.claude/agents/subagents/qe-coverage-gap-analyzer.md +40 -480
  22. package/.claude/agents/subagents/qe-data-generator.md +41 -125
  23. package/.claude/agents/subagents/qe-flaky-investigator.md +55 -411
  24. package/.claude/agents/subagents/qe-integration-tester.md +53 -141
  25. package/.claude/agents/subagents/qe-performance-validator.md +54 -130
  26. package/.claude/agents/subagents/qe-security-auditor.md +56 -114
  27. package/.claude/agents/subagents/qe-test-data-architect-sub.md +57 -548
  28. package/.claude/agents/subagents/qe-test-implementer.md +58 -551
  29. package/.claude/agents/subagents/qe-test-refactorer.md +65 -722
  30. package/.claude/agents/subagents/qe-test-writer.md +63 -726
  31. package/.claude/skills/accessibility-testing/SKILL.md +144 -692
  32. package/.claude/skills/agentic-quality-engineering/SKILL.md +176 -529
  33. package/.claude/skills/api-testing-patterns/SKILL.md +180 -560
  34. package/.claude/skills/brutal-honesty-review/SKILL.md +113 -603
  35. package/.claude/skills/bug-reporting-excellence/SKILL.md +116 -517
  36. package/.claude/skills/chaos-engineering-resilience/SKILL.md +127 -72
  37. package/.claude/skills/cicd-pipeline-qe-orchestrator/SKILL.md +209 -404
  38. package/.claude/skills/code-review-quality/SKILL.md +158 -608
  39. package/.claude/skills/compatibility-testing/SKILL.md +148 -38
  40. package/.claude/skills/compliance-testing/SKILL.md +132 -63
  41. package/.claude/skills/consultancy-practices/SKILL.md +114 -446
  42. package/.claude/skills/context-driven-testing/SKILL.md +117 -381
  43. package/.claude/skills/contract-testing/SKILL.md +176 -141
  44. package/.claude/skills/database-testing/SKILL.md +137 -130
  45. package/.claude/skills/exploratory-testing-advanced/SKILL.md +160 -629
  46. package/.claude/skills/holistic-testing-pact/SKILL.md +140 -188
  47. package/.claude/skills/localization-testing/SKILL.md +145 -33
  48. package/.claude/skills/mobile-testing/SKILL.md +132 -448
  49. package/.claude/skills/mutation-testing/SKILL.md +147 -41
  50. package/.claude/skills/performance-testing/SKILL.md +200 -546
  51. package/.claude/skills/quality-metrics/SKILL.md +164 -519
  52. package/.claude/skills/refactoring-patterns/SKILL.md +132 -699
  53. package/.claude/skills/regression-testing/SKILL.md +120 -926
  54. package/.claude/skills/risk-based-testing/SKILL.md +157 -660
  55. package/.claude/skills/security-testing/SKILL.md +199 -538
  56. package/.claude/skills/sherlock-review/SKILL.md +163 -699
  57. package/.claude/skills/shift-left-testing/SKILL.md +161 -465
  58. package/.claude/skills/shift-right-testing/SKILL.md +161 -519
  59. package/.claude/skills/six-thinking-hats/SKILL.md +175 -1110
  60. package/.claude/skills/skills-manifest.json +683 -0
  61. package/.claude/skills/tdd-london-chicago/SKILL.md +131 -448
  62. package/.claude/skills/technical-writing/SKILL.md +103 -154
  63. package/.claude/skills/test-automation-strategy/SKILL.md +166 -772
  64. package/.claude/skills/test-data-management/SKILL.md +126 -910
  65. package/.claude/skills/test-design-techniques/SKILL.md +179 -89
  66. package/.claude/skills/test-environment-management/SKILL.md +136 -91
  67. package/.claude/skills/test-reporting-analytics/SKILL.md +169 -92
  68. package/.claude/skills/testability-scoring/README.md +71 -0
  69. package/.claude/skills/testability-scoring/SKILL.md +245 -0
  70. package/.claude/skills/testability-scoring/resources/templates/config.template.js +84 -0
  71. package/.claude/skills/testability-scoring/resources/templates/testability-scoring.spec.template.js +532 -0
  72. package/.claude/skills/testability-scoring/scripts/generate-html-report.js +1007 -0
  73. package/.claude/skills/testability-scoring/scripts/run-assessment.sh +70 -0
  74. package/.claude/skills/visual-testing-advanced/SKILL.md +155 -78
  75. package/.claude/skills/xp-practices/SKILL.md +151 -587
  76. package/CHANGELOG.md +110 -0
  77. package/README.md +55 -21
  78. package/dist/agents/QXPartnerAgent.d.ts +146 -0
  79. package/dist/agents/QXPartnerAgent.d.ts.map +1 -0
  80. package/dist/agents/QXPartnerAgent.js +1831 -0
  81. package/dist/agents/QXPartnerAgent.js.map +1 -0
  82. package/dist/agents/index.d.ts +1 -0
  83. package/dist/agents/index.d.ts.map +1 -1
  84. package/dist/agents/index.js +82 -2
  85. package/dist/agents/index.js.map +1 -1
  86. package/dist/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -1
  87. package/dist/agents/lifecycle/AgentLifecycleManager.js +34 -31
  88. package/dist/agents/lifecycle/AgentLifecycleManager.js.map +1 -1
  89. package/dist/cli/commands/debug/agent.d.ts.map +1 -1
  90. package/dist/cli/commands/debug/agent.js +19 -6
  91. package/dist/cli/commands/debug/agent.js.map +1 -1
  92. package/dist/cli/commands/debug/health-check.js +20 -7
  93. package/dist/cli/commands/debug/health-check.js.map +1 -1
  94. package/dist/cli/commands/init-claude-md-template.d.ts +1 -0
  95. package/dist/cli/commands/init-claude-md-template.d.ts.map +1 -1
  96. package/dist/cli/commands/init-claude-md-template.js +18 -3
  97. package/dist/cli/commands/init-claude-md-template.js.map +1 -1
  98. package/dist/cli/commands/workflow/cancel.d.ts.map +1 -1
  99. package/dist/cli/commands/workflow/cancel.js +4 -3
  100. package/dist/cli/commands/workflow/cancel.js.map +1 -1
  101. package/dist/cli/commands/workflow/list.d.ts.map +1 -1
  102. package/dist/cli/commands/workflow/list.js +4 -3
  103. package/dist/cli/commands/workflow/list.js.map +1 -1
  104. package/dist/cli/commands/workflow/pause.d.ts.map +1 -1
  105. package/dist/cli/commands/workflow/pause.js +4 -3
  106. package/dist/cli/commands/workflow/pause.js.map +1 -1
  107. package/dist/cli/init/claude-config.d.ts.map +1 -1
  108. package/dist/cli/init/claude-config.js +3 -8
  109. package/dist/cli/init/claude-config.js.map +1 -1
  110. package/dist/cli/init/claude-md.d.ts.map +1 -1
  111. package/dist/cli/init/claude-md.js +44 -2
  112. package/dist/cli/init/claude-md.js.map +1 -1
  113. package/dist/cli/init/database-init.js +1 -1
  114. package/dist/cli/init/index.d.ts.map +1 -1
  115. package/dist/cli/init/index.js +13 -6
  116. package/dist/cli/init/index.js.map +1 -1
  117. package/dist/cli/init/skills.d.ts.map +1 -1
  118. package/dist/cli/init/skills.js +2 -1
  119. package/dist/cli/init/skills.js.map +1 -1
  120. package/dist/core/SwarmCoordinator.d.ts +180 -0
  121. package/dist/core/SwarmCoordinator.d.ts.map +1 -0
  122. package/dist/core/SwarmCoordinator.js +473 -0
  123. package/dist/core/SwarmCoordinator.js.map +1 -0
  124. package/dist/core/memory/AgentDBIntegration.d.ts +24 -6
  125. package/dist/core/memory/AgentDBIntegration.d.ts.map +1 -1
  126. package/dist/core/memory/AgentDBIntegration.js +66 -10
  127. package/dist/core/memory/AgentDBIntegration.js.map +1 -1
  128. package/dist/core/memory/UnifiedMemoryCoordinator.d.ts +341 -0
  129. package/dist/core/memory/UnifiedMemoryCoordinator.d.ts.map +1 -0
  130. package/dist/core/memory/UnifiedMemoryCoordinator.js +986 -0
  131. package/dist/core/memory/UnifiedMemoryCoordinator.js.map +1 -0
  132. package/dist/core/memory/index.d.ts +5 -0
  133. package/dist/core/memory/index.d.ts.map +1 -1
  134. package/dist/core/memory/index.js +23 -1
  135. package/dist/core/memory/index.js.map +1 -1
  136. package/dist/core/metrics/MetricsAggregator.d.ts +228 -0
  137. package/dist/core/metrics/MetricsAggregator.d.ts.map +1 -0
  138. package/dist/core/metrics/MetricsAggregator.js +482 -0
  139. package/dist/core/metrics/MetricsAggregator.js.map +1 -0
  140. package/dist/core/metrics/index.d.ts +5 -0
  141. package/dist/core/metrics/index.d.ts.map +1 -0
  142. package/dist/core/metrics/index.js +11 -0
  143. package/dist/core/metrics/index.js.map +1 -0
  144. package/dist/core/optimization/SwarmOptimizer.d.ts +190 -0
  145. package/dist/core/optimization/SwarmOptimizer.d.ts.map +1 -0
  146. package/dist/core/optimization/SwarmOptimizer.js +648 -0
  147. package/dist/core/optimization/SwarmOptimizer.js.map +1 -0
  148. package/dist/core/optimization/index.d.ts +9 -0
  149. package/dist/core/optimization/index.d.ts.map +1 -0
  150. package/dist/core/optimization/index.js +25 -0
  151. package/dist/core/optimization/index.js.map +1 -0
  152. package/dist/core/optimization/types.d.ts +53 -0
  153. package/dist/core/optimization/types.d.ts.map +1 -0
  154. package/dist/core/optimization/types.js +6 -0
  155. package/dist/core/optimization/types.js.map +1 -0
  156. package/dist/core/orchestration/AdaptiveScheduler.d.ts +190 -0
  157. package/dist/core/orchestration/AdaptiveScheduler.d.ts.map +1 -0
  158. package/dist/core/orchestration/AdaptiveScheduler.js +460 -0
  159. package/dist/core/orchestration/AdaptiveScheduler.js.map +1 -0
  160. package/dist/core/orchestration/PriorityQueue.d.ts +54 -0
  161. package/dist/core/orchestration/PriorityQueue.d.ts.map +1 -0
  162. package/dist/core/orchestration/PriorityQueue.js +122 -0
  163. package/dist/core/orchestration/PriorityQueue.js.map +1 -0
  164. package/dist/core/orchestration/WorkflowOrchestrator.d.ts +189 -0
  165. package/dist/core/orchestration/WorkflowOrchestrator.d.ts.map +1 -0
  166. package/dist/core/orchestration/WorkflowOrchestrator.js +845 -0
  167. package/dist/core/orchestration/WorkflowOrchestrator.js.map +1 -0
  168. package/dist/core/orchestration/index.d.ts +7 -0
  169. package/dist/core/orchestration/index.d.ts.map +1 -0
  170. package/dist/core/orchestration/index.js +11 -0
  171. package/dist/core/orchestration/index.js.map +1 -0
  172. package/dist/core/orchestration/types.d.ts +96 -0
  173. package/dist/core/orchestration/types.d.ts.map +1 -0
  174. package/dist/core/orchestration/types.js +6 -0
  175. package/dist/core/orchestration/types.js.map +1 -0
  176. package/dist/core/recovery/CircuitBreaker.d.ts +176 -0
  177. package/dist/core/recovery/CircuitBreaker.d.ts.map +1 -0
  178. package/dist/core/recovery/CircuitBreaker.js +382 -0
  179. package/dist/core/recovery/CircuitBreaker.js.map +1 -0
  180. package/dist/core/recovery/RecoveryOrchestrator.d.ts +186 -0
  181. package/dist/core/recovery/RecoveryOrchestrator.d.ts.map +1 -0
  182. package/dist/core/recovery/RecoveryOrchestrator.js +476 -0
  183. package/dist/core/recovery/RecoveryOrchestrator.js.map +1 -0
  184. package/dist/core/recovery/RetryStrategy.d.ts +127 -0
  185. package/dist/core/recovery/RetryStrategy.d.ts.map +1 -0
  186. package/dist/core/recovery/RetryStrategy.js +314 -0
  187. package/dist/core/recovery/RetryStrategy.js.map +1 -0
  188. package/dist/core/recovery/index.d.ts +8 -0
  189. package/dist/core/recovery/index.d.ts.map +1 -0
  190. package/dist/core/recovery/index.js +27 -0
  191. package/dist/core/recovery/index.js.map +1 -0
  192. package/dist/core/skills/DependencyResolver.d.ts +99 -0
  193. package/dist/core/skills/DependencyResolver.d.ts.map +1 -0
  194. package/dist/core/skills/DependencyResolver.js +260 -0
  195. package/dist/core/skills/DependencyResolver.js.map +1 -0
  196. package/dist/core/skills/DynamicSkillLoader.d.ts +96 -0
  197. package/dist/core/skills/DynamicSkillLoader.d.ts.map +1 -0
  198. package/dist/core/skills/DynamicSkillLoader.js +353 -0
  199. package/dist/core/skills/DynamicSkillLoader.js.map +1 -0
  200. package/dist/core/skills/ManifestGenerator.d.ts +114 -0
  201. package/dist/core/skills/ManifestGenerator.d.ts.map +1 -0
  202. package/dist/core/skills/ManifestGenerator.js +449 -0
  203. package/dist/core/skills/ManifestGenerator.js.map +1 -0
  204. package/dist/core/skills/index.d.ts +9 -0
  205. package/dist/core/skills/index.d.ts.map +1 -0
  206. package/dist/core/skills/index.js +24 -0
  207. package/dist/core/skills/index.js.map +1 -0
  208. package/dist/core/skills/types.d.ts +118 -0
  209. package/dist/core/skills/types.d.ts.map +1 -0
  210. package/dist/core/skills/types.js +7 -0
  211. package/dist/core/skills/types.js.map +1 -0
  212. package/dist/core/transport/QUICTransport.d.ts +320 -0
  213. package/dist/core/transport/QUICTransport.d.ts.map +1 -0
  214. package/dist/core/transport/QUICTransport.js +711 -0
  215. package/dist/core/transport/QUICTransport.js.map +1 -0
  216. package/dist/core/transport/index.d.ts +40 -0
  217. package/dist/core/transport/index.d.ts.map +1 -0
  218. package/dist/core/transport/index.js +46 -0
  219. package/dist/core/transport/index.js.map +1 -0
  220. package/dist/core/transport/quic-loader.d.ts +123 -0
  221. package/dist/core/transport/quic-loader.d.ts.map +1 -0
  222. package/dist/core/transport/quic-loader.js +293 -0
  223. package/dist/core/transport/quic-loader.js.map +1 -0
  224. package/dist/core/transport/quic.d.ts +154 -0
  225. package/dist/core/transport/quic.d.ts.map +1 -0
  226. package/dist/core/transport/quic.js +214 -0
  227. package/dist/core/transport/quic.js.map +1 -0
  228. package/dist/mcp/server.d.ts +9 -9
  229. package/dist/mcp/server.d.ts.map +1 -1
  230. package/dist/mcp/server.js +1 -2
  231. package/dist/mcp/server.js.map +1 -1
  232. package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
  233. package/dist/mcp/services/AgentRegistry.js +4 -1
  234. package/dist/mcp/services/AgentRegistry.js.map +1 -1
  235. package/dist/types/index.d.ts +2 -1
  236. package/dist/types/index.d.ts.map +1 -1
  237. package/dist/types/index.js +2 -0
  238. package/dist/types/index.js.map +1 -1
  239. package/dist/types/qx.d.ts +429 -0
  240. package/dist/types/qx.d.ts.map +1 -0
  241. package/dist/types/qx.js +71 -0
  242. package/dist/types/qx.js.map +1 -0
  243. package/dist/visualization/api/RestEndpoints.js +2 -2
  244. package/dist/visualization/api/RestEndpoints.js.map +1 -1
  245. package/dist/visualization/api/WebSocketServer.d.ts +44 -0
  246. package/dist/visualization/api/WebSocketServer.d.ts.map +1 -1
  247. package/dist/visualization/api/WebSocketServer.js +144 -23
  248. package/dist/visualization/api/WebSocketServer.js.map +1 -1
  249. package/dist/visualization/core/DataTransformer.d.ts +10 -0
  250. package/dist/visualization/core/DataTransformer.d.ts.map +1 -1
  251. package/dist/visualization/core/DataTransformer.js +60 -5
  252. package/dist/visualization/core/DataTransformer.js.map +1 -1
  253. package/dist/visualization/emit-event.d.ts +75 -0
  254. package/dist/visualization/emit-event.d.ts.map +1 -0
  255. package/dist/visualization/emit-event.js +213 -0
  256. package/dist/visualization/emit-event.js.map +1 -0
  257. package/dist/visualization/index.d.ts +1 -0
  258. package/dist/visualization/index.d.ts.map +1 -1
  259. package/dist/visualization/index.js +7 -1
  260. package/dist/visualization/index.js.map +1 -1
  261. package/docs/reference/skills.md +63 -1
  262. package/package.json +16 -58
@@ -1,36 +1,70 @@
1
1
  ---
2
2
  name: database-testing
3
- description: Database schema validation, data integrity testing, migration testing, transaction isolation, and query performance. Use when testing data persistence, ensuring referential integrity, or validating database migrations.
3
+ description: "Database schema validation, data integrity testing, migration testing, transaction isolation, and query performance. Use when testing data persistence, ensuring referential integrity, or validating database migrations."
4
+ category: specialized-testing
5
+ priority: high
6
+ tokenEstimate: 900
7
+ agents: [qe-test-data-architect, qe-test-executor, qe-performance-tester]
8
+ implementation_status: optimized
9
+ optimization_version: 1.0
10
+ last_optimized: 2025-12-02
11
+ dependencies: []
12
+ quick_reference_card: true
13
+ tags: [database, schema, migration, transactions, integrity, sql, performance]
4
14
  ---
5
15
 
6
16
  # Database Testing
7
17
 
8
- ## Core Principle
18
+ <default_to_action>
19
+ When testing database operations:
20
+ 1. VALIDATE schema (tables, columns, constraints exist as expected)
21
+ 2. TEST data integrity (unique, foreign key, check constraints)
22
+ 3. VERIFY migrations (forward works, rollback works, data preserved)
23
+ 4. CHECK transaction isolation (ACID properties, concurrent access)
24
+ 5. MEASURE query performance (indexes used, execution time)
25
+
26
+ **Quick DB Testing Checklist:**
27
+ - Schema matches specification
28
+ - Unique constraints prevent duplicates
29
+ - Foreign keys prevent orphaned records
30
+ - Migrations are reversible
31
+ - Transactions roll back on error
32
+
33
+ **Critical Success Factors:**
34
+ - Database bugs cause data loss/corruption (catastrophic)
35
+ - Test migrations in staging before production
36
+ - Transaction tests catch concurrency bugs
37
+ </default_to_action>
38
+
39
+ ## Quick Reference Card
40
+
41
+ ### When to Use
42
+ - New table/schema creation
43
+ - Migration development
44
+ - Data integrity validation
45
+ - Query performance optimization
46
+
47
+ ### Database Test Types
48
+ | Type | Focus | When |
49
+ |------|-------|------|
50
+ | **Schema** | Structure correct | Table creation |
51
+ | **Integrity** | Constraints work | Data operations |
52
+ | **Migration** | Up/down work | Schema changes |
53
+ | **Transaction** | ACID properties | Concurrent access |
54
+ | **Performance** | Query speed | Optimization |
55
+
56
+ ### ACID Properties
57
+ | Property | Test Focus |
58
+ |----------|------------|
59
+ | **Atomicity** | All or nothing (rollback on error) |
60
+ | **Consistency** | Constraints always valid |
61
+ | **Isolation** | Concurrent transactions don't interfere |
62
+ | **Durability** | Committed data persists |
9
63
 
10
- **Data is your most valuable asset. Database bugs cause data loss/corruption.**
11
-
12
- Database testing ensures schema correctness, data integrity, transaction safety, and query performance. Critical for preventing catastrophic data issues.
64
+ ---
13
65
 
14
66
  ## Schema Testing
15
67
 
16
- **Validate database structure:**
17
- ```sql
18
- -- Test schema exists
19
- SELECT table_name FROM information_schema.tables
20
- WHERE table_schema = 'public' AND table_name = 'users';
21
-
22
- -- Test column types
23
- SELECT column_name, data_type
24
- FROM information_schema.columns
25
- WHERE table_name = 'users';
26
-
27
- -- Test constraints
28
- SELECT constraint_name, constraint_type
29
- FROM information_schema.table_constraints
30
- WHERE table_name = 'users';
31
- ```
32
-
33
- **Test with code:**
34
68
  ```javascript
35
69
  test('users table has correct schema', async () => {
36
70
  const schema = await db.raw(`
@@ -53,14 +87,14 @@ test('users table has correct schema', async () => {
53
87
  });
54
88
  ```
55
89
 
90
+ ---
91
+
56
92
  ## Data Integrity Testing
57
93
 
58
- **Test constraints:**
59
94
  ```javascript
60
95
  test('email must be unique', async () => {
61
96
  await db.users.create({ email: 'test@example.com' });
62
97
 
63
- // Duplicate should fail
64
98
  await expect(
65
99
  db.users.create({ email: 'test@example.com' })
66
100
  ).rejects.toThrow('unique constraint violation');
@@ -70,72 +104,46 @@ test('foreign key prevents orphaned records', async () => {
70
104
  const user = await db.users.create({ email: 'test@example.com' });
71
105
  await db.orders.create({ userId: user.id, total: 100 });
72
106
 
73
- // Cannot delete user with orders
74
107
  await expect(
75
108
  db.users.delete({ id: user.id })
76
109
  ).rejects.toThrow('foreign key constraint');
77
110
  });
78
-
79
- test('check constraint validates data', async () => {
80
- // Age must be ≥ 18
81
- await expect(
82
- db.users.create({ email: 'minor@example.com', age: 17 })
83
- ).rejects.toThrow('check constraint violation');
84
- });
85
111
  ```
86
112
 
113
+ ---
114
+
87
115
  ## Migration Testing
88
116
 
89
- **Test database migrations:**
90
117
  ```javascript
91
- import { migrate, rollback } from './migrations';
92
-
93
- test('migration adds users table', async () => {
94
- // Start fresh
95
- await rollback();
96
-
97
- // Run migration
98
- await migrate();
99
-
100
- // Verify table exists
101
- const tables = await db.raw(`
102
- SELECT table_name FROM information_schema.tables
103
- WHERE table_schema = 'public'
104
- `);
118
+ test('migration is reversible', async () => {
119
+ await migrate('add-users-table');
105
120
 
121
+ // Table exists after migration
122
+ const tables = await db.raw(`SELECT table_name FROM information_schema.tables`);
106
123
  expect(tables.map(t => t.table_name)).toContain('users');
107
- });
108
124
 
109
- test('migration is reversible', async () => {
110
- await migrate();
111
- await rollback();
125
+ await rollback('add-users-table');
112
126
 
113
- // Table should be gone
114
- const tables = await db.raw(`
115
- SELECT table_name FROM information_schema.tables
116
- WHERE table_schema = 'public'
117
- `);
118
-
119
- expect(tables.map(t => t.table_name)).not.toContain('users');
127
+ // Table gone after rollback
128
+ const tablesAfter = await db.raw(`SELECT table_name FROM information_schema.tables`);
129
+ expect(tablesAfter.map(t => t.table_name)).not.toContain('users');
120
130
  });
121
131
 
122
132
  test('migration preserves existing data', async () => {
123
- // Create data before migration
124
133
  await db.users.create({ email: 'test@example.com' });
125
134
 
126
- // Run migration that adds 'age' column
127
135
  await migrate('add-age-column');
128
136
 
129
- // Data should still exist
130
137
  const user = await db.users.findOne({ email: 'test@example.com' });
131
138
  expect(user).toBeDefined();
132
139
  expect(user.age).toBeNull(); // New column, null default
133
140
  });
134
141
  ```
135
142
 
136
- ## Transaction Isolation Testing
143
+ ---
144
+
145
+ ## Transaction Testing
137
146
 
138
- **Test ACID properties:**
139
147
  ```javascript
140
148
  test('transaction rolls back on error', async () => {
141
149
  const initialCount = await db.users.count();
@@ -144,94 +152,93 @@ test('transaction rolls back on error', async () => {
144
152
  await db.transaction(async (trx) => {
145
153
  await trx('users').insert({ email: 'user1@example.com' });
146
154
  await trx('users').insert({ email: 'user2@example.com' });
147
-
148
- // Force error
149
155
  throw new Error('Rollback test');
150
156
  });
151
- } catch (error) {
152
- // Expected
153
- }
157
+ } catch (error) { /* Expected */ }
154
158
 
155
- // No users should be inserted
156
- const finalCount = await db.users.count();
157
- expect(finalCount).toBe(initialCount);
159
+ expect(await db.users.count()).toBe(initialCount);
158
160
  });
159
161
 
160
- test('concurrent transactions are isolated', async () => {
161
- const user = await db.users.create({ email: 'test@example.com', balance: 100 });
162
-
163
- // Two concurrent withdrawals
164
- const withdraw1 = db.transaction(async (trx) => {
165
- const current = await trx('users').where({ id: user.id }).first();
166
- await sleep(100); // Simulate delay
167
- await trx('users').where({ id: user.id }).update({
168
- balance: current.balance - 50
169
- });
170
- });
162
+ test('concurrent transactions isolated', async () => {
163
+ const user = await db.users.create({ balance: 100 });
164
+
165
+ // Two concurrent withdrawals (race condition test)
166
+ await Promise.all([
167
+ db.transaction(async (trx) => {
168
+ const current = await trx('users').where({ id: user.id }).first();
169
+ await trx('users').update({ balance: current.balance - 50 });
170
+ }),
171
+ db.transaction(async (trx) => {
172
+ const current = await trx('users').where({ id: user.id }).first();
173
+ await trx('users').update({ balance: current.balance - 50 });
174
+ })
175
+ ]);
171
176
 
172
- const withdraw2 = db.transaction(async (trx) => {
173
- const current = await trx('users').where({ id: user.id }).first();
174
- await sleep(100);
175
- await trx('users').where({ id: user.id }).update({
176
- balance: current.balance - 50
177
- });
178
- });
179
-
180
- await Promise.all([withdraw1, withdraw2]);
181
-
182
- // With proper isolation, balance should be 0, not 50
183
177
  const final = await db.users.findOne({ id: user.id });
184
- expect(final.balance).toBe(0); // Not 50!
178
+ expect(final.balance).toBe(0); // Proper isolation
185
179
  });
186
180
  ```
187
181
 
188
- ## Query Performance Testing
182
+ ---
189
183
 
190
- **Test slow queries:**
191
- ```javascript
192
- test('user lookup by email is fast', async () => {
193
- // Seed 10,000 users
194
- await seedUsers(10000);
184
+ ## Agent-Driven Database Testing
185
+
186
+ ```typescript
187
+ // Generate test data with integrity
188
+ await Task("Generate Test Data", {
189
+ schema: 'ecommerce',
190
+ tables: ['users', 'products', 'orders'],
191
+ count: { users: 1000, products: 500, orders: 5000 },
192
+ preserveReferentialIntegrity: true
193
+ }, "qe-test-data-architect");
194
+
195
+ // Test migration safety
196
+ await Task("Migration Test", {
197
+ migration: 'add-payment-status-column',
198
+ tests: ['forward', 'rollback', 'data-preservation'],
199
+ environment: 'staging'
200
+ }, "qe-test-executor");
201
+ ```
195
202
 
196
- const start = Date.now();
197
- await db.users.findOne({ email: 'user5000@example.com' });
198
- const duration = Date.now() - start;
203
+ ---
199
204
 
200
- // Should use index on email
201
- expect(duration).toBeLessThan(10); // < 10ms
202
- });
205
+ ## Agent Coordination Hints
203
206
 
204
- test('EXPLAIN shows index usage', async () => {
205
- const explain = await db.raw(`
206
- EXPLAIN SELECT * FROM users WHERE email = 'test@example.com'
207
- `);
207
+ ### Memory Namespace
208
+ ```
209
+ aqe/database-testing/
210
+ ├── schema-snapshots/* - Current schema state
211
+ ├── migrations/* - Migration test results
212
+ ├── integrity/* - Constraint validation
213
+ └── performance/* - Query benchmarks
214
+ ```
208
215
 
209
- // Should show index scan, not sequential scan
210
- const plan = explain.rows[0]['QUERY PLAN'];
211
- expect(plan).toContain('Index Scan');
212
- expect(plan).not.toContain('Seq Scan');
216
+ ### Fleet Coordination
217
+ ```typescript
218
+ const dbFleet = await FleetManager.coordinate({
219
+ strategy: 'database-testing',
220
+ agents: [
221
+ 'qe-test-data-architect', // Generate test data
222
+ 'qe-test-executor', // Run DB tests
223
+ 'qe-performance-tester' // Query performance
224
+ ],
225
+ topology: 'sequential'
213
226
  });
214
227
  ```
215
228
 
229
+ ---
230
+
216
231
  ## Related Skills
232
+ - [test-data-management](../test-data-management/) - Generate test data
233
+ - [performance-testing](../performance-testing/) - Query performance
234
+ - [compliance-testing](../compliance-testing/) - Data protection
217
235
 
218
- - [test-data-management](../test-data-management/) - Generate test data for DB
219
- - [performance-testing](../performance-testing/) - DB performance testing
220
- - [test-automation-strategy](../test-automation-strategy/) - Automate DB tests
236
+ ---
221
237
 
222
238
  ## Remember
223
239
 
224
- **Database bugs are catastrophic.**
225
-
226
- - Data loss is unrecoverable
227
- - Corruption spreads silently
228
- - Performance issues compound
229
- - Migrations must be reversible
240
+ **Database bugs are catastrophic.** Data loss is unrecoverable. Corruption spreads silently. Performance issues compound.
230
241
 
231
- **Test migrations before production:**
232
- - Forward migration works
233
- - Backward rollback works
234
- - Data preserved/migrated correctly
235
- - Performance acceptable
242
+ **Test migrations before production:** Forward works, rollback works, data preserved, performance acceptable. Never deploy untested migrations.
236
243
 
237
- **With Agents:** `qe-test-data-architect` generates realistic test data with referential integrity. `qe-test-executor` runs DB migration tests automatically in CI/CD.
244
+ **With Agents:** `qe-test-data-architect` generates realistic test data with referential integrity. `qe-test-executor` validates migrations automatically in CI/CD.