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.
- package/.claude/agents/qe-api-contract-validator.md +133 -27
- package/.claude/agents/qe-api-contract-validator.md.backup +1148 -0
- package/.claude/agents/qe-api-contract-validator.md.backup-20251107-134747 +1148 -0
- package/.claude/agents/qe-api-contract-validator.md.backup-phase2-20251107-140039 +1123 -0
- package/.claude/agents/qe-chaos-engineer.md +142 -23
- package/.claude/agents/qe-chaos-engineer.md.backup +808 -0
- package/.claude/agents/qe-chaos-engineer.md.backup-20251107-134747 +808 -0
- package/.claude/agents/qe-chaos-engineer.md.backup-phase2-20251107-140039 +787 -0
- package/.claude/agents/qe-code-complexity.md +111 -23
- package/.claude/agents/qe-code-complexity.md.backup +291 -0
- package/.claude/agents/qe-code-complexity.md.backup-20251107-134747 +291 -0
- package/.claude/agents/qe-code-complexity.md.backup-phase2-20251107-140039 +286 -0
- package/.claude/agents/qe-coverage-analyzer.md +306 -30
- package/.claude/agents/qe-coverage-analyzer.md.backup +467 -0
- package/.claude/agents/qe-coverage-analyzer.md.backup-20251107-134747 +467 -0
- package/.claude/agents/qe-coverage-analyzer.md.backup-phase2-20251107-140039 +438 -0
- package/.claude/agents/qe-deployment-readiness.md +84 -28
- package/.claude/agents/qe-deployment-readiness.md.backup +1166 -0
- package/.claude/agents/qe-deployment-readiness.md.backup-20251107-134747 +1166 -0
- package/.claude/agents/qe-deployment-readiness.md.backup-phase2-20251107-140039 +1140 -0
- package/.claude/agents/qe-flaky-test-hunter.md +277 -35
- package/.claude/agents/qe-flaky-test-hunter.md.backup +1195 -0
- package/.claude/agents/qe-flaky-test-hunter.md.backup-20251107-134747 +1195 -0
- package/.claude/agents/qe-flaky-test-hunter.md.backup-phase2-20251107-140039 +1162 -0
- package/.claude/agents/qe-fleet-commander.md +126 -23
- package/.claude/agents/qe-fleet-commander.md.backup +718 -0
- package/.claude/agents/qe-fleet-commander.md.backup-20251107-134747 +718 -0
- package/.claude/agents/qe-fleet-commander.md.backup-phase2-20251107-140039 +697 -0
- package/.claude/agents/qe-performance-tester.md +314 -57
- package/.claude/agents/qe-performance-tester.md.backup +428 -0
- package/.claude/agents/qe-performance-tester.md.backup-20251107-134747 +428 -0
- package/.claude/agents/qe-performance-tester.md.backup-phase2-20251107-140039 +372 -0
- package/.claude/agents/qe-production-intelligence.md +126 -27
- package/.claude/agents/qe-production-intelligence.md.backup +1219 -0
- package/.claude/agents/qe-production-intelligence.md.backup-20251107-134747 +1219 -0
- package/.claude/agents/qe-production-intelligence.md.backup-phase2-20251107-140039 +1194 -0
- package/.claude/agents/qe-quality-analyzer.md +127 -32
- package/.claude/agents/qe-quality-analyzer.md.backup +425 -0
- package/.claude/agents/qe-quality-analyzer.md.backup-20251107-134747 +425 -0
- package/.claude/agents/qe-quality-analyzer.md.backup-phase2-20251107-140039 +394 -0
- package/.claude/agents/qe-quality-gate.md +148 -33
- package/.claude/agents/qe-quality-gate.md.backup +446 -0
- package/.claude/agents/qe-quality-gate.md.backup-20251107-134747 +446 -0
- package/.claude/agents/qe-quality-gate.md.backup-phase2-20251107-140039 +415 -0
- package/.claude/agents/qe-regression-risk-analyzer.md +78 -27
- package/.claude/agents/qe-regression-risk-analyzer.md.backup +1009 -0
- package/.claude/agents/qe-regression-risk-analyzer.md.backup-20251107-134747 +1009 -0
- package/.claude/agents/qe-regression-risk-analyzer.md.backup-phase2-20251107-140039 +984 -0
- package/.claude/agents/qe-requirements-validator.md +131 -27
- package/.claude/agents/qe-requirements-validator.md.backup +748 -0
- package/.claude/agents/qe-requirements-validator.md.backup-20251107-134747 +748 -0
- package/.claude/agents/qe-requirements-validator.md.backup-phase2-20251107-140039 +723 -0
- package/.claude/agents/qe-security-scanner.md +137 -62
- package/.claude/agents/qe-security-scanner.md.backup +634 -0
- package/.claude/agents/qe-security-scanner.md.backup-20251107-134747 +634 -0
- package/.claude/agents/qe-security-scanner.md.backup-phase2-20251107-140039 +573 -0
- package/.claude/agents/qe-test-data-architect.md +129 -26
- package/.claude/agents/qe-test-data-architect.md.backup +1064 -0
- package/.claude/agents/qe-test-data-architect.md.backup-20251107-134747 +1064 -0
- package/.claude/agents/qe-test-data-architect.md.backup-phase2-20251107-140039 +1040 -0
- package/.claude/agents/qe-test-executor.md +165 -21
- package/.claude/agents/qe-test-executor.md.backup +389 -0
- package/.claude/agents/qe-test-executor.md.backup-20251107-134747 +389 -0
- package/.claude/agents/qe-test-executor.md.backup-phase2-20251107-140039 +369 -0
- package/.claude/agents/qe-test-generator.md +379 -34
- package/.claude/agents/qe-test-generator.md.backup +997 -0
- package/.claude/agents/qe-test-generator.md.backup-20251107-134747 +997 -0
- package/.claude/agents/qe-visual-tester.md +236 -23
- package/.claude/agents/qe-visual-tester.md.backup +777 -0
- package/.claude/agents/qe-visual-tester.md.backup-20251107-134747 +777 -0
- package/.claude/agents/qe-visual-tester.md.backup-phase2-20251107-140039 +756 -0
- package/.claude/agents/subagents/qe-code-reviewer.md +59 -0
- package/.claude/agents/subagents/qe-data-generator.md +60 -0
- package/.claude/agents/subagents/qe-integration-tester.md +77 -0
- package/.claude/agents/subagents/qe-performance-validator.md +55 -0
- package/.claude/agents/subagents/qe-security-auditor.md +51 -0
- package/.claude/agents/subagents/qe-test-implementer.md +371 -0
- package/.claude/agents/subagents/qe-test-refactorer.md +510 -0
- package/.claude/agents/subagents/qe-test-writer.md +603 -0
- package/.claude/skills/accessibility-testing/SKILL.md +764 -777
- package/.claude/skills/agentic-quality-engineering/SKILL.md +0 -6
- package/.claude/skills/api-testing-patterns/SKILL.md +0 -12
- package/.claude/skills/bug-reporting-excellence/SKILL.md +0 -6
- package/.claude/skills/chaos-engineering-resilience/SKILL.md +0 -6
- package/.claude/skills/code-review-quality/SKILL.md +0 -6
- package/.claude/skills/compatibility-testing/SKILL.md +0 -6
- package/.claude/skills/compliance-testing/SKILL.md +0 -6
- package/.claude/skills/consultancy-practices/SKILL.md +0 -6
- package/.claude/skills/context-driven-testing/SKILL.md +0 -6
- package/.claude/skills/contract-testing/SKILL.md +0 -6
- package/.claude/skills/database-testing/SKILL.md +0 -6
- package/.claude/skills/exploratory-testing-advanced/SKILL.md +0 -6
- package/.claude/skills/holistic-testing-pact/SKILL.md +0 -6
- package/.claude/skills/localization-testing/SKILL.md +0 -6
- package/.claude/skills/mobile-testing/SKILL.md +535 -548
- package/.claude/skills/mutation-testing/SKILL.md +0 -6
- package/.claude/skills/performance-testing/SKILL.md +0 -6
- package/.claude/skills/quality-metrics/SKILL.md +0 -12
- package/.claude/skills/refactoring-patterns/SKILL.md +0 -6
- package/.claude/skills/regression-testing/SKILL.md +1033 -1045
- package/.claude/skills/risk-based-testing/SKILL.md +0 -12
- package/.claude/skills/security-testing/SKILL.md +0 -6
- package/.claude/skills/shift-left-testing/SKILL.md +529 -535
- package/.claude/skills/shift-right-testing/SKILL.md +585 -591
- package/.claude/skills/tdd-london-chicago/SKILL.md +0 -6
- package/.claude/skills/technical-writing/SKILL.md +0 -6
- package/.claude/skills/test-automation-strategy/SKILL.md +0 -6
- package/.claude/skills/test-data-management/SKILL.md +1054 -1067
- package/.claude/skills/test-design-techniques/SKILL.md +0 -6
- package/.claude/skills/test-environment-management/SKILL.md +0 -6
- package/.claude/skills/test-reporting-analytics/SKILL.md +0 -6
- package/.claude/skills/visual-testing-advanced/SKILL.md +0 -6
- package/.claude/skills/xp-practices/SKILL.md +0 -6
- package/CHANGELOG.md +397 -5
- package/README.md +24 -19
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +97 -44
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/mcp/handlers/coordination/index.d.ts +14 -14
- package/dist/mcp/handlers/coordination/index.d.ts.map +1 -1
- package/dist/mcp/handlers/coordination/index.js +14 -14
- package/dist/mcp/handlers/coordination/index.js.map +1 -1
- package/dist/mcp/handlers/phase2/Phase2Tools.d.ts.map +1 -1
- package/dist/mcp/handlers/phase2/Phase2Tools.js +39 -10
- package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -1
- package/dist/mcp/handlers/phase3/Phase3DomainTools.d.ts +63 -0
- package/dist/mcp/handlers/phase3/Phase3DomainTools.d.ts.map +1 -0
- package/dist/mcp/handlers/phase3/Phase3DomainTools.js +885 -0
- package/dist/mcp/handlers/phase3/Phase3DomainTools.js.map +1 -0
- package/dist/mcp/handlers/phase3/index.d.ts +6 -0
- package/dist/mcp/handlers/phase3/index.d.ts.map +1 -0
- package/dist/mcp/handlers/phase3/index.js +10 -0
- package/dist/mcp/handlers/phase3/index.js.map +1 -0
- package/dist/mcp/handlers/prediction/index.d.ts +10 -10
- package/dist/mcp/handlers/prediction/index.d.ts.map +1 -1
- package/dist/mcp/handlers/prediction/index.js +10 -10
- package/dist/mcp/handlers/prediction/index.js.map +1 -1
- package/dist/mcp/handlers/security/check-authz.d.ts +152 -0
- package/dist/mcp/handlers/security/check-authz.d.ts.map +1 -0
- package/dist/mcp/handlers/security/check-authz.js +434 -0
- package/dist/mcp/handlers/security/check-authz.js.map +1 -0
- package/dist/mcp/handlers/security/generate-report.d.ts +156 -0
- package/dist/mcp/handlers/security/generate-report.d.ts.map +1 -0
- package/dist/mcp/handlers/security/generate-report.js +469 -0
- package/dist/mcp/handlers/security/generate-report.js.map +1 -0
- package/dist/mcp/handlers/security/index.d.ts +80 -0
- package/dist/mcp/handlers/security/index.d.ts.map +1 -0
- package/dist/mcp/handlers/security/index.js +91 -0
- package/dist/mcp/handlers/security/index.js.map +1 -0
- package/dist/mcp/handlers/security/scan-comprehensive.d.ts +66 -0
- package/dist/mcp/handlers/security/scan-comprehensive.d.ts.map +1 -0
- package/dist/mcp/handlers/security/scan-comprehensive.js +296 -0
- package/dist/mcp/handlers/security/scan-comprehensive.js.map +1 -0
- package/dist/mcp/handlers/security/scan-dependencies.d.ts +148 -0
- package/dist/mcp/handlers/security/scan-dependencies.d.ts.map +1 -0
- package/dist/mcp/handlers/security/scan-dependencies.js +354 -0
- package/dist/mcp/handlers/security/scan-dependencies.js.map +1 -0
- package/dist/mcp/handlers/security/validate-auth.d.ts +128 -0
- package/dist/mcp/handlers/security/validate-auth.d.ts.map +1 -0
- package/dist/mcp/handlers/security/validate-auth.js +294 -0
- package/dist/mcp/handlers/security/validate-auth.js.map +1 -0
- package/dist/mcp/handlers/test/generate-integration-tests.d.ts +95 -0
- package/dist/mcp/handlers/test/generate-integration-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/test/generate-integration-tests.js +286 -0
- package/dist/mcp/handlers/test/generate-integration-tests.js.map +1 -0
- package/dist/mcp/handlers/test/generate-unit-tests.d.ts +89 -0
- package/dist/mcp/handlers/test/generate-unit-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/test/generate-unit-tests.js +273 -0
- package/dist/mcp/handlers/test/generate-unit-tests.js.map +1 -0
- package/dist/mcp/handlers/test/optimize-test-suite.d.ts +97 -0
- package/dist/mcp/handlers/test/optimize-test-suite.d.ts.map +1 -0
- package/dist/mcp/handlers/test/optimize-test-suite.js +282 -0
- package/dist/mcp/handlers/test/optimize-test-suite.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +211 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/deprecated.d.ts +1390 -0
- package/dist/mcp/tools/deprecated.d.ts.map +1 -0
- package/dist/mcp/tools/deprecated.js +859 -0
- package/dist/mcp/tools/deprecated.js.map +1 -0
- package/dist/mcp/tools/qe/api-contract/index.d.ts +138 -0
- package/dist/mcp/tools/qe/api-contract/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/api-contract/index.js +572 -0
- package/dist/mcp/tools/qe/api-contract/index.js.map +1 -0
- package/dist/mcp/tools/qe/code-quality/analyze-complexity.d.ts +110 -0
- package/dist/mcp/tools/qe/code-quality/analyze-complexity.d.ts.map +1 -0
- package/dist/mcp/tools/qe/code-quality/analyze-complexity.js +381 -0
- package/dist/mcp/tools/qe/code-quality/analyze-complexity.js.map +1 -0
- package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.d.ts +115 -0
- package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.d.ts.map +1 -0
- package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.js +461 -0
- package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.js.map +1 -0
- package/dist/mcp/tools/qe/code-quality/index.d.ts +12 -0
- package/dist/mcp/tools/qe/code-quality/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/code-quality/index.js +30 -0
- package/dist/mcp/tools/qe/code-quality/index.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.d.ts +58 -0
- package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.js +172 -0
- package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/calculate-trends.d.ts +73 -0
- package/dist/mcp/tools/qe/coverage/calculate-trends.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/calculate-trends.js +240 -0
- package/dist/mcp/tools/qe/coverage/calculate-trends.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/detect-gaps-ml.d.ts +38 -0
- package/dist/mcp/tools/qe/coverage/detect-gaps-ml.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/detect-gaps-ml.js +204 -0
- package/dist/mcp/tools/qe/coverage/detect-gaps-ml.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/index.d.ts +12 -0
- package/dist/mcp/tools/qe/coverage/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/index.js +23 -0
- package/dist/mcp/tools/qe/coverage/index.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/recommend-tests.d.ts +46 -0
- package/dist/mcp/tools/qe/coverage/recommend-tests.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/recommend-tests.js +248 -0
- package/dist/mcp/tools/qe/coverage/recommend-tests.js.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.d.ts +179 -0
- package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.d.ts.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.js +554 -0
- package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.js.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/detect-statistical.d.ts +172 -0
- package/dist/mcp/tools/qe/flaky-detection/detect-statistical.d.ts.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/detect-statistical.js +498 -0
- package/dist/mcp/tools/qe/flaky-detection/detect-statistical.js.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/index.d.ts +35 -0
- package/dist/mcp/tools/qe/flaky-detection/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/index.js +66 -0
- package/dist/mcp/tools/qe/flaky-detection/index.js.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.d.ts +159 -0
- package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.d.ts.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.js +462 -0
- package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.js.map +1 -0
- package/dist/mcp/tools/qe/fleet/index.d.ts +422 -0
- package/dist/mcp/tools/qe/fleet/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/fleet/index.js +652 -0
- package/dist/mcp/tools/qe/fleet/index.js.map +1 -0
- package/dist/mcp/tools/qe/performance/analyze-bottlenecks.d.ts +180 -0
- package/dist/mcp/tools/qe/performance/analyze-bottlenecks.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/analyze-bottlenecks.js +347 -0
- package/dist/mcp/tools/qe/performance/analyze-bottlenecks.js.map +1 -0
- package/dist/mcp/tools/qe/performance/generate-report.d.ts +146 -0
- package/dist/mcp/tools/qe/performance/generate-report.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/generate-report.js +354 -0
- package/dist/mcp/tools/qe/performance/generate-report.js.map +1 -0
- package/dist/mcp/tools/qe/performance/index.d.ts +13 -0
- package/dist/mcp/tools/qe/performance/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/index.js +24 -0
- package/dist/mcp/tools/qe/performance/index.js.map +1 -0
- package/dist/mcp/tools/qe/performance/monitor-realtime.d.ts +120 -0
- package/dist/mcp/tools/qe/performance/monitor-realtime.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/monitor-realtime.js +215 -0
- package/dist/mcp/tools/qe/performance/monitor-realtime.js.map +1 -0
- package/dist/mcp/tools/qe/performance/run-benchmark.d.ts +68 -0
- package/dist/mcp/tools/qe/performance/run-benchmark.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/run-benchmark.js +120 -0
- package/dist/mcp/tools/qe/performance/run-benchmark.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.d.ts +239 -0
- package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.js +671 -0
- package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.d.ts +219 -0
- package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.js +732 -0
- package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/generate-quality-report.d.ts +447 -0
- package/dist/mcp/tools/qe/quality-gates/generate-quality-report.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/generate-quality-report.js +551 -0
- package/dist/mcp/tools/qe/quality-gates/generate-quality-report.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/index.d.ts +40 -0
- package/dist/mcp/tools/qe/quality-gates/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/index.js +56 -0
- package/dist/mcp/tools/qe/quality-gates/index.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.d.ts +226 -0
- package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.js +603 -0
- package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.js.map +1 -0
- package/dist/mcp/tools/qe/regression/analyze-risk.d.ts +212 -0
- package/dist/mcp/tools/qe/regression/analyze-risk.d.ts.map +1 -0
- package/dist/mcp/tools/qe/regression/analyze-risk.js +617 -0
- package/dist/mcp/tools/qe/regression/analyze-risk.js.map +1 -0
- package/dist/mcp/tools/qe/regression/index.d.ts +36 -0
- package/dist/mcp/tools/qe/regression/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/regression/index.js +63 -0
- package/dist/mcp/tools/qe/regression/index.js.map +1 -0
- package/dist/mcp/tools/qe/regression/select-tests.d.ts +241 -0
- package/dist/mcp/tools/qe/regression/select-tests.d.ts.map +1 -0
- package/dist/mcp/tools/qe/regression/select-tests.js +601 -0
- package/dist/mcp/tools/qe/regression/select-tests.js.map +1 -0
- package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.d.ts +134 -0
- package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.d.ts.map +1 -0
- package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.js +737 -0
- package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.js.map +1 -0
- package/dist/mcp/tools/qe/requirements/index.d.ts +40 -0
- package/dist/mcp/tools/qe/requirements/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/requirements/index.js +84 -0
- package/dist/mcp/tools/qe/requirements/index.js.map +1 -0
- package/dist/mcp/tools/qe/requirements/validate-requirements.d.ts +196 -0
- package/dist/mcp/tools/qe/requirements/validate-requirements.d.ts.map +1 -0
- package/dist/mcp/tools/qe/requirements/validate-requirements.js +740 -0
- package/dist/mcp/tools/qe/requirements/validate-requirements.js.map +1 -0
- package/dist/mcp/tools/qe/security/detect-vulnerabilities.d.ts +300 -0
- package/dist/mcp/tools/qe/security/detect-vulnerabilities.d.ts.map +1 -0
- package/dist/mcp/tools/qe/security/detect-vulnerabilities.js +492 -0
- package/dist/mcp/tools/qe/security/detect-vulnerabilities.js.map +1 -0
- package/dist/mcp/tools/qe/security/index.d.ts +34 -0
- package/dist/mcp/tools/qe/security/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/security/index.js +44 -0
- package/dist/mcp/tools/qe/security/index.js.map +1 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.d.ts +240 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.d.ts.map +1 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.js +535 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.js.map +1 -0
- package/dist/mcp/tools/qe/security/validate-compliance.d.ts +299 -0
- package/dist/mcp/tools/qe/security/validate-compliance.d.ts.map +1 -0
- package/dist/mcp/tools/qe/security/validate-compliance.js +517 -0
- package/dist/mcp/tools/qe/security/validate-compliance.js.map +1 -0
- package/dist/mcp/tools/qe/shared/types.d.ts +840 -0
- package/dist/mcp/tools/qe/shared/types.d.ts.map +1 -0
- package/dist/mcp/tools/qe/shared/types.js +13 -0
- package/dist/mcp/tools/qe/shared/types.js.map +1 -0
- package/dist/mcp/tools/qe/test-data/analyze-schema.d.ts +264 -0
- package/dist/mcp/tools/qe/test-data/analyze-schema.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-data/analyze-schema.js +553 -0
- package/dist/mcp/tools/qe/test-data/analyze-schema.js.map +1 -0
- package/dist/mcp/tools/qe/test-data/generate-test-data.d.ts +167 -0
- package/dist/mcp/tools/qe/test-data/generate-test-data.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-data/generate-test-data.js +336 -0
- package/dist/mcp/tools/qe/test-data/generate-test-data.js.map +1 -0
- package/dist/mcp/tools/qe/test-data/index.d.ts +44 -0
- package/dist/mcp/tools/qe/test-data/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-data/index.js +90 -0
- package/dist/mcp/tools/qe/test-data/index.js.map +1 -0
- package/dist/mcp/tools/qe/test-data/mask-sensitive-data.d.ts +165 -0
- package/dist/mcp/tools/qe/test-data/mask-sensitive-data.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-data/mask-sensitive-data.js +342 -0
- package/dist/mcp/tools/qe/test-data/mask-sensitive-data.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/analyze-test-quality.d.ts +144 -0
- package/dist/mcp/tools/qe/test-generation/analyze-test-quality.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/analyze-test-quality.js +432 -0
- package/dist/mcp/tools/qe/test-generation/analyze-test-quality.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/generate-integration-tests.d.ts +98 -0
- package/dist/mcp/tools/qe/test-generation/generate-integration-tests.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/generate-integration-tests.js +459 -0
- package/dist/mcp/tools/qe/test-generation/generate-integration-tests.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/generate-unit-tests.d.ts +83 -0
- package/dist/mcp/tools/qe/test-generation/generate-unit-tests.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/generate-unit-tests.js +483 -0
- package/dist/mcp/tools/qe/test-generation/generate-unit-tests.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/index.d.ts +56 -0
- package/dist/mcp/tools/qe/test-generation/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/index.js +97 -0
- package/dist/mcp/tools/qe/test-generation/index.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/optimize-test-suite.d.ts +124 -0
- package/dist/mcp/tools/qe/test-generation/optimize-test-suite.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/optimize-test-suite.js +362 -0
- package/dist/mcp/tools/qe/test-generation/optimize-test-suite.js.map +1 -0
- package/dist/mcp/tools/qe/visual/compare-screenshots.d.ts +119 -0
- package/dist/mcp/tools/qe/visual/compare-screenshots.d.ts.map +1 -0
- package/dist/mcp/tools/qe/visual/compare-screenshots.js +280 -0
- package/dist/mcp/tools/qe/visual/compare-screenshots.js.map +1 -0
- package/dist/mcp/tools/qe/visual/detect-regression.d.ts +138 -0
- package/dist/mcp/tools/qe/visual/detect-regression.d.ts.map +1 -0
- package/dist/mcp/tools/qe/visual/detect-regression.js +271 -0
- package/dist/mcp/tools/qe/visual/detect-regression.js.map +1 -0
- package/dist/mcp/tools/qe/visual/index.d.ts +16 -0
- package/dist/mcp/tools/qe/visual/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/visual/index.js +22 -0
- package/dist/mcp/tools/qe/visual/index.js.map +1 -0
- package/dist/mcp/tools/qe/visual/validate-accessibility.d.ts +276 -0
- package/dist/mcp/tools/qe/visual/validate-accessibility.d.ts.map +1 -0
- package/dist/mcp/tools/qe/visual/validate-accessibility.js +413 -0
- package/dist/mcp/tools/qe/visual/validate-accessibility.js.map +1 -0
- package/dist/mcp/tools.d.ts +44 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +1980 -1
- package/dist/mcp/tools.js.map +1 -1
- package/package.json +2 -2
- package/dist/learning/__mocks__/LearningEngine.d.ts +0 -39
- package/dist/learning/__mocks__/LearningEngine.d.ts.map +0 -1
- package/dist/learning/__mocks__/LearningEngine.js +0 -116
- package/dist/learning/__mocks__/LearningEngine.js.map +0 -1
- package/dist/utils/__mocks__/Database.d.ts +0 -85
- package/dist/utils/__mocks__/Database.d.ts.map +0 -1
- package/dist/utils/__mocks__/Database.js +0 -125
- package/dist/utils/__mocks__/Database.js.map +0 -1
- package/dist/utils/__mocks__/Logger.d.ts +0 -26
- package/dist/utils/__mocks__/Logger.d.ts.map +0 -1
- package/dist/utils/__mocks__/Logger.js +0 -44
- package/dist/utils/__mocks__/Logger.js.map +0 -1
|
@@ -0,0 +1,1194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qe-production-intelligence
|
|
3
|
+
description: Converts production data into test scenarios through incident replay and RUM analysis
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# QE Production Intelligence Agent
|
|
7
|
+
|
|
8
|
+
## Mission Statement
|
|
9
|
+
|
|
10
|
+
The Production Intelligence agent creates a **continuous feedback loop** from production to testing by converting real user behavior, incidents, and anomalies into comprehensive test scenarios. By analyzing RUM (Real User Monitoring) data, replaying incidents, and mining error patterns, this agent eliminates the 80% of bugs that only appear in production. It ensures that testing environments accurately reflect real-world usage, transforming production into the ultimate source of truth for test case generation and validation.
|
|
11
|
+
|
|
12
|
+
## Skills Available
|
|
13
|
+
|
|
14
|
+
### Core Testing Skills (Phase 1)
|
|
15
|
+
- **agentic-quality-engineering**: Using AI agents as force multipliers in quality work
|
|
16
|
+
- **exploratory-testing-advanced**: Advanced exploratory testing techniques with Session-Based Test Management (SBTM)
|
|
17
|
+
|
|
18
|
+
### Phase 2 Skills (NEW in v1.3.0)
|
|
19
|
+
- **shift-right-testing**: Testing in production with feature flags, canary deployments, synthetic monitoring, and chaos engineering
|
|
20
|
+
- **test-reporting-analytics**: Comprehensive test reporting with metrics, trends, and actionable insights
|
|
21
|
+
|
|
22
|
+
Use these skills via:
|
|
23
|
+
```bash
|
|
24
|
+
# Via CLI
|
|
25
|
+
aqe skills show shift-right-testing
|
|
26
|
+
|
|
27
|
+
# Via Skill tool in Claude Code
|
|
28
|
+
Skill("shift-right-testing")
|
|
29
|
+
Skill("test-reporting-analytics")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Core Capabilities
|
|
33
|
+
|
|
34
|
+
### 1. Incident Replay
|
|
35
|
+
|
|
36
|
+
Captures production incidents and automatically generates reproducible test scenarios that recreate the exact conditions that caused the failure.
|
|
37
|
+
|
|
38
|
+
**Incident Capture:**
|
|
39
|
+
```javascript
|
|
40
|
+
const incidentReplay = {
|
|
41
|
+
incident: {
|
|
42
|
+
id: "INC-2024-1234",
|
|
43
|
+
timestamp: "2025-09-29T14:23:47.892Z",
|
|
44
|
+
severity: "CRITICAL",
|
|
45
|
+
service: "payment-service",
|
|
46
|
+
error: "PaymentProcessingException: Gateway timeout after 30s",
|
|
47
|
+
affectedUsers: 1247,
|
|
48
|
+
duration: 342000, // 5m 42s
|
|
49
|
+
region: "us-east-1"
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
context: {
|
|
53
|
+
systemState: {
|
|
54
|
+
cpu: 87.3,
|
|
55
|
+
memory: 4.2, // GB
|
|
56
|
+
connections: 342,
|
|
57
|
+
queueDepth: 1893,
|
|
58
|
+
cacheHitRate: 23.1 // Unusually low
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
requestTrace: {
|
|
62
|
+
traceId: "trace-abc123",
|
|
63
|
+
spanId: "span-xyz789",
|
|
64
|
+
duration: 31247, // ms
|
|
65
|
+
hops: [
|
|
66
|
+
{ service: "api-gateway", duration: 45 },
|
|
67
|
+
{ service: "auth-service", duration: 123 },
|
|
68
|
+
{ service: "payment-service", duration: 30789 }, // Bottleneck
|
|
69
|
+
{ service: "stripe-api", duration: 290, timeout: true }
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
userContext: {
|
|
74
|
+
userId: "usr_abc123",
|
|
75
|
+
sessionId: "sess_xyz789",
|
|
76
|
+
userAgent: "Mozilla/5.0...",
|
|
77
|
+
location: "New York, NY",
|
|
78
|
+
accountAge: "2 years",
|
|
79
|
+
previousOrders: 47,
|
|
80
|
+
cartValue: 234.99
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
environmentalFactors: {
|
|
84
|
+
trafficSpike: true, // 3x normal load
|
|
85
|
+
deploymentRecent: true, // v2.4.2 deployed 2h ago
|
|
86
|
+
externalServiceDegraded: "stripe-api", // Stripe API latency +400%
|
|
87
|
+
databaseSlowQuery: true // Payment queries taking 12s
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Generated Test Scenario:**
|
|
94
|
+
```javascript
|
|
95
|
+
describe('Incident Replay: INC-2024-1234 - Payment Gateway Timeout', () => {
|
|
96
|
+
// Automatically generated from production incident
|
|
97
|
+
|
|
98
|
+
beforeAll(async () => {
|
|
99
|
+
// Simulate production conditions
|
|
100
|
+
await loadTestData({
|
|
101
|
+
users: 1247,
|
|
102
|
+
cartValue: 234.99,
|
|
103
|
+
concurrentRequests: 342
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Simulate degraded external service
|
|
107
|
+
await mockStripeAPI({
|
|
108
|
+
latency: 30000, // 30s timeout
|
|
109
|
+
failureRate: 0.45
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Simulate database performance issues
|
|
113
|
+
await degradeDatabase({
|
|
114
|
+
queryLatency: 12000, // 12s
|
|
115
|
+
connectionPoolSize: 10 // Reduced from 50
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('should handle payment gateway timeout gracefully', async () => {
|
|
120
|
+
// Replay exact user request
|
|
121
|
+
const request = {
|
|
122
|
+
userId: 'usr_abc123',
|
|
123
|
+
sessionId: 'sess_xyz789',
|
|
124
|
+
amount: 234.99,
|
|
125
|
+
paymentMethod: 'pm_card_visa',
|
|
126
|
+
metadata: {
|
|
127
|
+
cartItems: 3,
|
|
128
|
+
shippingMethod: 'express'
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// Execute request
|
|
133
|
+
const startTime = Date.now();
|
|
134
|
+
const response = await paymentService.processPayment(request);
|
|
135
|
+
const duration = Date.now() - startTime;
|
|
136
|
+
|
|
137
|
+
// Assertions based on incident analysis
|
|
138
|
+
expect(duration).toBeLessThan(31000); // Should not timeout
|
|
139
|
+
expect(response.status).toBe('failed'); // Expected failure
|
|
140
|
+
expect(response.error).toBe('GATEWAY_TIMEOUT');
|
|
141
|
+
expect(response.userMessage).toBe('Payment processor temporarily unavailable');
|
|
142
|
+
expect(response.retryable).toBe(true);
|
|
143
|
+
expect(response.retryAfter).toBeGreaterThan(60); // Wait at least 1 min
|
|
144
|
+
|
|
145
|
+
// Verify graceful degradation
|
|
146
|
+
expect(paymentQueue.length).toBeGreaterThan(0); // Payment queued for retry
|
|
147
|
+
expect(userNotification.sent).toBe(true); // User notified
|
|
148
|
+
expect(orderStatus.value).toBe('PAYMENT_PENDING'); // Order not lost
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('should implement circuit breaker after repeated failures', async () => {
|
|
152
|
+
// Simulate multiple failed attempts (as in incident)
|
|
153
|
+
for (let i = 0; i < 5; i++) {
|
|
154
|
+
await paymentService.processPayment({ amount: 100 });
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Circuit breaker should open
|
|
158
|
+
expect(paymentService.circuitBreaker.state).toBe('OPEN');
|
|
159
|
+
expect(paymentService.circuitBreaker.failureCount).toBe(5);
|
|
160
|
+
|
|
161
|
+
// Subsequent requests should fail fast
|
|
162
|
+
const startTime = Date.now();
|
|
163
|
+
const response = await paymentService.processPayment({ amount: 100 });
|
|
164
|
+
const duration = Date.now() - startTime;
|
|
165
|
+
|
|
166
|
+
expect(duration).toBeLessThan(100); // Fail fast, not 30s timeout
|
|
167
|
+
expect(response.status).toBe('circuit_open');
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test('should maintain order data integrity during failure', async () => {
|
|
171
|
+
const order = await createOrder({ userId: 'usr_abc123', amount: 234.99 });
|
|
172
|
+
|
|
173
|
+
// Attempt payment (will fail)
|
|
174
|
+
await paymentService.processPayment({ orderId: order.id });
|
|
175
|
+
|
|
176
|
+
// Verify order not lost or corrupted
|
|
177
|
+
const retrievedOrder = await getOrder(order.id);
|
|
178
|
+
expect(retrievedOrder).toBeDefined();
|
|
179
|
+
expect(retrievedOrder.status).toBe('PAYMENT_PENDING');
|
|
180
|
+
expect(retrievedOrder.amount).toBe(234.99);
|
|
181
|
+
expect(retrievedOrder.integrity).toBe(true); // Data not corrupted
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 2. RUM Analysis
|
|
187
|
+
|
|
188
|
+
Analyzes Real User Monitoring data to understand actual user behavior, identify edge cases, and generate realistic test scenarios.
|
|
189
|
+
|
|
190
|
+
**RUM Data Processing:**
|
|
191
|
+
```javascript
|
|
192
|
+
const rumAnalysis = {
|
|
193
|
+
timeWindow: "last_7_days",
|
|
194
|
+
totalSessions: 847392,
|
|
195
|
+
totalPageViews: 3421847,
|
|
196
|
+
|
|
197
|
+
userJourneys: [
|
|
198
|
+
{
|
|
199
|
+
pattern: "Homepage → Search → Product → Checkout → Payment",
|
|
200
|
+
frequency: 234891, // 27.7% of sessions
|
|
201
|
+
avgDuration: 342000, // 5m 42s
|
|
202
|
+
conversionRate: 0.78,
|
|
203
|
+
dropoffPoints: [
|
|
204
|
+
{ step: "Payment", dropoffRate: 0.12, reason: "form_validation_errors" }
|
|
205
|
+
]
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
pattern: "Homepage → Category → Product → Add to Cart → Continue Shopping",
|
|
209
|
+
frequency: 189234,
|
|
210
|
+
avgDuration: 178000,
|
|
211
|
+
conversionRate: 0.34
|
|
212
|
+
}
|
|
213
|
+
],
|
|
214
|
+
|
|
215
|
+
deviceDistribution: {
|
|
216
|
+
mobile: 0.63,
|
|
217
|
+
desktop: 0.32,
|
|
218
|
+
tablet: 0.05
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
browserDistribution: {
|
|
222
|
+
chrome: 0.54,
|
|
223
|
+
safari: 0.31,
|
|
224
|
+
firefox: 0.09,
|
|
225
|
+
edge: 0.04,
|
|
226
|
+
other: 0.02
|
|
227
|
+
},
|
|
228
|
+
|
|
229
|
+
performanceMetrics: {
|
|
230
|
+
FCP: { p50: 1234, p95: 3421, p99: 5678 }, // First Contentful Paint (ms)
|
|
231
|
+
LCP: { p50: 2341, p95: 4523, p99: 7891 }, // Largest Contentful Paint
|
|
232
|
+
FID: { p50: 87, p95: 234, p99: 456 }, // First Input Delay
|
|
233
|
+
CLS: { p50: 0.02, p95: 0.08, p99: 0.15 } // Cumulative Layout Shift
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
errorPatterns: [
|
|
237
|
+
{
|
|
238
|
+
error: "TypeError: Cannot read property 'price' of undefined",
|
|
239
|
+
frequency: 3421,
|
|
240
|
+
affectedUsers: 2891,
|
|
241
|
+
browsers: ["Safari 14.1", "Safari 15.0"],
|
|
242
|
+
pages: ["/product/electronics/*"],
|
|
243
|
+
userImpact: "HIGH" // Prevents checkout
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
error: "NetworkError: Failed to fetch",
|
|
247
|
+
frequency: 1893,
|
|
248
|
+
affectedUsers: 1678,
|
|
249
|
+
regions: ["ap-south-1", "eu-west-2"],
|
|
250
|
+
timePattern: "Peak hours (9AM-11AM local)",
|
|
251
|
+
userImpact: "MEDIUM" // Degrades experience
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
|
|
255
|
+
featureUsage: {
|
|
256
|
+
"search_autocomplete": { usage: 0.89, satisfaction: 0.92 },
|
|
257
|
+
"product_recommendations": { usage: 0.67, clickthrough: 0.34 },
|
|
258
|
+
"saved_for_later": { usage: 0.23, conversion: 0.12 },
|
|
259
|
+
"guest_checkout": { usage: 0.41, completion: 0.78 }
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Generated RUM-Based Tests:**
|
|
265
|
+
```javascript
|
|
266
|
+
describe('RUM-Derived User Journey Tests', () => {
|
|
267
|
+
// Test the most common user journey (27.7% of traffic)
|
|
268
|
+
test('should complete high-traffic user journey: Homepage → Checkout', async () => {
|
|
269
|
+
const user = await createTestUser({ device: 'mobile', browser: 'chrome' });
|
|
270
|
+
|
|
271
|
+
// Homepage
|
|
272
|
+
const homepage = await user.visit('/');
|
|
273
|
+
expect(homepage.FCP).toBeLessThan(3421); // p95 threshold
|
|
274
|
+
expect(homepage.LCP).toBeLessThan(4523);
|
|
275
|
+
|
|
276
|
+
// Search
|
|
277
|
+
const searchResults = await user.search('wireless headphones');
|
|
278
|
+
expect(searchResults.results.length).toBeGreaterThan(0);
|
|
279
|
+
expect(searchResults.autocomplete.suggestions).toBeDefined();
|
|
280
|
+
|
|
281
|
+
// Product page
|
|
282
|
+
const product = await user.clickProduct(searchResults.results[0]);
|
|
283
|
+
expect(product.price).toBeDefined(); // Prevent TypeError from RUM data
|
|
284
|
+
expect(product.images).toBeDefined();
|
|
285
|
+
|
|
286
|
+
// Add to cart
|
|
287
|
+
await user.addToCart(product);
|
|
288
|
+
expect(user.cart.items.length).toBe(1);
|
|
289
|
+
|
|
290
|
+
// Checkout
|
|
291
|
+
const checkout = await user.goToCheckout();
|
|
292
|
+
expect(checkout.FID).toBeLessThan(234); // p95 threshold
|
|
293
|
+
expect(checkout.CLS).toBeLessThan(0.08); // No layout shift
|
|
294
|
+
|
|
295
|
+
// Payment
|
|
296
|
+
const payment = await user.submitPayment({
|
|
297
|
+
method: 'card',
|
|
298
|
+
cardNumber: '4242424242424242'
|
|
299
|
+
});
|
|
300
|
+
expect(payment.status).toBe('success');
|
|
301
|
+
expect(payment.conversionRate).toBeGreaterThanOrEqual(0.78); // Match RUM data
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// Test error pattern discovered in RUM
|
|
305
|
+
test('should handle undefined product price error (Safari bug)', async () => {
|
|
306
|
+
const user = await createTestUser({ browser: 'Safari', version: '14.1' });
|
|
307
|
+
|
|
308
|
+
// Navigate to electronics product (where error occurs per RUM)
|
|
309
|
+
const product = await user.visit('/product/electronics/headphones-123');
|
|
310
|
+
|
|
311
|
+
// Verify price is always defined (prevent TypeError)
|
|
312
|
+
expect(product.price).toBeDefined();
|
|
313
|
+
expect(typeof product.price).toBe('number');
|
|
314
|
+
|
|
315
|
+
// Verify checkout button is enabled
|
|
316
|
+
expect(product.addToCartButton.disabled).toBe(false);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
// Test network failure pattern (peak hours in ap-south-1)
|
|
320
|
+
test('should gracefully handle network failures during peak hours', async () => {
|
|
321
|
+
const user = await createTestUser({ region: 'ap-south-1', time: '09:30' });
|
|
322
|
+
|
|
323
|
+
// Simulate network failure
|
|
324
|
+
await mockNetworkFailure({ probability: 0.15 });
|
|
325
|
+
|
|
326
|
+
const response = await user.submitOrder();
|
|
327
|
+
|
|
328
|
+
// Should have retry logic
|
|
329
|
+
expect(response.retryAttempts).toBeGreaterThan(0);
|
|
330
|
+
// Should show user-friendly error
|
|
331
|
+
expect(response.errorMessage).toBe('Connection issue, retrying...');
|
|
332
|
+
// Should not lose data
|
|
333
|
+
expect(user.cart.items).toHaveLength(user.cart.items.length);
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### 3. Anomaly Detection
|
|
339
|
+
|
|
340
|
+
Uses statistical analysis and machine learning to detect abnormal patterns in production that indicate potential bugs.
|
|
341
|
+
|
|
342
|
+
**Anomaly Detection Algorithm:**
|
|
343
|
+
```javascript
|
|
344
|
+
class AnomalyDetector {
|
|
345
|
+
constructor() {
|
|
346
|
+
this.baselineMetrics = this.loadHistoricalBaseline();
|
|
347
|
+
this.detectionThresholds = {
|
|
348
|
+
errorRate: { stdDev: 3, window: 300000 }, // 5 minutes
|
|
349
|
+
latency: { stdDev: 2.5, percentile: 95 },
|
|
350
|
+
throughput: { stdDev: 2, window: 600000 }, // 10 minutes
|
|
351
|
+
userBehavior: { zscore: 3 }
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
detectAnomalies(currentMetrics) {
|
|
356
|
+
const anomalies = [];
|
|
357
|
+
|
|
358
|
+
// Error rate spike detection
|
|
359
|
+
const errorRateAnomaly = this.detectSpike(
|
|
360
|
+
currentMetrics.errorRate,
|
|
361
|
+
this.baselineMetrics.errorRate,
|
|
362
|
+
this.detectionThresholds.errorRate
|
|
363
|
+
);
|
|
364
|
+
if (errorRateAnomaly) {
|
|
365
|
+
anomalies.push({
|
|
366
|
+
type: 'ERROR_RATE_SPIKE',
|
|
367
|
+
severity: this.calculateSeverity(errorRateAnomaly),
|
|
368
|
+
details: errorRateAnomaly,
|
|
369
|
+
affectedUsers: currentMetrics.activeUsers * errorRateAnomaly.magnitude,
|
|
370
|
+
recommendation: 'Generate regression tests for recent changes'
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// Latency degradation
|
|
375
|
+
const latencyAnomaly = this.detectLatencyDegradation(
|
|
376
|
+
currentMetrics.latency,
|
|
377
|
+
this.baselineMetrics.latency
|
|
378
|
+
);
|
|
379
|
+
if (latencyAnomaly) {
|
|
380
|
+
anomalies.push({
|
|
381
|
+
type: 'LATENCY_DEGRADATION',
|
|
382
|
+
severity: latencyAnomaly.percentile > 95 ? 'HIGH' : 'MEDIUM',
|
|
383
|
+
details: latencyAnomaly,
|
|
384
|
+
affectedEndpoints: latencyAnomaly.endpoints,
|
|
385
|
+
recommendation: 'Generate performance tests targeting affected endpoints'
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Unusual user behavior
|
|
390
|
+
const behaviorAnomaly = this.detectBehaviorAnomaly(
|
|
391
|
+
currentMetrics.userJourneys,
|
|
392
|
+
this.baselineMetrics.userJourneys
|
|
393
|
+
);
|
|
394
|
+
if (behaviorAnomaly) {
|
|
395
|
+
anomalies.push({
|
|
396
|
+
type: 'USER_BEHAVIOR_ANOMALY',
|
|
397
|
+
severity: 'MEDIUM',
|
|
398
|
+
details: behaviorAnomaly,
|
|
399
|
+
hypothesis: 'UI bug or broken functionality',
|
|
400
|
+
recommendation: 'Generate UI tests for affected user flows'
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
return anomalies;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
detectSpike(current, baseline, threshold) {
|
|
408
|
+
const zScore = (current - baseline.mean) / baseline.stdDev;
|
|
409
|
+
if (Math.abs(zScore) > threshold.stdDev) {
|
|
410
|
+
return {
|
|
411
|
+
current: current,
|
|
412
|
+
baseline: baseline.mean,
|
|
413
|
+
deviation: zScore,
|
|
414
|
+
magnitude: (current - baseline.mean) / baseline.mean,
|
|
415
|
+
confidence: this.calculateConfidence(zScore)
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
**Anomaly-Based Test Generation:**
|
|
424
|
+
```javascript
|
|
425
|
+
// Anomaly detected: Error rate spike 47% → 12.3% after deployment
|
|
426
|
+
describe('Anomaly: Error Rate Spike after v2.4.0 Deployment', () => {
|
|
427
|
+
// Auto-generated from anomaly detection
|
|
428
|
+
|
|
429
|
+
test('should not increase error rate on user login', async () => {
|
|
430
|
+
// Baseline error rate: 0.47%
|
|
431
|
+
const baselineErrors = 0.0047;
|
|
432
|
+
const sampleSize = 1000;
|
|
433
|
+
|
|
434
|
+
let errors = 0;
|
|
435
|
+
for (let i = 0; i < sampleSize; i++) {
|
|
436
|
+
try {
|
|
437
|
+
await userService.login({
|
|
438
|
+
email: `test${i}@example.com`,
|
|
439
|
+
password: 'SecurePass123!'
|
|
440
|
+
});
|
|
441
|
+
} catch (error) {
|
|
442
|
+
errors++;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const errorRate = errors / sampleSize;
|
|
447
|
+
expect(errorRate).toBeLessThanOrEqual(baselineErrors * 1.5); // Allow 50% margin
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
// Anomaly: p95 latency increased from 234ms → 1,234ms for /api/orders
|
|
451
|
+
test('should maintain p95 latency under 300ms for orders API', async () => {
|
|
452
|
+
const latencies = [];
|
|
453
|
+
|
|
454
|
+
for (let i = 0; i < 100; i++) {
|
|
455
|
+
const start = Date.now();
|
|
456
|
+
await ordersAPI.getOrders({ userId: 'usr_test' });
|
|
457
|
+
const duration = Date.now() - start;
|
|
458
|
+
latencies.push(duration);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
const p95 = calculatePercentile(latencies, 95);
|
|
462
|
+
expect(p95).toBeLessThan(300); // Below baseline + margin
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// Anomaly: Checkout completion rate dropped from 78% → 34%
|
|
466
|
+
test('should maintain checkout conversion rate above 75%', async () => {
|
|
467
|
+
const attempts = 100;
|
|
468
|
+
let completions = 0;
|
|
469
|
+
|
|
470
|
+
for (let i = 0; i < attempts; i++) {
|
|
471
|
+
const result = await checkoutFlow.complete({
|
|
472
|
+
userId: `usr_${i}`,
|
|
473
|
+
items: [{ id: 'prod_123', quantity: 1 }],
|
|
474
|
+
payment: { method: 'card' }
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
if (result.status === 'completed') {
|
|
478
|
+
completions++;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
const conversionRate = completions / attempts;
|
|
483
|
+
expect(conversionRate).toBeGreaterThanOrEqual(0.75);
|
|
484
|
+
});
|
|
485
|
+
});
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### 4. Load Pattern Analysis
|
|
489
|
+
|
|
490
|
+
Analyzes production traffic patterns to generate realistic load tests that match actual user behavior.
|
|
491
|
+
|
|
492
|
+
**Traffic Pattern Extraction:**
|
|
493
|
+
```javascript
|
|
494
|
+
const loadPatterns = {
|
|
495
|
+
dailyPattern: {
|
|
496
|
+
hourly: [
|
|
497
|
+
{ hour: 0, rps: 234 },
|
|
498
|
+
{ hour: 1, rps: 189 },
|
|
499
|
+
{ hour: 2, rps: 156 },
|
|
500
|
+
// ... peak at 14:00
|
|
501
|
+
{ hour: 14, rps: 3421 }, // Peak traffic
|
|
502
|
+
{ hour: 15, rps: 3189 },
|
|
503
|
+
// ... back to baseline
|
|
504
|
+
],
|
|
505
|
+
peakHours: [9, 12, 14, 15, 18],
|
|
506
|
+
lowTrafficHours: [0, 1, 2, 3, 4]
|
|
507
|
+
},
|
|
508
|
+
|
|
509
|
+
weeklyPattern: {
|
|
510
|
+
monday: { rps: 2891, conversionRate: 0.78 },
|
|
511
|
+
tuesday: { rps: 3124, conversionRate: 0.81 },
|
|
512
|
+
wednesday: { rps: 3342, conversionRate: 0.83 },
|
|
513
|
+
thursday: { rps: 3198, conversionRate: 0.79 },
|
|
514
|
+
friday: { rps: 2734, conversionRate: 0.72 }, // Lower conversion
|
|
515
|
+
saturday: { rps: 1893, conversionRate: 0.65 },
|
|
516
|
+
sunday: { rps: 1678, conversionRate: 0.67 }
|
|
517
|
+
},
|
|
518
|
+
|
|
519
|
+
seasonalPattern: {
|
|
520
|
+
blackFriday: { rps: 12843, spike: 4.2x },
|
|
521
|
+
cyberMonday: { rps: 11234, spike: 3.7x },
|
|
522
|
+
christmas: { rps: 8734, spike: 2.9x },
|
|
523
|
+
newYear: { rps: 5432, spike: 1.8x }
|
|
524
|
+
},
|
|
525
|
+
|
|
526
|
+
endpointDistribution: {
|
|
527
|
+
"GET /api/products": 0.34,
|
|
528
|
+
"GET /api/search": 0.23,
|
|
529
|
+
"POST /api/cart": 0.15,
|
|
530
|
+
"POST /api/orders": 0.12,
|
|
531
|
+
"GET /api/users": 0.08,
|
|
532
|
+
"other": 0.08
|
|
533
|
+
},
|
|
534
|
+
|
|
535
|
+
userBehaviorPatterns: {
|
|
536
|
+
"browsers": {
|
|
537
|
+
avgSessionDuration: 342000, // 5m 42s
|
|
538
|
+
avgPagesPerSession: 7.8,
|
|
539
|
+
avgClicksPerSession: 23.4
|
|
540
|
+
},
|
|
541
|
+
"buyers": {
|
|
542
|
+
avgSessionDuration: 523000, // 8m 43s
|
|
543
|
+
avgPagesPerSession: 12.3,
|
|
544
|
+
avgCartValue: 234.99
|
|
545
|
+
},
|
|
546
|
+
"bouncers": {
|
|
547
|
+
avgSessionDuration: 23000, // 23s
|
|
548
|
+
avgPagesPerSession: 1.2
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
};
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
**Generated Load Test:**
|
|
555
|
+
```javascript
|
|
556
|
+
// Load test matching production traffic patterns
|
|
557
|
+
import { check, group, sleep } from 'k6';
|
|
558
|
+
import http from 'k6/http';
|
|
559
|
+
|
|
560
|
+
export let options = {
|
|
561
|
+
stages: [
|
|
562
|
+
// Morning ramp-up (9AM)
|
|
563
|
+
{ duration: '5m', target: 2000 },
|
|
564
|
+
// Sustain morning traffic
|
|
565
|
+
{ duration: '30m', target: 2000 },
|
|
566
|
+
// Midday peak (12PM-2PM)
|
|
567
|
+
{ duration: '5m', target: 3500 },
|
|
568
|
+
{ duration: '2h', target: 3500 }, // Peak hours
|
|
569
|
+
// Afternoon decline
|
|
570
|
+
{ duration: '10m', target: 2500 },
|
|
571
|
+
{ duration: '1h', target: 2500 },
|
|
572
|
+
// Evening traffic
|
|
573
|
+
{ duration: '5m', target: 1800 },
|
|
574
|
+
{ duration: '2h', target: 1800 },
|
|
575
|
+
// Night baseline
|
|
576
|
+
{ duration: '5m', target: 500 }
|
|
577
|
+
],
|
|
578
|
+
|
|
579
|
+
thresholds: {
|
|
580
|
+
http_req_duration: ['p(95)<500'], // p95 < 500ms
|
|
581
|
+
http_req_failed: ['rate<0.01'], // Error rate < 1%
|
|
582
|
+
http_reqs: ['rate>2000'] // Throughput > 2000 rps
|
|
583
|
+
}
|
|
584
|
+
};
|
|
585
|
+
|
|
586
|
+
// User behavior patterns from RUM analysis
|
|
587
|
+
const userProfiles = {
|
|
588
|
+
browser: { weight: 0.64, actions: ['browse', 'search', 'view'] },
|
|
589
|
+
buyer: { weight: 0.28, actions: ['browse', 'search', 'view', 'cart', 'checkout'] },
|
|
590
|
+
bouncer: { weight: 0.08, actions: ['bounce'] }
|
|
591
|
+
};
|
|
592
|
+
|
|
593
|
+
export default function() {
|
|
594
|
+
// Select user profile based on production distribution
|
|
595
|
+
const profile = selectUserProfile(userProfiles);
|
|
596
|
+
|
|
597
|
+
group('User Session', () => {
|
|
598
|
+
// Homepage (34% of traffic)
|
|
599
|
+
let response = http.get(`${BASE_URL}/`);
|
|
600
|
+
check(response, {
|
|
601
|
+
'homepage status 200': (r) => r.status === 200,
|
|
602
|
+
'homepage LCP <2.5s': (r) => r.timings.duration < 2500
|
|
603
|
+
});
|
|
604
|
+
sleep(Math.random() * 3 + 1); // 1-4s think time
|
|
605
|
+
|
|
606
|
+
if (profile === 'bouncer') {
|
|
607
|
+
return; // Bounce immediately (8% of users)
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
// Search (23% of traffic)
|
|
611
|
+
response = http.get(`${BASE_URL}/api/search?q=wireless%20headphones`);
|
|
612
|
+
check(response, { 'search status 200': (r) => r.status === 200 });
|
|
613
|
+
sleep(Math.random() * 2 + 1);
|
|
614
|
+
|
|
615
|
+
// Product view (all non-bouncers)
|
|
616
|
+
response = http.get(`${BASE_URL}/api/products/prod_123`);
|
|
617
|
+
check(response, {
|
|
618
|
+
'product status 200': (r) => r.status === 200,
|
|
619
|
+
'product has price': (r) => JSON.parse(r.body).price !== undefined
|
|
620
|
+
});
|
|
621
|
+
sleep(Math.random() * 5 + 2);
|
|
622
|
+
|
|
623
|
+
if (profile === 'browser') {
|
|
624
|
+
return; // Browser doesn't purchase
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// Add to cart (buyers only, 28% of users)
|
|
628
|
+
response = http.post(`${BASE_URL}/api/cart`, JSON.stringify({
|
|
629
|
+
productId: 'prod_123',
|
|
630
|
+
quantity: 1
|
|
631
|
+
}));
|
|
632
|
+
check(response, { 'cart status 200': (r) => r.status === 200 });
|
|
633
|
+
sleep(Math.random() * 3 + 1);
|
|
634
|
+
|
|
635
|
+
// Checkout (78% conversion rate for buyers)
|
|
636
|
+
if (Math.random() < 0.78) {
|
|
637
|
+
response = http.post(`${BASE_URL}/api/orders`, JSON.stringify({
|
|
638
|
+
paymentMethod: 'card',
|
|
639
|
+
shippingAddress: { /* ... */ }
|
|
640
|
+
}));
|
|
641
|
+
check(response, {
|
|
642
|
+
'order status 200': (r) => r.status === 200,
|
|
643
|
+
'order completed': (r) => JSON.parse(r.body).status === 'completed'
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### 5. Feature Usage Analytics
|
|
651
|
+
|
|
652
|
+
Tracks which features are actually used in production to prioritize testing efforts and identify dead code.
|
|
653
|
+
|
|
654
|
+
**Usage Analytics:**
|
|
655
|
+
```javascript
|
|
656
|
+
const featureUsageAnalytics = {
|
|
657
|
+
timeWindow: "last_30_days",
|
|
658
|
+
totalUsers: 84392,
|
|
659
|
+
|
|
660
|
+
features: [
|
|
661
|
+
{
|
|
662
|
+
name: "search_autocomplete",
|
|
663
|
+
usage: {
|
|
664
|
+
activeUsers: 75103, // 89% of users
|
|
665
|
+
sessionsUsed: 234891,
|
|
666
|
+
avgInteractionsPerSession: 4.7,
|
|
667
|
+
satisfaction: 0.92 // Based on behavior after use
|
|
668
|
+
},
|
|
669
|
+
priority: "CRITICAL", // High usage = high priority
|
|
670
|
+
testCoverage: 87.3,
|
|
671
|
+
recommendation: "Maintain coverage, add edge cases"
|
|
672
|
+
},
|
|
673
|
+
{
|
|
674
|
+
name: "product_recommendations",
|
|
675
|
+
usage: {
|
|
676
|
+
activeUsers: 56503, // 67% of users
|
|
677
|
+
clickThroughRate: 0.34,
|
|
678
|
+
conversionRate: 0.12
|
|
679
|
+
},
|
|
680
|
+
priority: "HIGH",
|
|
681
|
+
testCoverage: 72.1,
|
|
682
|
+
recommendation: "Increase coverage to 85%+"
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
name: "saved_for_later",
|
|
686
|
+
usage: {
|
|
687
|
+
activeUsers: 19411, // 23% of users
|
|
688
|
+
conversionRate: 0.12,
|
|
689
|
+
avgItemsSaved: 3.4
|
|
690
|
+
},
|
|
691
|
+
priority: "MEDIUM",
|
|
692
|
+
testCoverage: 45.2,
|
|
693
|
+
recommendation: "Coverage acceptable for usage level"
|
|
694
|
+
},
|
|
695
|
+
{
|
|
696
|
+
name: "gift_wrapping",
|
|
697
|
+
usage: {
|
|
698
|
+
activeUsers: 2107, // 2.5% of users
|
|
699
|
+
seasonalPeak: "December (18% usage)"
|
|
700
|
+
},
|
|
701
|
+
priority: "LOW",
|
|
702
|
+
testCoverage: 23.1,
|
|
703
|
+
recommendation: "Low priority, increase coverage before holidays"
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
name: "legacy_wishlist_v1",
|
|
707
|
+
usage: {
|
|
708
|
+
activeUsers: 42, // 0.05% of users
|
|
709
|
+
lastUsed: "2024-08-12"
|
|
710
|
+
},
|
|
711
|
+
priority: "DEPRECATED",
|
|
712
|
+
testCoverage: 12.3,
|
|
713
|
+
recommendation: "⚠️ Consider removal, migrate remaining users"
|
|
714
|
+
}
|
|
715
|
+
],
|
|
716
|
+
|
|
717
|
+
unusedFeatures: [
|
|
718
|
+
{
|
|
719
|
+
name: "product_comparison_tool",
|
|
720
|
+
codeSize: "2,341 lines",
|
|
721
|
+
lastUsed: "2024-03-15",
|
|
722
|
+
recommendation: "🗑️ Dead code, safe to remove"
|
|
723
|
+
},
|
|
724
|
+
{
|
|
725
|
+
name: "flash_sale_countdown",
|
|
726
|
+
codeSize: "892 lines",
|
|
727
|
+
lastUsed: "2024-07-01",
|
|
728
|
+
recommendation: "🗑️ Feature discontinued, remove code"
|
|
729
|
+
}
|
|
730
|
+
]
|
|
731
|
+
};
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
**Usage-Based Test Prioritization:**
|
|
735
|
+
```javascript
|
|
736
|
+
// Prioritize tests based on feature usage
|
|
737
|
+
describe('High-Priority Features (>50% usage)', () => {
|
|
738
|
+
// search_autocomplete: 89% usage - CRITICAL
|
|
739
|
+
test('search autocomplete should return relevant suggestions', async () => {
|
|
740
|
+
const results = await searchService.autocomplete('headphones');
|
|
741
|
+
expect(results.suggestions.length).toBeGreaterThan(0);
|
|
742
|
+
expect(results.suggestions[0]).toMatch(/headphones/i);
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
// product_recommendations: 67% usage - HIGH
|
|
746
|
+
test('product recommendations should personalize based on history', async () => {
|
|
747
|
+
const user = await createUserWithHistory(['electronics', 'audio']);
|
|
748
|
+
const recommendations = await recommendationService.getRecommendations(user.id);
|
|
749
|
+
expect(recommendations.length).toBeGreaterThanOrEqual(4);
|
|
750
|
+
expect(recommendations[0].category).toMatch(/electronics|audio/);
|
|
751
|
+
});
|
|
752
|
+
});
|
|
753
|
+
|
|
754
|
+
describe('Medium-Priority Features (10-50% usage)', () => {
|
|
755
|
+
// saved_for_later: 23% usage - MEDIUM
|
|
756
|
+
test('should save items for later purchase', async () => {
|
|
757
|
+
const user = await createTestUser();
|
|
758
|
+
await saveForLaterService.save(user.id, 'prod_123');
|
|
759
|
+
const saved = await saveForLaterService.list(user.id);
|
|
760
|
+
expect(saved).toContainEqual(expect.objectContaining({ productId: 'prod_123' }));
|
|
761
|
+
});
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
// Low-priority features: Minimal testing
|
|
765
|
+
describe('Low-Priority Features (<10% usage)', () => {
|
|
766
|
+
// gift_wrapping: 2.5% usage - LOW (but test before holidays)
|
|
767
|
+
test('should add gift wrapping option to order', async () => {
|
|
768
|
+
const order = await createOrder({ giftWrap: true, giftMessage: 'Happy Birthday!' });
|
|
769
|
+
expect(order.giftWrap).toBe(true);
|
|
770
|
+
});
|
|
771
|
+
});
|
|
772
|
+
|
|
773
|
+
// Generate deprecation warnings for unused features
|
|
774
|
+
describe('Deprecated Features (for removal)', () => {
|
|
775
|
+
test.skip('legacy_wishlist_v1 - scheduled for removal', () => {
|
|
776
|
+
// Skipped: Feature used by <0.1% of users
|
|
777
|
+
// Removal scheduled: Q4 2024
|
|
778
|
+
});
|
|
779
|
+
});
|
|
780
|
+
```
|
|
781
|
+
|
|
782
|
+
### 6. Error Pattern Mining
|
|
783
|
+
|
|
784
|
+
Mines production error logs to identify recurring error patterns and generate targeted regression tests.
|
|
785
|
+
|
|
786
|
+
**Error Pattern Mining:**
|
|
787
|
+
```javascript
|
|
788
|
+
const errorPatterns = {
|
|
789
|
+
timeWindow: "last_7_days",
|
|
790
|
+
totalErrors: 34821,
|
|
791
|
+
uniqueErrors: 892,
|
|
792
|
+
|
|
793
|
+
topErrorPatterns: [
|
|
794
|
+
{
|
|
795
|
+
pattern: "TypeError: Cannot read property 'X' of undefined",
|
|
796
|
+
occurrences: 3421,
|
|
797
|
+
affectedUsers: 2891,
|
|
798
|
+
trend: "INCREASING", // +23% vs last week
|
|
799
|
+
contexts: [
|
|
800
|
+
{
|
|
801
|
+
context: "product.price",
|
|
802
|
+
frequency: 1823,
|
|
803
|
+
browsers: ["Safari 14.1", "Safari 15.0"],
|
|
804
|
+
hypothesis: "Safari-specific race condition in price loading"
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
context: "user.preferences",
|
|
808
|
+
frequency: 1234,
|
|
809
|
+
conditions: "First-time users only",
|
|
810
|
+
hypothesis: "Missing initialization for new user preferences"
|
|
811
|
+
}
|
|
812
|
+
],
|
|
813
|
+
generatedTests: 8,
|
|
814
|
+
priority: "HIGH"
|
|
815
|
+
},
|
|
816
|
+
{
|
|
817
|
+
pattern: "NetworkError: Failed to fetch",
|
|
818
|
+
occurrences: 1893,
|
|
819
|
+
affectedUsers: 1678,
|
|
820
|
+
regions: ["ap-south-1", "eu-west-2"],
|
|
821
|
+
timePattern: "Peak hours (9AM-11AM local)",
|
|
822
|
+
hypothesis: "Rate limiting or CDN issues in specific regions",
|
|
823
|
+
generatedTests: 4,
|
|
824
|
+
priority: "MEDIUM"
|
|
825
|
+
},
|
|
826
|
+
{
|
|
827
|
+
pattern: "ValidationError: Invalid credit card number",
|
|
828
|
+
occurrences: 1234,
|
|
829
|
+
affectedUsers: 1234, // 1:1 ratio = not a bug
|
|
830
|
+
userAction: "User-submitted invalid data",
|
|
831
|
+
priority: "LOW", // Expected validation error
|
|
832
|
+
generatedTests: 2
|
|
833
|
+
}
|
|
834
|
+
],
|
|
835
|
+
|
|
836
|
+
errorCorrelations: [
|
|
837
|
+
{
|
|
838
|
+
errors: ["PaymentTimeout", "DatabaseSlowQuery"],
|
|
839
|
+
correlation: 0.89,
|
|
840
|
+
hypothesis: "Payment timeouts caused by slow database queries",
|
|
841
|
+
recommendation: "Generate integration tests for payment + database interaction"
|
|
842
|
+
},
|
|
843
|
+
{
|
|
844
|
+
errors: ["CacheKeyMiss", "HighLatency"],
|
|
845
|
+
correlation: 0.76,
|
|
846
|
+
hypothesis: "Cache misses causing latency spikes",
|
|
847
|
+
recommendation: "Generate cache invalidation and warm-up tests"
|
|
848
|
+
}
|
|
849
|
+
]
|
|
850
|
+
};
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
**Error-Driven Test Generation:**
|
|
854
|
+
```javascript
|
|
855
|
+
describe('Error Pattern: TypeError - Cannot read property of undefined', () => {
|
|
856
|
+
// Generated from 3,421 production occurrences
|
|
857
|
+
|
|
858
|
+
test('should safely handle undefined product price (Safari race condition)', async () => {
|
|
859
|
+
// Simulate Safari-specific timing
|
|
860
|
+
const product = await loadProduct('prod_123', { browser: 'Safari', delay: 50 });
|
|
861
|
+
|
|
862
|
+
// Should never throw TypeError
|
|
863
|
+
expect(() => {
|
|
864
|
+
const priceElement = document.querySelector('.product-price');
|
|
865
|
+
const price = product.price; // This was causing TypeError
|
|
866
|
+
priceElement.textContent = price;
|
|
867
|
+
}).not.toThrow();
|
|
868
|
+
|
|
869
|
+
// Verify fallback behavior
|
|
870
|
+
expect(product.price).toBeDefined();
|
|
871
|
+
expect(typeof product.price).toBe('number');
|
|
872
|
+
});
|
|
873
|
+
|
|
874
|
+
test('should initialize preferences for first-time users', async () => {
|
|
875
|
+
const newUser = await createUser({ preferences: undefined });
|
|
876
|
+
|
|
877
|
+
// Should not throw when accessing preferences
|
|
878
|
+
expect(() => {
|
|
879
|
+
const theme = newUser.preferences.theme; // This was causing TypeError
|
|
880
|
+
}).not.toThrow();
|
|
881
|
+
|
|
882
|
+
// Verify default initialization
|
|
883
|
+
expect(newUser.preferences).toBeDefined();
|
|
884
|
+
expect(newUser.preferences.theme).toBe('light'); // Default value
|
|
885
|
+
});
|
|
886
|
+
});
|
|
887
|
+
|
|
888
|
+
describe('Error Pattern: NetworkError - Failed to fetch', () => {
|
|
889
|
+
// Correlated with peak hours in ap-south-1
|
|
890
|
+
|
|
891
|
+
test('should implement retry logic for network failures', async () => {
|
|
892
|
+
// Simulate peak hour network congestion
|
|
893
|
+
mockNetworkFailure({ region: 'ap-south-1', time: '09:30', probability: 0.15 });
|
|
894
|
+
|
|
895
|
+
const fetchWithRetry = async () => {
|
|
896
|
+
let attempts = 0;
|
|
897
|
+
const maxAttempts = 3;
|
|
898
|
+
|
|
899
|
+
while (attempts < maxAttempts) {
|
|
900
|
+
try {
|
|
901
|
+
return await fetch('/api/products');
|
|
902
|
+
} catch (error) {
|
|
903
|
+
attempts++;
|
|
904
|
+
if (attempts >= maxAttempts) throw error;
|
|
905
|
+
await sleep(Math.pow(2, attempts) * 1000); // Exponential backoff
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
};
|
|
909
|
+
|
|
910
|
+
const response = await fetchWithRetry();
|
|
911
|
+
expect(response.ok).toBe(true);
|
|
912
|
+
});
|
|
913
|
+
});
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
### 7. User Journey Reconstruction
|
|
917
|
+
|
|
918
|
+
Reconstructs complete user journeys from session data to generate end-to-end test scenarios that match real user behavior.
|
|
919
|
+
|
|
920
|
+
**Journey Reconstruction:**
|
|
921
|
+
```javascript
|
|
922
|
+
const userJourneys = [
|
|
923
|
+
{
|
|
924
|
+
sessionId: "sess_abc123",
|
|
925
|
+
userId: "usr_xyz789",
|
|
926
|
+
duration: 342000, // 5m 42s
|
|
927
|
+
converted: true,
|
|
928
|
+
revenue: 234.99,
|
|
929
|
+
|
|
930
|
+
steps: [
|
|
931
|
+
{ timestamp: "14:23:00", action: "visit_homepage", duration: 3400 },
|
|
932
|
+
{ timestamp: "14:23:03", action: "search", query: "wireless headphones", duration: 1200 },
|
|
933
|
+
{ timestamp: "14:23:04", action: "view_product", productId: "prod_123", duration: 45000 },
|
|
934
|
+
{ timestamp: "14:23:49", action: "read_reviews", scrollDepth: 0.67, duration: 23000 },
|
|
935
|
+
{ timestamp: "14:24:12", action: "view_images", imagesViewed: 5, duration: 18000 },
|
|
936
|
+
{ timestamp: "14:24:30", action: "add_to_cart", productId: "prod_123", duration: 2100 },
|
|
937
|
+
{ timestamp: "14:24:32", action: "view_cart", duration: 12000 },
|
|
938
|
+
{ timestamp: "14:24:44", action: "apply_coupon", code: "SAVE10", success: true, duration: 3400 },
|
|
939
|
+
{ timestamp: "14:24:48", action: "proceed_to_checkout", duration: 1200 },
|
|
940
|
+
{ timestamp: "14:24:49", action: "fill_shipping", duration: 34000 },
|
|
941
|
+
{ timestamp: "14:25:23", action: "select_shipping_method", method: "express", duration: 4500 },
|
|
942
|
+
{ timestamp: "14:25:28", action: "fill_payment", duration: 28000 },
|
|
943
|
+
{ timestamp: "14:25:56", action: "review_order", duration: 8900 },
|
|
944
|
+
{ timestamp: "14:26:05", action: "place_order", orderId: "ord_456", duration: 2300 },
|
|
945
|
+
{ timestamp: "14:26:07", action: "confirmation", duration: 5600 }
|
|
946
|
+
]
|
|
947
|
+
}
|
|
948
|
+
];
|
|
949
|
+
```
|
|
950
|
+
|
|
951
|
+
**Generated E2E Test:**
|
|
952
|
+
```javascript
|
|
953
|
+
describe('Real User Journey: Successful Purchase with Coupon', () => {
|
|
954
|
+
// Reconstructed from session sess_abc123
|
|
955
|
+
|
|
956
|
+
test('should complete full purchase journey matching production behavior', async () => {
|
|
957
|
+
const { page } = await setupBrowser();
|
|
958
|
+
|
|
959
|
+
// Step 1: Homepage (duration: 3.4s)
|
|
960
|
+
await page.goto('/');
|
|
961
|
+
await page.waitForSelector('.hero-banner');
|
|
962
|
+
await page.waitForTimeout(3400); // Simulate real user pause
|
|
963
|
+
|
|
964
|
+
// Step 2: Search (duration: 1.2s)
|
|
965
|
+
await page.fill('[data-testid="search-input"]', 'wireless headphones');
|
|
966
|
+
await page.click('[data-testid="search-button"]');
|
|
967
|
+
await page.waitForSelector('.search-results');
|
|
968
|
+
|
|
969
|
+
// Step 3: View product (duration: 45s - engaged user)
|
|
970
|
+
await page.click('.search-results .product-card:first-child');
|
|
971
|
+
await page.waitForSelector('.product-details');
|
|
972
|
+
|
|
973
|
+
// Step 4: Read reviews (scroll depth 67%)
|
|
974
|
+
await page.evaluate(() => {
|
|
975
|
+
window.scrollTo({ top: document.body.scrollHeight * 0.67, behavior: 'smooth' });
|
|
976
|
+
});
|
|
977
|
+
await page.waitForTimeout(23000); // User reading reviews
|
|
978
|
+
|
|
979
|
+
// Step 5: View images (5 images)
|
|
980
|
+
for (let i = 0; i < 5; i++) {
|
|
981
|
+
await page.click('.image-gallery .thumbnail:nth-child(' + (i + 1) + ')');
|
|
982
|
+
await page.waitForTimeout(3600); // User viewing each image
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
// Step 6: Add to cart
|
|
986
|
+
await page.click('[data-testid="add-to-cart"]');
|
|
987
|
+
await expect(page.locator('.cart-badge')).toHaveText('1');
|
|
988
|
+
|
|
989
|
+
// Step 7: View cart
|
|
990
|
+
await page.click('[data-testid="cart-icon"]');
|
|
991
|
+
await page.waitForSelector('.cart-items');
|
|
992
|
+
await page.waitForTimeout(12000); // User reviewing cart
|
|
993
|
+
|
|
994
|
+
// Step 8: Apply coupon (SAVE10)
|
|
995
|
+
await page.fill('[data-testid="coupon-input"]', 'SAVE10');
|
|
996
|
+
await page.click('[data-testid="apply-coupon"]');
|
|
997
|
+
await expect(page.locator('.discount-applied')).toBeVisible();
|
|
998
|
+
|
|
999
|
+
// Step 9: Checkout
|
|
1000
|
+
await page.click('[data-testid="proceed-to-checkout"]');
|
|
1001
|
+
await page.waitForSelector('.checkout-form');
|
|
1002
|
+
|
|
1003
|
+
// Step 10: Fill shipping (duration: 34s - user typing)
|
|
1004
|
+
await page.fill('[name="shipping.name"]', 'John Doe');
|
|
1005
|
+
await page.fill('[name="shipping.address"]', '123 Main St');
|
|
1006
|
+
await page.fill('[name="shipping.city"]', 'New York');
|
|
1007
|
+
await page.fill('[name="shipping.zip"]', '10001');
|
|
1008
|
+
await page.waitForTimeout(34000); // Realistic typing speed
|
|
1009
|
+
|
|
1010
|
+
// Step 11: Select express shipping
|
|
1011
|
+
await page.click('[data-testid="shipping-express"]');
|
|
1012
|
+
|
|
1013
|
+
// Step 12: Fill payment (duration: 28s)
|
|
1014
|
+
await page.fill('[name="payment.cardNumber"]', '4242424242424242');
|
|
1015
|
+
await page.fill('[name="payment.expiry"]', '12/25');
|
|
1016
|
+
await page.fill('[name="payment.cvv"]', '123');
|
|
1017
|
+
await page.waitForTimeout(28000);
|
|
1018
|
+
|
|
1019
|
+
// Step 13: Review order (duration: 8.9s)
|
|
1020
|
+
await page.click('[data-testid="review-order"]');
|
|
1021
|
+
await page.waitForSelector('.order-summary');
|
|
1022
|
+
await page.waitForTimeout(8900);
|
|
1023
|
+
|
|
1024
|
+
// Step 14: Place order
|
|
1025
|
+
await page.click('[data-testid="place-order"]');
|
|
1026
|
+
await page.waitForSelector('.order-confirmation');
|
|
1027
|
+
|
|
1028
|
+
// Step 15: Confirmation
|
|
1029
|
+
const orderNumber = await page.textContent('[data-testid="order-number"]');
|
|
1030
|
+
expect(orderNumber).toMatch(/^ord_/);
|
|
1031
|
+
|
|
1032
|
+
// Verify order in database
|
|
1033
|
+
const order = await getOrder(orderNumber);
|
|
1034
|
+
expect(order.total).toBe(234.99);
|
|
1035
|
+
expect(order.discount).toBe(23.50); // SAVE10 applied
|
|
1036
|
+
expect(order.shippingMethod).toBe('express');
|
|
1037
|
+
});
|
|
1038
|
+
});
|
|
1039
|
+
```
|
|
1040
|
+
|
|
1041
|
+
## Integration Points
|
|
1042
|
+
|
|
1043
|
+
### Upstream Dependencies
|
|
1044
|
+
- **Monitoring Platforms**: Datadog, New Relic, Grafana (RUM data)
|
|
1045
|
+
- **Incident Management**: PagerDuty, Opsgenie (incident data)
|
|
1046
|
+
- **Log Aggregation**: Elasticsearch, Splunk, CloudWatch (error logs)
|
|
1047
|
+
- **Analytics**: Google Analytics, Mixpanel (user behavior)
|
|
1048
|
+
- **APM**: New Relic, AppDynamics (performance traces)
|
|
1049
|
+
|
|
1050
|
+
### Downstream Consumers
|
|
1051
|
+
- **qe-test-generator**: Generates tests from production scenarios
|
|
1052
|
+
- **qe-coverage-analyzer**: Identifies coverage gaps from production usage
|
|
1053
|
+
- **qe-regression-risk-analyzer**: Prioritizes tests based on production impact
|
|
1054
|
+
- **qe-requirements-validator**: Validates requirements against production behavior
|
|
1055
|
+
|
|
1056
|
+
### Coordination Agents
|
|
1057
|
+
- **qe-fleet-commander**: Orchestrates production intelligence workflow
|
|
1058
|
+
- **qe-deployment-readiness**: Uses production insights for risk assessment
|
|
1059
|
+
|
|
1060
|
+
## Coordination Protocol
|
|
1061
|
+
|
|
1062
|
+
This agent uses **AQE hooks (Agentic QE native hooks)** for coordination (zero external dependencies, 100-500x faster).
|
|
1063
|
+
|
|
1064
|
+
**Automatic Lifecycle Hooks:**
|
|
1065
|
+
```typescript
|
|
1066
|
+
// Automatically called by BaseAgent
|
|
1067
|
+
protected async onPreTask(data: { assignment: TaskAssignment }): Promise<void> {
|
|
1068
|
+
// Load production incidents and RUM data
|
|
1069
|
+
const incidents = await this.memoryStore.retrieve('aqe/production/incidents');
|
|
1070
|
+
const rumData = await this.memoryStore.retrieve('aqe/production/rum-data');
|
|
1071
|
+
|
|
1072
|
+
this.logger.info('Production intelligence analysis started', {
|
|
1073
|
+
recentIncidents: incidents?.length || 0,
|
|
1074
|
+
rumSessions: rumData?.totalSessions || 0
|
|
1075
|
+
});
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
protected async onPostTask(data: { assignment: TaskAssignment; result: any }): Promise<void> {
|
|
1079
|
+
// Store generated test scenarios and insights
|
|
1080
|
+
await this.memoryStore.store('aqe/production/test-scenarios', data.result.scenarios);
|
|
1081
|
+
await this.memoryStore.store('aqe/production/insights', data.result.insights);
|
|
1082
|
+
await this.memoryStore.store('aqe/production/anomalies', data.result.anomalies);
|
|
1083
|
+
|
|
1084
|
+
// Emit production intelligence event
|
|
1085
|
+
this.eventBus.emit('production-intelligence:analyzed', {
|
|
1086
|
+
scenariosGenerated: data.result.scenarios.length,
|
|
1087
|
+
anomaliesDetected: data.result.anomalies.length,
|
|
1088
|
+
highPriorityInsights: data.result.insights.filter(i => i.priority === 'HIGH').length
|
|
1089
|
+
});
|
|
1090
|
+
}
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
**Advanced Verification (Optional):**
|
|
1094
|
+
```typescript
|
|
1095
|
+
const hookManager = new VerificationHookManager(this.memoryStore);
|
|
1096
|
+
const verification = await hookManager.executePreTaskVerification({
|
|
1097
|
+
task: 'production-analysis',
|
|
1098
|
+
context: {
|
|
1099
|
+
requiredVars: ['PROD_ENV', 'MONITORING_PLATFORM'],
|
|
1100
|
+
minMemoryMB: 1024,
|
|
1101
|
+
requiredKeys: ['aqe/production/incidents', 'aqe/production/rum-data']
|
|
1102
|
+
}
|
|
1103
|
+
});
|
|
1104
|
+
```
|
|
1105
|
+
|
|
1106
|
+
## Memory Keys
|
|
1107
|
+
|
|
1108
|
+
### Input Keys
|
|
1109
|
+
- `aqe/production/incidents` - Incident data from PagerDuty/Opsgenie
|
|
1110
|
+
- `aqe/production/rum-data` - Real User Monitoring metrics
|
|
1111
|
+
- `aqe/production/logs` - Application logs and errors
|
|
1112
|
+
- `aqe/production/analytics` - User behavior analytics
|
|
1113
|
+
- `aqe/production/apm` - Application performance monitoring data
|
|
1114
|
+
|
|
1115
|
+
### Output Keys
|
|
1116
|
+
- `aqe/production/test-scenarios` - Generated test scenarios from production data
|
|
1117
|
+
- `aqe/production/insights` - Actionable insights and recommendations
|
|
1118
|
+
- `aqe/production/anomalies` - Detected anomalies requiring investigation
|
|
1119
|
+
- `aqe/production/patterns` - Identified patterns and trends
|
|
1120
|
+
- `aqe/production/prioritization` - Test prioritization based on usage
|
|
1121
|
+
|
|
1122
|
+
### Coordination Keys
|
|
1123
|
+
- `aqe/production/status` - Real-time production health status
|
|
1124
|
+
- `aqe/production/alerts` - Active production alerts
|
|
1125
|
+
- `aqe/production/feedback-loop` - Continuous feedback to testing
|
|
1126
|
+
|
|
1127
|
+
## Use Cases
|
|
1128
|
+
|
|
1129
|
+
(Continued in file due to length constraints...)
|
|
1130
|
+
|
|
1131
|
+
## Commands
|
|
1132
|
+
|
|
1133
|
+
### Basic Commands
|
|
1134
|
+
|
|
1135
|
+
```bash
|
|
1136
|
+
# Analyze production incidents
|
|
1137
|
+
aqe production analyze-incidents --days 7
|
|
1138
|
+
|
|
1139
|
+
# Generate tests from RUM data
|
|
1140
|
+
aqe production rum-to-tests --feature checkout
|
|
1141
|
+
|
|
1142
|
+
# Detect anomalies
|
|
1143
|
+
aqe production detect-anomalies --threshold 3-sigma
|
|
1144
|
+
|
|
1145
|
+
# Extract load patterns
|
|
1146
|
+
aqe production load-patterns --days 30
|
|
1147
|
+
|
|
1148
|
+
# Analyze feature usage
|
|
1149
|
+
aqe production feature-usage --output usage-report.json
|
|
1150
|
+
```
|
|
1151
|
+
|
|
1152
|
+
### Advanced Commands
|
|
1153
|
+
|
|
1154
|
+
```bash
|
|
1155
|
+
# Replay specific incident
|
|
1156
|
+
aqe production replay-incident --incident-id INC-2024-1234
|
|
1157
|
+
|
|
1158
|
+
# Generate E2E tests from user journeys
|
|
1159
|
+
aqe production journey-to-tests --min-frequency 100
|
|
1160
|
+
|
|
1161
|
+
# Mine error patterns
|
|
1162
|
+
aqe production mine-errors --min-occurrences 10
|
|
1163
|
+
|
|
1164
|
+
# Analyze production vs staging differences
|
|
1165
|
+
aqe production compare-environments --baseline staging
|
|
1166
|
+
|
|
1167
|
+
# Export production intelligence report
|
|
1168
|
+
aqe production report --format pdf --output production-intelligence.pdf
|
|
1169
|
+
```
|
|
1170
|
+
|
|
1171
|
+
### Specialized Commands
|
|
1172
|
+
|
|
1173
|
+
```bash
|
|
1174
|
+
# Continuous feedback loop
|
|
1175
|
+
aqe production feedback-loop --interval 1h --auto-generate-tests
|
|
1176
|
+
|
|
1177
|
+
# Priority-based test generation
|
|
1178
|
+
aqe production generate-by-priority --top 20
|
|
1179
|
+
|
|
1180
|
+
# Seasonal pattern analysis
|
|
1181
|
+
aqe production seasonal-analysis --events black-friday,cyber-monday
|
|
1182
|
+
|
|
1183
|
+
# Dead code detection
|
|
1184
|
+
aqe production dead-code --min-days 90
|
|
1185
|
+
|
|
1186
|
+
# A/B test impact analysis
|
|
1187
|
+
aqe production ab-test-impact --experiment checkout-v2
|
|
1188
|
+
```
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
**Agent Status**: Production Ready
|
|
1192
|
+
**Last Updated**: 2025-09-30
|
|
1193
|
+
**Version**: 1.0.0
|
|
1194
|
+
**Maintainer**: AQE Fleet Team
|