synapse-hub 2.2.3 → 2.4.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/.agents/agents/failure-analyst.md +11 -0
- package/.agents/agents/live-explorer.md +28 -0
- package/.agents/agents/orchestrator.md +20 -4
- package/.agents/agents/pom-crafter.md +12 -0
- package/.agents/agents/quality-gatekeeper.md +19 -4
- package/.agents/agents/test-runner.md +11 -0
- package/.agents/rules/communication-style.md +40 -0
- package/.agents/rules/context-engineering.md +23 -0
- package/.agents/rules/git-push-protocol.md +11 -17
- package/.agents/rules/graphify.md +14 -14
- package/.agents/rules/lessons-learned.md +3 -3
- package/.agents/rules/mandatory-playwright-live.md +29 -29
- package/.agents/rules/mobile_appium_rules.md +132 -0
- package/.agents/rules/performance_testing_rules.md +74 -0
- package/.agents/rules/skill-precedence.md +1 -1
- package/.agents/rules/systematic-debugging.md +6 -6
- package/.agents/skills/agent-orchestration-multi-agent-optimize/SKILL.md +64 -215
- package/.agents/skills/agent-orchestration-multi-agent-optimize/examples/swarm_workload_config.json +12 -0
- package/.agents/skills/antigravity-test-sentinel/SKILL.md +3 -3
- package/.agents/skills/antigravity-test-sentinel/examples/dod_gate_policy.json +11 -0
- package/.agents/skills/api-network-mocking-interception/SKILL.md +1 -1
- package/.agents/skills/api-network-mocking-interception/examples/network_route_stub.json +9 -0
- package/.agents/skills/api-spec-to-e2e-matrix/SKILL.md +9 -9
- package/.agents/skills/api-spec-to-e2e-matrix/examples/sample_openapi.json +19 -0
- package/.agents/skills/architecture-decision-records/SKILL.md +35 -412
- package/.agents/skills/architecture-decision-records/examples/0001-record-architecture-decisions.md +12 -0
- package/.agents/skills/auth-session-and-cookie-manager/SKILL.md +4 -1
- package/.agents/skills/auth-session-and-cookie-manager/examples/storage_state_sample.json +11 -0
- package/.agents/skills/backend-load-and-stress-patterns/SKILL.md +80 -186
- package/.agents/skills/backend-load-and-stress-patterns/examples/k6_load_test_sample.js +13 -0
- package/.agents/skills/bats-testing-patterns/SKILL.md +1 -1
- package/.agents/skills/bats-testing-patterns/examples/cli_runner_test.bats +6 -0
- package/.agents/skills/bats-testing-patterns/resources/implementation-playbook.md +614 -614
- package/.agents/skills/clean-pom-crafter/SKILL.md +21 -3
- package/.agents/skills/clean-pom-crafter/examples/standard_test_case.groovy +28 -28
- package/.agents/skills/clean-pom-crafter/references/pom_patterns.groovy +138 -138
- package/.agents/skills/code-refactoring-refactor-clean/SKILL.md +2 -2
- package/.agents/skills/code-refactoring-refactor-clean/examples/refactored_page_sample.groovy +9 -0
- package/.agents/skills/code-refactoring-refactor-clean/resources/implementation-playbook.md +9 -7
- package/.agents/skills/db-state-verifier-and-seeder/SKILL.md +5 -5
- package/.agents/skills/db-state-verifier-and-seeder/examples/db_fixture_seed.json +12 -0
- package/.agents/skills/e2e-testing-patterns/SKILL.md +1 -1
- package/.agents/skills/e2e-testing-patterns/examples/playwright_sharded_config.ts +12 -0
- package/.agents/skills/e2e-testing-patterns/resources/implementation-playbook.md +522 -522
- package/.agents/skills/failure-autopsy-and-healing/SKILL.md +17 -3
- package/.agents/skills/failure-autopsy-and-healing/examples/sample_junit_failure.xml +8 -0
- package/.agents/skills/failure-autopsy-and-healing/references/healing_matrix.md +64 -64
- package/.agents/skills/failure-autopsy-and-healing/references/qa_investigation_protocol.md +56 -56
- package/.agents/skills/failure-autopsy-and-healing/scripts/triage_failures.sh +98 -98
- package/.agents/skills/file-and-report-validator/SKILL.md +1 -1
- package/.agents/skills/file-and-report-validator/examples/sample_export_schema.json +14 -0
- package/.agents/skills/flaky-test-sentinel-and-quarantine/SKILL.md +3 -3
- package/.agents/skills/flaky-test-sentinel-and-quarantine/examples/quarantine_registry.json +11 -0
- package/.agents/skills/gherkin-to-suite/SKILL.md +103 -0
- package/.agents/skills/gherkin-to-suite/examples/checkout.feature +39 -0
- package/.agents/skills/gherkin-to-suite/examples/suite_report_sample.json +334 -0
- package/.agents/skills/github-actions-templates/SKILL.md +47 -304
- package/.agents/skills/github-actions-templates/examples/matrix_test_pipeline.yml +8 -0
- package/.agents/skills/graphify-impact-analyzer/SKILL.md +6 -6
- package/.agents/skills/graphify-impact-analyzer/examples/dependency_blast_radius.json +8 -0
- package/.agents/skills/katalon-cli-runner/SKILL.md +2 -2
- package/.agents/skills/katalon-cli-runner/examples/headless_kre_exec.sh +3 -0
- package/.agents/skills/katalon-cli-runner/references/groovy-patterns.md +209 -209
- package/.agents/skills/katalon-cli-runner/references/katalon-api.md +155 -155
- package/.agents/skills/katalon-cli-runner/references/runner_commands.md +67 -67
- package/.agents/skills/lam-script-generator/SKILL.md +42 -1
- package/.agents/skills/lam-script-generator/examples/user_story_sample.md +8 -0
- package/.agents/skills/lean-code-ladder/SKILL.md +83 -0
- package/.agents/skills/lean-code-ladder/examples/ladder_walkthrough.md +37 -0
- package/.agents/skills/meta-prompt-crafter/SKILL.md +107 -0
- package/.agents/skills/meta-prompt-crafter/examples/qa_prompt_template.md +35 -0
- package/.agents/skills/persistent-planning-files/SKILL.md +108 -0
- package/.agents/skills/persistent-planning-files/examples/task_plan_example.md +56 -0
- package/.agents/skills/playwright-live-interaction/SKILL.md +49 -1
- package/.agents/skills/playwright-live-interaction/examples/live_probe_script.js +5 -0
- package/.agents/skills/playwright-live-interaction/references/advanced_superpowers.md +160 -160
- package/.agents/skills/playwright-live-interaction/references/compact_accessibility_snapshots.md +75 -75
- package/.agents/skills/playwright-live-interaction/references/recipes.md +388 -388
- package/.agents/skills/playwright-live-interaction/references/swarm_orchestration.md +134 -134
- package/.agents/skills/playwright-webapp-testing/SKILL.md +93 -0
- package/.agents/skills/playwright-webapp-testing/examples/server_lifecycle_playwright.py +63 -0
- package/.agents/skills/rbt-manual-testing/SKILL.md +150 -0
- package/.agents/skills/rbt-manual-testing/examples/checkout_rbt_manual_suite.md +25 -0
- package/.agents/skills/security-dast-sentinel/SKILL.md +57 -135
- package/.agents/skills/security-dast-sentinel/examples/dast_scan_config.json +10 -0
- package/.agents/skills/self-healing-locator/SKILL.md +24 -10
- package/.agents/skills/self-healing-locator/examples/aom_diff_sample.json +16 -0
- package/.agents/skills/skillspector-security-guard/SKILL.md +32 -90
- package/.agents/skills/skillspector-security-guard/examples/safe_mcp_config.json +12 -0
- package/.agents/skills/surgical-coding-principles/SKILL.md +89 -0
- package/.agents/skills/surgical-coding-principles/examples/surgical_vs_scope_creep.md +46 -0
- package/.agents/skills/synthetic-test-data-generator/SKILL.md +3 -3
- package/.agents/skills/synthetic-test-data-generator/examples/idempotent_data_recipe.json +9 -0
- package/.agents/skills/systematic-debugging/SKILL.md +100 -0
- package/.agents/skills/systematic-debugging/examples/four_phase_case.md +44 -0
- package/.agents/skills/test-driven-development/SKILL.md +114 -0
- package/.agents/skills/test-driven-development/examples/red_green_refactor_qa.md +78 -0
- package/.agents/skills/token-and-context-optimizer/SKILL.md +1 -1
- package/.agents/skills/token-and-context-optimizer/examples/distilled_log_sample.txt +3 -0
- package/.agents/skills/verification-before-completion/SKILL.md +100 -0
- package/.agents/skills/verification-before-completion/examples/evidence_log_example.md +46 -0
- package/.agents/skills/visual-regression-sentinel/SKILL.md +21 -1
- package/.agents/skills/visual-regression-sentinel/examples/visual_mask_rules.json +9 -0
- package/.agents/skills/wcag-audit-patterns/SKILL.md +3 -3
- package/.agents/skills/wcag-audit-patterns/examples/wcag_compliance_checklist.json +10 -0
- package/.agents/skills/wcag-audit-patterns/resources/implementation-playbook.md +541 -541
- package/.agents/skills/web-vitals-and-performance-profiler/SKILL.md +1 -1
- package/.agents/skills/web-vitals-and-performance-profiler/examples/cwv_budget_policy.json +6 -0
- package/.agents/templates/completion_report.md +57 -57
- package/.agents/workflows/analyze_requirement_document.md +18 -0
- package/.agents/workflows/export_testcases_excel.md +32 -0
- package/.agents/workflows/generate_combinatorial_test_data.md +28 -0
- package/.agents/workflows/generate_cross_module_test_plan.md +37 -0
- package/.agents/workflows/generate_manual_testcases_rbt.md +56 -0
- package/.agents/workflows/generate_requirements_from_website.md +25 -0
- package/.agents/workflows/generate_testcases_from_requirements.md +21 -0
- package/.agents/workflows/graphify.md +10 -10
- package/.agents/workflows/verify.md +2 -2
- package/.cursor/rules/language.mdc +7 -7
- package/.cursor/rules/synapse-qa.mdc +23 -0
- package/.cursorrules +7 -0
- package/.pre-commit-hooks.yaml +14 -0
- package/.windsurfrules +7 -0
- package/AGENTS.md +54 -15
- package/CLAUDE.md +35 -12
- package/LICENSE +30 -0
- package/NOTICE +180 -0
- package/README.en.md +325 -0
- package/README.md +247 -512
- package/action.yml +51 -0
- package/benchmarks/qa_eval/README.md +71 -0
- package/benchmarks/qa_eval/build_dataset.py +677 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-06_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-07_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-08_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-09_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-10_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-21_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-22_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-23_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-24_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-25_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-01_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-02_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-03_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-04_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-05_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-16_stale_and_mutation.json +22 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-17_stale_and_mutation.json +22 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-18_stale_and_mutation.json +22 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-19_stale_and_mutation.json +22 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-20_stale_and_mutation.json +23 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-11_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-12_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-13_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-14_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-15_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/eval_runner.py +418 -0
- package/benchmarks/qa_eval/reports/AB_METHODOLOGY_REPORT.md +83 -0
- package/benchmarks/qa_eval/reports/BENCHMARK_REPORT.md +69 -0
- package/benchmarks/qa_eval/reports/eval_results.json +105 -0
- package/bin/agent-qa.js +10 -3
- package/docs/ARCHITECTURE.md +107 -0
- package/docs/CI_CD_INTEGRATION.md +94 -0
- package/docs/CLI_REFERENCE.md +157 -0
- package/docs/CONTRIBUTING.md +91 -0
- package/docs/PLUGIN_DEVELOPMENT_GUIDE.md +126 -0
- package/docs/TOKEN_QUOTA_PLAYBOOK.md +41 -0
- package/docs/adopted-ecosystem-tools.md +87 -0
- package/docs/schemas/synapse.config.schema.json +64 -0
- package/examples/cypress-ecommerce-suite/README.md +45 -0
- package/examples/cypress-ecommerce-suite/cypress/e2e/checkout.cy.js +17 -0
- package/examples/cypress-ecommerce-suite/cypress/pages/BasePage.js +29 -0
- package/examples/cypress-ecommerce-suite/cypress/pages/CartPage.js +51 -0
- package/examples/cypress-ecommerce-suite/cypress.config.js +13 -0
- package/examples/cypress-ecommerce-suite/package.json +13 -0
- package/examples/katalon-suite/Keywords/pages/BasePage.groovy +19 -0
- package/examples/katalon-suite/Keywords/pages/DashboardPage.groovy +29 -0
- package/examples/katalon-suite/Keywords/pages/LoginPage.groovy +45 -0
- package/examples/katalon-suite/Profiles/default.glbl +12 -0
- package/examples/katalon-suite/README.md +18 -0
- package/examples/katalon-suite/Scripts/Auth/TC_LoginSuccess/Script1234567890.groovy +12 -0
- package/examples/katalon-suite/Scripts/Dashboard/TC_ViewSummary/Script1234567891.groovy +15 -0
- package/examples/katalon-suite/katalon_suite.prj +21 -0
- package/examples/playwright-crm-suite/README.md +40 -0
- package/examples/playwright-crm-suite/package.json +14 -0
- package/examples/playwright-crm-suite/pages/BasePage.ts +37 -0
- package/examples/playwright-crm-suite/pages/CustomerPage.ts +57 -0
- package/examples/playwright-crm-suite/pages/LoginPage.ts +32 -0
- package/examples/playwright-crm-suite/playwright.config.ts +27 -0
- package/examples/playwright-crm-suite/tests/auth.spec.ts +22 -0
- package/examples/playwright-crm-suite/tests/customers.spec.ts +33 -0
- package/examples/plugins/sample-custom-plugin/README.md +14 -0
- package/examples/plugins/sample-custom-plugin/plugin.json +16 -0
- package/examples/plugins/sample-custom-plugin/skills/custom-security-headers-audit/SKILL.md +29 -0
- package/examples/plugins/sample-custom-plugin/skills/custom-security-headers-audit/examples/audit_fixture.json +8 -0
- package/examples/plugins/sample-custom-plugin/tools/custom_security_headers.py +125 -0
- package/examples/practices/README.md +22 -0
- package/examples/practices/requirements/crm/requirements_contracts.md +292 -0
- package/examples/practices/requirements/crm/requirements_customers.md +462 -0
- package/examples/practices/requirements/crm/requirements_login.md +202 -0
- package/examples/practices/requirements/crm/requirements_projects.md +396 -0
- package/examples/practices/requirements/crm/requirements_tasks.md +343 -0
- package/examples/practices/requirements/ecommerce/requirements_category_brand.txt +402 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-1/2026-04-03_04-28-27.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-1/KAN-1_requirement.md +52 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-4/2026-04-03_04-28-19.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-4/2026-04-03_04-28-57.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-4/KAN-4_requirement.md +119 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-5_overview.md +9 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-6/2026-04-03_05-58-08.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-6/2026-04-03_05-58-23.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-6/KAN-6_requirement.md +32 -0
- package/examples/practices/testcases/api/book_management_api_test_cases.md +144 -0
- package/examples/practices/testcases/api/user_management_api_test_cases.md +139 -0
- package/examples/practices/testcases/crm/test_cases_crm_login.md +148 -0
- package/examples/practices/testcases/crm/test_cases_customers.md +156 -0
- package/examples/pytest-api-suite/README.md +45 -0
- package/examples/pytest-api-suite/conftest.py +31 -0
- package/examples/pytest-api-suite/pages/user_api_client.py +36 -0
- package/examples/pytest-api-suite/requirements.txt +2 -0
- package/examples/pytest-api-suite/tests/test_user_api.py +44 -0
- package/examples/selenium-suite/README.md +18 -0
- package/examples/selenium-suite/pages/base_page.py +27 -0
- package/examples/selenium-suite/pages/login_page.py +29 -0
- package/examples/selenium-suite/pages/order_page.py +25 -0
- package/examples/selenium-suite/pytest.ini +6 -0
- package/examples/selenium-suite/requirements.txt +2 -0
- package/examples/selenium-suite/tests/test_login.py +10 -0
- package/examples/selenium-suite/tests/test_order.py +10 -0
- package/package.json +22 -7
- package/scripts/generate_skill_examples.py +244 -0
- package/scripts/install.ps1 +112 -0
- package/scripts/install_global_plugin.ps1 +94 -0
- package/scripts/install_global_plugin.sh +49 -0
- package/scripts/lint_skills.ps1 +57 -0
- package/scripts/package_dist.py +323 -0
- package/scripts/setup.sh +59 -0
- package/scripts/update_hub.ps1 +19 -0
- package/scripts/update_hub.sh +15 -0
- package/skills_manifest.json +209 -6
- package/synapse.config.json +30 -0
- package/templates/PROJECT_AI_GUIDE_TEMPLATE.md +7 -7
- package/templates/PROJECT_STATE_TEMPLATE.md +1 -1
- package/templates/ai_bridges/CLAUDE.md +33 -16
- package/templates/ai_bridges/copilot-instructions.md +14 -21
- package/templates/ai_bridges/cursor_synapse_qa.mdc +17 -20
- package/templates/ai_bridges/windsurfrules +21 -21
- package/templates/ci/github-actions-synapse.yml +71 -4
- package/templates/welcome.html.tmpl +1674 -0
- package/tools/.infer_baseline.json +1102 -0
- package/tools/TOOLS_RUNBOOK.md +92 -130
- package/tools/__init__.py +26 -0
- package/tools/agent_canary.py +501 -501
- package/tools/analyze_project.py +31 -17
- package/tools/api_fuzzer.py +278 -6
- package/tools/author_integrity.py +6 -6
- package/tools/auto_heal.py +1 -1
- package/tools/browser_helpers.js +105 -7
- package/tools/bug_reporter.py +31 -1
- package/tools/bump_version.py +23 -3
- package/tools/cache_resolver.py +248 -14
- package/tools/check_env.py +55 -14
- package/tools/check_version_sync.py +153 -0
- package/tools/ci_healing_hook.py +1 -1
- package/tools/cli.py +263 -13
- package/tools/count_tokens.py +1257 -0
- package/tools/dashboard_generator.py +2638 -0
- package/tools/db_sandbox.py +198 -20
- package/tools/e2e_flow_prober.ps1 +12 -64
- package/tools/e2e_flow_prober.py +99 -0
- package/tools/e2e_flow_prober.sh +4 -0
- package/tools/export_postman_collection.py +29 -7
- package/tools/flaky_detector.py +4 -3
- package/tools/generate_allure_report.ps1 +12 -29
- package/tools/generate_allure_report.py +77 -0
- package/tools/generate_allure_report.sh +4 -0
- package/tools/generate_jmx_plan.py +299 -68
- package/tools/generate_test_reports.ps1 +12 -134
- package/tools/generate_test_reports.py +133 -0
- package/tools/generate_test_reports.sh +4 -0
- package/tools/gherkin_suite.py +758 -0
- package/tools/git_pre_commit_guard.py +12 -6
- package/tools/goldfish_review.py +366 -0
- package/tools/heal_pr_automator.py +1 -1
- package/tools/heuristic_locator_matcher.py +170 -21
- package/tools/infer_linter.py +612 -70
- package/tools/jtl_analyzer.py +1 -1
- package/tools/lint_ai_docs.py +64 -0
- package/tools/matrix_sharder.py +1 -1
- package/tools/mcp_excel_server.ps1 +12 -250
- package/tools/mcp_excel_server.py +249 -0
- package/tools/mcp_excel_server.sh +4 -0
- package/tools/mcp_server.py +368 -144
- package/tools/md_to_xlsx.py +307 -0
- package/tools/micro_mutator.py +300 -69
- package/tools/omni_transpiler.py +2 -2
- package/tools/output_formatter.py +128 -0
- package/tools/pinpoint_failure.py +88 -88
- package/tools/project_state.py +2 -2
- package/tools/repo_map.py +1 -1
- package/tools/safety_firewall.py +197 -33
- package/tools/setup_project.py +294 -30
- package/tools/skillspector.py +8 -8
- package/tools/spec_drift_sentinel.py +439 -0
- package/tools/sync_agent_rules.py +248 -0
- package/tools/telemetry_correlator.py +45 -0
- package/tools/test_impact.py +51 -12
- package/tools/tms_sync_bridge.py +21 -5
- package/tools/universal_ir.py +3 -0
- package/tools/update_sentinel.py +87 -15
- package/tools/verify_all.ps1 +13 -0
- package/tools/verify_all.py +463 -79
- package/tools/visual_diff_canvas.py +1 -0
- package/tools/visual_som_helper.py +1 -1
- package/tools/watch_mode.py +305 -0
- package/tools/welcome_page.py +291 -0
|
@@ -1,248 +1,142 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: backend-load-and-stress-patterns
|
|
3
|
-
description: "Orchestrate k6 and
|
|
3
|
+
description: "Orchestrate k6, Locust, and JMeter backend load, stress, and SLA endurance test suites. Use when designing load, stress, or spike test patterns for backend systems."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Backend Load &
|
|
6
|
+
# Backend Load & Performance Testing Skill
|
|
7
7
|
|
|
8
|
-
> **
|
|
8
|
+
> **Target:** Model concurrent Virtual User (VU) and arrival-rate traffic, execute stress/soak test profiles, and enforce automated SLA gates (P95/P99 latency, error rate < 1.0%) to detect bottlenecks before production.
|
|
9
|
+
> **Mandatory Rule:** Adhere strictly to [.agents/rules/performance_testing_rules.md](file://.agents/rules/performance_testing_rules.md) for safety approvals, hard caps, and truth-anchor reporting.
|
|
9
10
|
|
|
10
11
|
---
|
|
11
12
|
|
|
12
|
-
## 1.
|
|
13
|
+
## 1. Test Archetypes & SLA Targets
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
flowchart LR
|
|
16
|
-
A["<b>1. Smoke Test</b><br/>1-5 VUs / 1 min<br/>Sanity check"] --> B["<b>2. Load Test</b><br/>50-200 VUs / 15m<br/>Expected daily peak"]
|
|
17
|
-
B --> C["<b>3. Stress Test</b><br/>500-2000+ VUs<br/>Find breaking point"]
|
|
18
|
-
C --> D["<b>4. Spike Test</b><br/>Instant surge 10->1000<br/>Traffic shocks"]
|
|
19
|
-
D --> E["<b>5. Soak / Endurance</b><br/>Stable load / 2-12 hrs<br/>Memory leaks & OOM"]
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
| Test Archetype | Virtual Users (VUs) | Duration | Primary Objective | Failure Indicator |
|
|
15
|
+
| Archetype | VUs / Rate | Duration | Objective | SLA Assertion |
|
|
23
16
|
| :--- | :--- | :--- | :--- | :--- |
|
|
24
|
-
| **Smoke Test** | 1 - 5 VUs | 1 - 2
|
|
25
|
-
| **Load
|
|
26
|
-
| **Stress Test** | 200 -> 2,000
|
|
27
|
-
| **Spike Test** | 10 -> 1,000 VUs
|
|
28
|
-
| **Soak Test** | 50 - 100 VUs | 2 - 12
|
|
17
|
+
| **Smoke Test** | 1 - 5 VUs | 1 - 2 min | Health sanity check | Error rate = 0%, P95 < 300ms |
|
|
18
|
+
| **Average Load** | 50 - 200 VUs | 10 - 30 min | Standard peak capacity | Error rate < 0.5%, P95 < 500ms |
|
|
19
|
+
| **Stress Test** | 200 -> 2,000 VUs | 20 - 45 min | Find degradation cliff | Graceful 429/503 (no JVM OOM) |
|
|
20
|
+
| **Spike Test** | 10 -> 1,000 VUs | 5 - 10 min | Autoscaling & rate limiters | Gateway recovery < 30s |
|
|
21
|
+
| **Soak Test** | 50 - 100 VUs | 2 - 12 hr | Memory leaks & connection leaks | Stable heap & steady latency |
|
|
29
22
|
|
|
30
23
|
---
|
|
31
24
|
|
|
32
|
-
## 2.
|
|
25
|
+
## 2. Tooling Unified Runbook
|
|
33
26
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
export const options = {
|
|
39
|
-
thresholds: {
|
|
40
|
-
// 95% of requests must complete under 500ms
|
|
41
|
-
http_req_duration: ['p(95)<500', 'p(99)<1000'],
|
|
42
|
-
// Request failure rate must stay under 0.1%
|
|
43
|
-
http_req_failed: ['rate<0.001'],
|
|
44
|
-
// Functional checks must maintain > 99.9% success
|
|
45
|
-
checks: ['rate>0.999'],
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
```
|
|
27
|
+
### Option A: Apache JMeter (Headless CLI + JTL Analyzer)
|
|
28
|
+
```bash
|
|
29
|
+
# 1. Generate XML test plan from OpenAPI / Postman
|
|
30
|
+
synapse generate-jmx --spec api.json -o load_plan.jmx --vus 50 --duration 180 --sla-p95 500
|
|
49
31
|
|
|
50
|
-
|
|
32
|
+
# 2. Run headless benchmark
|
|
33
|
+
jmeter -n -t load_plan.jmx -l results.jtl -e -o ./html_report
|
|
51
34
|
|
|
52
|
-
|
|
35
|
+
# 3. Automated CI/CD Quality Gatekeeper
|
|
36
|
+
synapse analyze-jtl results.jtl --sla-p95 500 --max-error-rate 1.0
|
|
37
|
+
```
|
|
53
38
|
|
|
39
|
+
### Option B: k6 Production Load Testing (with Kill-Switch & Arrival Rate)
|
|
54
40
|
```javascript
|
|
55
41
|
import http from 'k6/http';
|
|
56
42
|
import { check, sleep } from 'k6';
|
|
57
|
-
import { Counter, Rate, Trend } from 'k6/metrics';
|
|
58
|
-
|
|
59
|
-
// Custom Enterprise Metrics
|
|
60
|
-
const errorRate = new Rate('custom_error_rate');
|
|
61
|
-
const searchLatency = new Trend('search_latency');
|
|
62
43
|
|
|
63
44
|
export const options = {
|
|
45
|
+
discardResponseBodies: true,
|
|
64
46
|
scenarios: {
|
|
65
|
-
|
|
66
|
-
executor: 'ramping-
|
|
67
|
-
|
|
47
|
+
steady_load: {
|
|
48
|
+
executor: 'ramping-arrival-rate',
|
|
49
|
+
startRate: 10,
|
|
50
|
+
timeUnit: '1s',
|
|
51
|
+
preAllocatedVUs: 50,
|
|
52
|
+
maxVUs: 200,
|
|
68
53
|
stages: [
|
|
69
|
-
{ duration: '2m', target: 50 },
|
|
70
|
-
{ duration: '
|
|
71
|
-
{ duration: '2m', target:
|
|
72
|
-
{ duration: '3m', target: 150 }, // Sustained stress
|
|
73
|
-
{ duration: '2m', target: 0 }, // Ramp-down to 0
|
|
54
|
+
{ duration: '2m', target: 50 }, // Ramp-up
|
|
55
|
+
{ duration: '10m', target: 50 }, // Steady state (SLA measured here)
|
|
56
|
+
{ duration: '2m', target: 0 }, // Ramp-down
|
|
74
57
|
],
|
|
75
|
-
gracefulRampDown: '30s',
|
|
76
58
|
},
|
|
77
59
|
},
|
|
78
60
|
thresholds: {
|
|
79
|
-
|
|
80
|
-
|
|
61
|
+
// 1. Steady state SLA thresholds
|
|
62
|
+
'http_req_failed{scenario:steady_load}': ['rate<0.01'],
|
|
63
|
+
'http_req_duration{scenario:steady_load,expected_response:true}': ['p(95)<500', 'p(99)<1000'],
|
|
64
|
+
'checks{scenario:steady_load}': ['rate>0.99'],
|
|
65
|
+
'dropped_iterations{scenario:steady_load}': ['count==0'],
|
|
66
|
+
// 2. Kill-switch: abort test if system fails catastrophically
|
|
67
|
+
http_req_failed: [{ threshold: 'rate<0.10', abortOnFail: true, delayAbortEval: '30s' }],
|
|
81
68
|
},
|
|
82
69
|
};
|
|
83
70
|
|
|
84
|
-
|
|
85
|
-
|
|
71
|
+
// 1. One-time setup: authenticate and obtain auth token
|
|
86
72
|
export function setup() {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
password: __ENV.PERF_PASSWORD || 'SecretVault#2026',
|
|
73
|
+
const loginRes = http.post(`${__ENV.BASE_URL}/api/v1/auth/login`, JSON.stringify({
|
|
74
|
+
username: __ENV.PERF_USER,
|
|
75
|
+
password: __ENV.PERF_PASSWORD,
|
|
91
76
|
}), { headers: { 'Content-Type': 'application/json' } });
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const token = authRes.json('token');
|
|
95
|
-
return { token };
|
|
77
|
+
|
|
78
|
+
return { token: loginRes.json('token') };
|
|
96
79
|
}
|
|
97
80
|
|
|
81
|
+
// 2. Virtual User journey
|
|
98
82
|
export default function (data) {
|
|
99
83
|
const params = {
|
|
100
84
|
headers: {
|
|
101
85
|
'Authorization': `Bearer ${data.token}`,
|
|
102
86
|
'Content-Type': 'application/json',
|
|
103
|
-
'X-Correlation-ID': `PERF-${__VU}-${__ITER}-${Date.now()}`,
|
|
104
87
|
},
|
|
88
|
+
tags: { name: 'GET /api/v1/items' },
|
|
105
89
|
};
|
|
106
90
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
'Catalog GET 200': (r) => r.status === 200,
|
|
111
|
-
'Catalog Payload Valid': (r) => r.json('data.items') !== undefined,
|
|
91
|
+
const res = http.get(`${__ENV.BASE_URL}/api/v1/items?page=1&limit=20`, params);
|
|
92
|
+
check(res, {
|
|
93
|
+
'status is 200': (r) => r.status === 200,
|
|
112
94
|
});
|
|
113
|
-
errorRate.add(!getOk);
|
|
114
|
-
searchLatency.add(resGet.timings.duration);
|
|
115
95
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
// 2. Transaction B: Dynamic Mutation API
|
|
119
|
-
const payload = JSON.stringify({
|
|
120
|
-
code: `AUTO_PERF_${__VU}_${__ITER}_${Date.now()}`,
|
|
121
|
-
name: 'Dynamic Synthetic Benchmark Item',
|
|
122
|
-
active: true,
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
const resPost = http.post(`${BASE_URL}/api/v1/catalogs`, payload, params);
|
|
126
|
-
const postOk = check(resPost, {
|
|
127
|
-
'Catalog POST 201': (r) => r.status === 201 || r.status === 200,
|
|
128
|
-
});
|
|
129
|
-
errorRate.add(!postOk);
|
|
130
|
-
|
|
131
|
-
sleep(2);
|
|
96
|
+
// Realistic think time between actions (uniform 1s to 3s)
|
|
97
|
+
sleep(Math.random() * 2 + 1);
|
|
132
98
|
}
|
|
133
99
|
|
|
100
|
+
// 3. Ephemeral teardown cleanup
|
|
134
101
|
export function teardown(data) {
|
|
135
|
-
//
|
|
102
|
+
// Execute teardown API calls for created PERF_ entities
|
|
136
103
|
}
|
|
137
104
|
```
|
|
138
105
|
|
|
139
106
|
---
|
|
140
107
|
|
|
141
|
-
##
|
|
142
|
-
|
|
143
|
-
```python
|
|
144
|
-
import os
|
|
145
|
-
import time
|
|
146
|
-
from locust import HttpUser, task, between, events
|
|
147
|
-
|
|
148
|
-
class EnterpriseBackendUser(HttpUser):
|
|
149
|
-
wait_time = between(1.0, 2.5) # Realistic user think-time
|
|
150
|
-
|
|
151
|
-
def on_start(self):
|
|
152
|
-
"""Initial authentication handshake per Virtual User."""
|
|
153
|
-
res = self.client.post("/api/v1/auth/login", json={
|
|
154
|
-
"username": os.getenv("PERF_USER", "perf_tester"),
|
|
155
|
-
"password": os.getenv("PERF_PWD", "SecretPass2026")
|
|
156
|
-
})
|
|
157
|
-
if res.status_code == 200:
|
|
158
|
-
token = res.json().get("token")
|
|
159
|
-
self.client.headers.update({"Authorization": f"Bearer {token}"})
|
|
160
|
-
|
|
161
|
-
@task(3)
|
|
162
|
-
def query_search_index(self):
|
|
163
|
-
"""High-frequency read query."""
|
|
164
|
-
with self.client.get("/api/v1/search?q=enterprise&page=1", catch_response=True) as response:
|
|
165
|
-
if response.status_code != 200:
|
|
166
|
-
response.failure(f"Search API failed with HTTP {response.status_code}")
|
|
167
|
-
elif response.elapsed.total_seconds() > 0.5:
|
|
168
|
-
response.failure(f"Search API SLA breached (>500ms): {response.elapsed.total_seconds():.3f}s")
|
|
169
|
-
|
|
170
|
-
@task(1)
|
|
171
|
-
def submit_order_transaction(self):
|
|
172
|
-
"""Mutation transaction with dynamic unique identifier."""
|
|
173
|
-
order_id = f"ORDER_PERF_{time.time_ns()}"
|
|
174
|
-
with self.client.post("/api/v1/orders", json={
|
|
175
|
-
"orderCode": order_id,
|
|
176
|
-
"items": [{"sku": "SKU-990", "quantity": 1}],
|
|
177
|
-
"totalAmount": 150000
|
|
178
|
-
}, catch_response=True) as response:
|
|
179
|
-
if response.status_code not in (200, 201):
|
|
180
|
-
response.failure(f"Order submission failed: {response.text}")
|
|
181
|
-
```
|
|
108
|
+
## 3. Best Practices & Safety Invariants
|
|
182
109
|
|
|
183
|
-
|
|
110
|
+
- **Isolated Test Data:** Always use dynamic runtime identifiers (`PERF_AUTO_${Date.now()}`) to eliminate primary key collisions.
|
|
111
|
+
- **TearDown Hygiene:** Complement POST/creation load tests with automated teardown or ephemeral DB snapshots (`tools/db_sandbox.py`).
|
|
112
|
+
- **Telemetry Correlation:** Pair JTL/k6 metrics with server CPU/Memory traces via `tools/telemetry_correlator.py`.
|
|
113
|
+
- **Truth Anchor:** Never loosen thresholds to manufacture a false pass. A failing threshold indicates a system capacity limit to be investigated.
|
|
184
114
|
|
|
185
|
-
|
|
115
|
+
---
|
|
186
116
|
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
# Execute 100-user load test and export raw metrics
|
|
190
|
-
k6 run --out json=reports/k6_metrics.json tests/load/k6_catalog_load.js
|
|
191
|
-
|
|
192
|
-
# Assert exit code in CI/CD pipeline
|
|
193
|
-
if [ $? -ne 0 ]; then
|
|
194
|
-
echo "❌ Performance SLA threshold breached!"
|
|
195
|
-
exit 1
|
|
196
|
-
fi
|
|
197
|
-
```
|
|
117
|
+
## 4. Code-as-Code Load Model (Locust)
|
|
198
118
|
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
locust -f tests/load/locustfile.py --headless -u 100 -r 10 --run-time 5m \
|
|
202
|
-
--host https://api.staging.enterprise.local \
|
|
203
|
-
--html reports/locust_report.html \
|
|
204
|
-
--exit-code-on-error 1
|
|
205
|
-
```
|
|
119
|
+
> *Borrowed and adapted from the Locust load-testing model (MIT license, locustio/locust).*
|
|
206
120
|
|
|
207
|
-
|
|
208
|
-
|
|
121
|
+
When version-controlled, reviewable load tests matter more than XML tooling,
|
|
122
|
+
generate a runnable locustfile from the same API ingestion used for JMeter:
|
|
209
123
|
|
|
210
124
|
```bash
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
--weighted-mix "70:Browse,20:Cart,10:Checkout" \
|
|
215
|
-
--csv-data users.csv --deep-correlation --jsr223-hmac
|
|
216
|
-
|
|
217
|
-
# 2. Multi-Protocol Load Plans (WebSocket, gRPC, Kafka, JDBC)
|
|
218
|
-
agent-qa generate-jmx --ws-sample -o websocket_plan.jmx # Real-time WebSocket feed
|
|
219
|
-
agent-qa generate-jmx --grpc-sample -o grpc_plan.jmx # Microservices Unary RPC
|
|
220
|
-
agent-qa generate-jmx --kafka-sample -o kafka_plan.jmx # Event-driven message broker
|
|
221
|
-
agent-qa generate-jmx --jdbc-sample -o jdbc_plan.jmx # Direct Database SQL pool
|
|
222
|
-
|
|
223
|
-
# 3. Live APM Telemetry & PerfMon Hardware Agent
|
|
224
|
-
agent-qa generate-jmx --spec swagger.json -o perf_plan.jmx \
|
|
225
|
-
--influxdb-url http://influxdb:8086/write?db=jmeter \
|
|
226
|
-
--perfmon-server 192.168.1.50:4444
|
|
227
|
-
|
|
228
|
-
# 4. Distributed Cluster Execution (Master + 3 Slaves)
|
|
229
|
-
docker-compose -f tools/templates/jmeter-distributed/docker-compose.yml up -d
|
|
230
|
-
jmeter -n -t perf_plan.jmx -R slave1,slave2,slave3 -l results.jtl
|
|
231
|
-
|
|
232
|
-
# 5. CI/CD SLA Quality Gate Enforcement (Exit code 0 on Pass, 1 on Breach)
|
|
233
|
-
agent-qa analyze-jtl results.jtl --sla-p95 500 --max-error-rate 1.0 \
|
|
234
|
-
--markdown pr_perf_report.md --json metrics.json
|
|
235
|
-
|
|
236
|
-
# 6. Full-Stack APM & Server Infrastructure RCA Correlator
|
|
237
|
-
agent-qa correlate-telemetry --jtl results.jtl --server-metrics server_metrics.csv \
|
|
238
|
-
--markdown rca_report.md
|
|
125
|
+
synapse generate-jmx --spec swagger.json --emit-locust locustfile.py \
|
|
126
|
+
--weighted-mix "70,20,10" --think-time-min 500 --think-time-max 1500
|
|
127
|
+
locust -f locustfile.py --host=https://api.staging.enterprise.local
|
|
239
128
|
```
|
|
240
129
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
130
|
+
The generated file follows the Locust shape — one `HttpUser` class, one
|
|
131
|
+
`@task(weight)` method per endpoint, `wait_time` from think-time — so QA
|
|
132
|
+
engineers can hand-tune scenarios in pure Python and commit them next to the
|
|
133
|
+
test suite.
|
|
134
|
+
|
|
135
|
+
1. **Weights are the traffic mix** — the same `--weighted-mix` percentages that
|
|
136
|
+
drive JMeter `ThroughputController`s drive `@task` weights; keep both exports
|
|
137
|
+
in sync from one spec.
|
|
138
|
+
2. **Prefer code-as-code for logic-heavy journeys** — conditional flows
|
|
139
|
+
(login → create → assert → delete) are Python, not XML; use the JMX export
|
|
140
|
+
for protocol breadth (JDBC/Kafka/gRPC/WS) and Locust for flow logic.
|
|
141
|
+
3. **Same SLA gates** — run `agent-qa analyze-jtl` semantics on Locust stats:
|
|
142
|
+
fail CI when P95 breaches the SLA budget.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import http from 'k6/http';
|
|
2
|
+
import { check, sleep } from 'k6';
|
|
3
|
+
|
|
4
|
+
export const options = {
|
|
5
|
+
vus: 10,
|
|
6
|
+
duration: '30s',
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export default function () {
|
|
10
|
+
const res = http.get('https://test.k6.io');
|
|
11
|
+
check(res, { 'status was 200': (r) => r.status == 200 });
|
|
12
|
+
sleep(1);
|
|
13
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bats-testing-patterns
|
|
3
|
-
description: "Test bash/sh scripts, CLI tools, and CI/CD pipelines with Bats."
|
|
3
|
+
description: "Test bash/sh scripts, CLI tools, and CI/CD pipelines with Bats. Use when writing Bash automation tests with the BATS framework."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Bats Testing Patterns (Bash Automated Testing System)
|