qa-skills 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -0
- package/bin/cli.js +42 -0
- package/dist/agents/registry.d.ts +5 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +101 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +9 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/dependencies.d.ts +21 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +125 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/installer.d.ts +25 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +437 -0
- package/dist/installer.js.map +1 -0
- package/dist/scaffold.d.ts +27 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +182 -0
- package/dist/scaffold.js.map +1 -0
- package/package.json +40 -0
- package/skills/qa-accessibility-test-writer/SKILL.md +127 -0
- package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +349 -0
- package/skills/qa-accessibility-test-writer/references/best-practices.md +184 -0
- package/skills/qa-accessibility-test-writer/references/wcag-tests.md +331 -0
- package/skills/qa-api-contract-curator/SKILL.md +104 -0
- package/skills/qa-api-contract-curator/references/breaking-changes.md +363 -0
- package/skills/qa-api-contract-curator/references/openapi-structure.md +404 -0
- package/skills/qa-browser-data-collector/SKILL.md +132 -0
- package/skills/qa-browser-data-collector/references/data-collection-checklist.md +91 -0
- package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +113 -0
- package/skills/qa-bug-ticket-creator/SKILL.md +148 -0
- package/skills/qa-bug-ticket-creator/references/bug-report-format.md +149 -0
- package/skills/qa-bug-ticket-creator/references/severity-guide.md +81 -0
- package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +39 -0
- package/skills/qa-changelog-analyzer/SKILL.md +134 -0
- package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +138 -0
- package/skills/qa-changelog-analyzer/references/impact-mapping.md +120 -0
- package/skills/qa-clickup-integration/SKILL.md +166 -0
- package/skills/qa-clickup-integration/references/api-patterns.md +102 -0
- package/skills/qa-clickup-integration/references/field-mapping.md +71 -0
- package/skills/qa-codeceptjs-writer/SKILL.md +136 -0
- package/skills/qa-codeceptjs-writer/references/best-practices.md +207 -0
- package/skills/qa-codeceptjs-writer/references/config.md +255 -0
- package/skills/qa-codeceptjs-writer/references/patterns.md +285 -0
- package/skills/qa-coverage-analyzer/SKILL.md +166 -0
- package/skills/qa-coverage-analyzer/references/best-practices.md +142 -0
- package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +155 -0
- package/skills/qa-coverage-analyzer/references/tools.md +204 -0
- package/skills/qa-cypress-writer/SKILL.md +134 -0
- package/skills/qa-cypress-writer/references/assertions.md +121 -0
- package/skills/qa-cypress-writer/references/best-practices.md +82 -0
- package/skills/qa-cypress-writer/references/config.md +121 -0
- package/skills/qa-cypress-writer/references/patterns.md +170 -0
- package/skills/qa-data-factory/SKILL.md +126 -0
- package/skills/qa-data-factory/references/factory-patterns.md +164 -0
- package/skills/qa-data-factory/references/faker-guide.md +131 -0
- package/skills/qa-diagram-generator/SKILL.md +125 -0
- package/skills/qa-diagram-generator/references/c4-model.md +53 -0
- package/skills/qa-diagram-generator/references/charts.md +58 -0
- package/skills/qa-diagram-generator/references/class-diagram.md +85 -0
- package/skills/qa-diagram-generator/references/er-diagram.md +69 -0
- package/skills/qa-diagram-generator/references/flowchart.md +92 -0
- package/skills/qa-diagram-generator/references/from-screenshot.md +45 -0
- package/skills/qa-diagram-generator/references/gantt.md +49 -0
- package/skills/qa-diagram-generator/references/journey.md +50 -0
- package/skills/qa-diagram-generator/references/mindmap.md +75 -0
- package/skills/qa-diagram-generator/references/sequence.md +69 -0
- package/skills/qa-diagram-generator/references/state-diagram.md +56 -0
- package/skills/qa-discovery-interview/SKILL.md +182 -0
- package/skills/qa-discovery-interview/references/completeness-checklist.md +53 -0
- package/skills/qa-discovery-interview/references/conflict-patterns.md +101 -0
- package/skills/qa-discovery-interview/references/qa-categories.md +147 -0
- package/skills/qa-discovery-interview/templates/qa-brief-template.md +168 -0
- package/skills/qa-environment-checker/SKILL.md +142 -0
- package/skills/qa-environment-checker/references/dependency-matrix.md +101 -0
- package/skills/qa-environment-checker/references/health-checks.md +209 -0
- package/skills/qa-environment-checker/templates/env-readiness-template.md +64 -0
- package/skills/qa-flaky-detector/SKILL.md +153 -0
- package/skills/qa-flaky-detector/references/ci-analysis.md +140 -0
- package/skills/qa-flaky-detector/references/flaky-patterns.md +247 -0
- package/skills/qa-github-issues-enhanced/SKILL.md +175 -0
- package/skills/qa-github-issues-enhanced/references/issue-templates.md +425 -0
- package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +130 -0
- package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +188 -0
- package/skills/qa-httpx-writer/SKILL.md +138 -0
- package/skills/qa-httpx-writer/references/assertions.md +195 -0
- package/skills/qa-httpx-writer/references/best-practices.md +140 -0
- package/skills/qa-httpx-writer/references/config.md +212 -0
- package/skills/qa-httpx-writer/references/patterns.md +262 -0
- package/skills/qa-jest-writer/SKILL.md +131 -0
- package/skills/qa-jest-writer/references/assertions.md +125 -0
- package/skills/qa-jest-writer/references/best-practices.md +136 -0
- package/skills/qa-jest-writer/references/config.md +134 -0
- package/skills/qa-jest-writer/references/patterns.md +172 -0
- package/skills/qa-jira-integration/SKILL.md +135 -0
- package/skills/qa-jira-integration/references/api-patterns.md +143 -0
- package/skills/qa-jira-integration/references/field-mapping.md +79 -0
- package/skills/qa-jira-integration/references/xray-integration.md +85 -0
- package/skills/qa-jmeter-writer/SKILL.md +171 -0
- package/skills/qa-jmeter-writer/references/best-practices.md +157 -0
- package/skills/qa-jmeter-writer/references/config.md +204 -0
- package/skills/qa-jmeter-writer/references/patterns.md +242 -0
- package/skills/qa-junit5-writer/SKILL.md +157 -0
- package/skills/qa-junit5-writer/references/assertions.md +118 -0
- package/skills/qa-junit5-writer/references/config.md +97 -0
- package/skills/qa-junit5-writer/references/patterns.md +162 -0
- package/skills/qa-k6-writer/SKILL.md +155 -0
- package/skills/qa-k6-writer/references/best-practices.md +236 -0
- package/skills/qa-k6-writer/references/config.md +219 -0
- package/skills/qa-k6-writer/references/patterns.md +304 -0
- package/skills/qa-linear-integration/SKILL.md +137 -0
- package/skills/qa-linear-integration/references/api-patterns.md +249 -0
- package/skills/qa-linear-integration/references/field-mapping.md +121 -0
- package/skills/qa-locust-writer/SKILL.md +151 -0
- package/skills/qa-locust-writer/references/best-practices.md +126 -0
- package/skills/qa-locust-writer/references/config.md +170 -0
- package/skills/qa-locust-writer/references/patterns.md +235 -0
- package/skills/qa-manual-test-designer/SKILL.md +145 -0
- package/skills/qa-manual-test-designer/references/exploratory-charters.md +138 -0
- package/skills/qa-manual-test-designer/references/personas.md +146 -0
- package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +47 -0
- package/skills/qa-manual-test-designer/templates/test-case-template.md +31 -0
- package/skills/qa-mobile-test-writer/SKILL.md +144 -0
- package/skills/qa-mobile-test-writer/references/best-practices.md +214 -0
- package/skills/qa-mobile-test-writer/references/config.md +309 -0
- package/skills/qa-mobile-test-writer/references/patterns.md +304 -0
- package/skills/qa-nfr-analyst/SKILL.md +177 -0
- package/skills/qa-nfr-analyst/references/iso-25010-model.md +159 -0
- package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +202 -0
- package/skills/qa-nfr-analyst/references/wcag-checklist.md +184 -0
- package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +89 -0
- package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +48 -0
- package/skills/qa-orchestrator/SKILL.md +132 -0
- package/skills/qa-orchestrator/references/handoff-chains.md +105 -0
- package/skills/qa-orchestrator/references/pipeline-modes.md +115 -0
- package/skills/qa-orchestrator/references/scheduler-rules.md +84 -0
- package/skills/qa-pact-writer/SKILL.md +133 -0
- package/skills/qa-pact-writer/references/best-practices.md +100 -0
- package/skills/qa-pact-writer/references/config.md +135 -0
- package/skills/qa-pact-writer/references/patterns.md +161 -0
- package/skills/qa-plan-creator/SKILL.md +139 -0
- package/skills/qa-plan-creator/references/introduction-plan.md +43 -0
- package/skills/qa-plan-creator/references/migration-plan.md +44 -0
- package/skills/qa-plan-creator/references/onboarding-plan.md +46 -0
- package/skills/qa-plan-creator/references/performance-plan.md +44 -0
- package/skills/qa-plan-creator/references/regression-plan.md +45 -0
- package/skills/qa-plan-creator/references/release-plan.md +45 -0
- package/skills/qa-plan-creator/references/sprint-plan.md +44 -0
- package/skills/qa-plan-creator/references/test-plan.md +59 -0
- package/skills/qa-plan-creator/references/uat-plan.md +43 -0
- package/skills/qa-plan-creator/templates/checklist-template.md +36 -0
- package/skills/qa-plan-creator/templates/regression-checklist-template.md +49 -0
- package/skills/qa-plan-creator/templates/release-checklist-template.md +46 -0
- package/skills/qa-plan-creator/templates/test-plan-template.md +74 -0
- package/skills/qa-playwright-py-writer/SKILL.md +156 -0
- package/skills/qa-playwright-py-writer/references/best-practices.md +194 -0
- package/skills/qa-playwright-py-writer/references/config.md +195 -0
- package/skills/qa-playwright-py-writer/references/patterns.md +212 -0
- package/skills/qa-playwright-ts-writer/SKILL.md +151 -0
- package/skills/qa-playwright-ts-writer/references/assertions.md +109 -0
- package/skills/qa-playwright-ts-writer/references/best-practices.md +191 -0
- package/skills/qa-playwright-ts-writer/references/config.md +144 -0
- package/skills/qa-playwright-ts-writer/references/patterns.md +171 -0
- package/skills/qa-pytest-writer/SKILL.md +145 -0
- package/skills/qa-pytest-writer/references/assertions.md +149 -0
- package/skills/qa-pytest-writer/references/best-practices.md +97 -0
- package/skills/qa-pytest-writer/references/config.md +176 -0
- package/skills/qa-pytest-writer/references/patterns.md +251 -0
- package/skills/qa-qase-integration/SKILL.md +149 -0
- package/skills/qa-qase-integration/references/api-reference.md +354 -0
- package/skills/qa-qase-integration/references/ci-integration.md +196 -0
- package/skills/qa-qase-integration/references/field-mapping.md +157 -0
- package/skills/qa-requirements-generator/SKILL.md +152 -0
- package/skills/qa-requirements-generator/references/iso-29148-structure.md +153 -0
- package/skills/qa-requirements-generator/references/requirement-patterns.md +278 -0
- package/skills/qa-rest-assured-writer/SKILL.md +137 -0
- package/skills/qa-rest-assured-writer/references/best-practices.md +50 -0
- package/skills/qa-rest-assured-writer/references/config.md +124 -0
- package/skills/qa-rest-assured-writer/references/patterns.md +192 -0
- package/skills/qa-risk-analyzer/SKILL.md +158 -0
- package/skills/qa-risk-analyzer/references/impact-analysis.md +133 -0
- package/skills/qa-risk-analyzer/references/risk-factors.md +123 -0
- package/skills/qa-robot-framework-writer/SKILL.md +147 -0
- package/skills/qa-robot-framework-writer/references/best-practices.md +249 -0
- package/skills/qa-robot-framework-writer/references/config.md +204 -0
- package/skills/qa-robot-framework-writer/references/libraries.md +273 -0
- package/skills/qa-robot-framework-writer/references/patterns.md +216 -0
- package/skills/qa-security-test-writer/SKILL.md +123 -0
- package/skills/qa-security-test-writer/references/best-practices.md +155 -0
- package/skills/qa-security-test-writer/references/owasp-top10.md +331 -0
- package/skills/qa-security-test-writer/references/zap-config.md +258 -0
- package/skills/qa-selenium-java-writer/SKILL.md +143 -0
- package/skills/qa-selenium-java-writer/references/best-practices.md +59 -0
- package/skills/qa-selenium-java-writer/references/config.md +143 -0
- package/skills/qa-selenium-java-writer/references/patterns.md +170 -0
- package/skills/qa-selenium-py-writer/SKILL.md +150 -0
- package/skills/qa-selenium-py-writer/references/best-practices.md +175 -0
- package/skills/qa-selenium-py-writer/references/config.md +224 -0
- package/skills/qa-selenium-py-writer/references/patterns.md +255 -0
- package/skills/qa-shortcut-integration/SKILL.md +143 -0
- package/skills/qa-shortcut-integration/references/api-patterns.md +126 -0
- package/skills/qa-shortcut-integration/references/field-mapping.md +66 -0
- package/skills/qa-spec-auditor/SKILL.md +162 -0
- package/skills/qa-spec-auditor/references/audit-checklist.md +144 -0
- package/skills/qa-spec-auditor/references/drift-patterns.md +207 -0
- package/skills/qa-spec-writer/SKILL.md +143 -0
- package/skills/qa-spec-writer/references/gherkin-guide.md +253 -0
- package/skills/qa-spec-writer/references/specification-patterns.md +274 -0
- package/skills/qa-spring-test-writer/SKILL.md +170 -0
- package/skills/qa-spring-test-writer/references/best-practices.md +57 -0
- package/skills/qa-spring-test-writer/references/config.md +179 -0
- package/skills/qa-spring-test-writer/references/patterns.md +235 -0
- package/skills/qa-supertest-writer/SKILL.md +150 -0
- package/skills/qa-supertest-writer/references/assertions.md +192 -0
- package/skills/qa-supertest-writer/references/best-practices.md +102 -0
- package/skills/qa-supertest-writer/references/config.md +166 -0
- package/skills/qa-supertest-writer/references/patterns.md +242 -0
- package/skills/qa-task-creator/SKILL.md +142 -0
- package/skills/qa-task-creator/references/linking-patterns.md +127 -0
- package/skills/qa-task-creator/references/task-types.md +169 -0
- package/skills/qa-task-creator/templates/task-template.md +24 -0
- package/skills/qa-test-doc-compiler/SKILL.md +114 -0
- package/skills/qa-test-doc-compiler/references/agile-tailoring.md +220 -0
- package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +302 -0
- package/skills/qa-test-healer/SKILL.md +101 -0
- package/skills/qa-test-healer/references/diagnosis-patterns.md +142 -0
- package/skills/qa-test-healer/references/fix-strategies.md +177 -0
- package/skills/qa-test-reporter/SKILL.md +130 -0
- package/skills/qa-test-reporter/references/best-practices.md +162 -0
- package/skills/qa-test-reporter/references/iso-29119-reports.md +236 -0
- package/skills/qa-test-reporter/references/report-formats.md +287 -0
- package/skills/qa-test-reviewer/SKILL.md +142 -0
- package/skills/qa-test-reviewer/references/anti-patterns.md +268 -0
- package/skills/qa-test-reviewer/references/review-checklist.md +93 -0
- package/skills/qa-test-strategy/SKILL.md +133 -0
- package/skills/qa-test-strategy/references/entry-exit-criteria.md +176 -0
- package/skills/qa-test-strategy/references/risk-matrix.md +102 -0
- package/skills/qa-test-strategy/references/testing-types.md +143 -0
- package/skills/qa-testcase-from-docs/SKILL.md +161 -0
- package/skills/qa-testcase-from-docs/references/test-case-format.md +196 -0
- package/skills/qa-testcase-from-docs/references/test-design-techniques.md +126 -0
- package/skills/qa-testcase-from-docs/templates/test-case-template.md +31 -0
- package/skills/qa-testcase-from-ui/SKILL.md +109 -0
- package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +126 -0
- package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +146 -0
- package/skills/qa-testcase-from-ui/templates/test-case-template.md +31 -0
- package/skills/qa-visual-regression-writer/SKILL.md +175 -0
- package/skills/qa-visual-regression-writer/references/best-practices.md +154 -0
- package/skills/qa-visual-regression-writer/references/config.md +220 -0
- package/skills/qa-visual-regression-writer/references/patterns.md +213 -0
- package/skills/qa-vitest-writer/SKILL.md +141 -0
- package/skills/qa-vitest-writer/references/assertions.md +105 -0
- package/skills/qa-vitest-writer/references/best-practices.md +62 -0
- package/skills/qa-vitest-writer/references/config.md +127 -0
- package/skills/qa-vitest-writer/references/patterns.md +141 -0
- package/skills/qa-webdriverio-writer/SKILL.md +145 -0
- package/skills/qa-webdriverio-writer/references/best-practices.md +176 -0
- package/skills/qa-webdriverio-writer/references/config.md +240 -0
- package/skills/qa-webdriverio-writer/references/patterns.md +269 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# JMeter Best Practices
|
|
2
|
+
|
|
3
|
+
## Non-GUI Mode
|
|
4
|
+
|
|
5
|
+
| Do | Don't |
|
|
6
|
+
|----|-------|
|
|
7
|
+
| Always use `-n` for load tests | Run load tests in GUI mode |
|
|
8
|
+
| Disable View Results Tree in load plans | Keep View Results Tree enabled for 1000+ threads |
|
|
9
|
+
| Use Aggregate Report, Summary Report | Use listeners that store full response data |
|
|
10
|
+
| Set `jmeter.save.saveservice.response_data=false` | Save response data in JTL for load runs |
|
|
11
|
+
|
|
12
|
+
**Why:** GUI mode consumes significant memory and is not designed for high load. View Results Tree stores every response and causes OOM.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Parameterization
|
|
17
|
+
|
|
18
|
+
### CSV Data Set Config
|
|
19
|
+
|
|
20
|
+
| Setting | Recommendation |
|
|
21
|
+
|--------|----------------|
|
|
22
|
+
| **Sharing mode** | `All threads` for shared data; `Current thread` for unique per user |
|
|
23
|
+
| **Delimiter** | `,` (comma) or `\t` (tab) |
|
|
24
|
+
| **Recycle on EOF** | `true` for repeated use; `false` to stop when exhausted |
|
|
25
|
+
| **Stop thread on EOF** | `true` when recycle=false and you want graceful stop |
|
|
26
|
+
| **File path** | Use `${__P(csvPath, default.csv)}` for CI flexibility |
|
|
27
|
+
|
|
28
|
+
### Unique Data
|
|
29
|
+
|
|
30
|
+
- Use enough rows for `threads × loops` when recycle=false
|
|
31
|
+
- For user simulation: unique emails, usernames per row
|
|
32
|
+
- Consider UUID or timestamp in JSR223 for dynamic uniqueness
|
|
33
|
+
|
|
34
|
+
### Avoid
|
|
35
|
+
|
|
36
|
+
- Hardcoded URLs, credentials, IDs
|
|
37
|
+
- Same data for all users when testing concurrency (e.g., same login)
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Correlation
|
|
42
|
+
|
|
43
|
+
### Order of Execution
|
|
44
|
+
|
|
45
|
+
1. **Sampler** (e.g., Login) → **PostProcessor** (extract token) → **Next Sampler** (use `${token}`)
|
|
46
|
+
2. Extractors must be children of the sampler whose response they parse
|
|
47
|
+
3. Use **JSON Extractor** or **Regular Expression Extractor** as PostProcessor
|
|
48
|
+
|
|
49
|
+
### Variable Scope
|
|
50
|
+
|
|
51
|
+
- `vars` (JMeterVariables): per-thread, cleared each iteration
|
|
52
|
+
- `props` (JMeterProperties): global, shared across threads
|
|
53
|
+
- Use `vars.put("name", value)` in JSR223; `${name}` in samplers
|
|
54
|
+
|
|
55
|
+
### Regex Tips
|
|
56
|
+
|
|
57
|
+
- Prefer non-greedy: `"token":"([^"]+)"` over `"token":"(.+)"`
|
|
58
|
+
- Use `$1$` in Template for first capture group
|
|
59
|
+
- Test regex in View Results Tree (debug only) or regex101.com
|
|
60
|
+
|
|
61
|
+
### JSON Extraction
|
|
62
|
+
|
|
63
|
+
- Use **JSON Extractor** or **JSR223 PostProcessor** with JsonSlurper
|
|
64
|
+
- JSONPath: `$.data.token`, `$.items[0].id`
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Result Analysis
|
|
69
|
+
|
|
70
|
+
### JTL Columns
|
|
71
|
+
|
|
72
|
+
| Column | Purpose |
|
|
73
|
+
|--------|---------|
|
|
74
|
+
| `timeStamp` | Request time |
|
|
75
|
+
| `elapsed` | Total time (ms) |
|
|
76
|
+
| `label` | Sampler name |
|
|
77
|
+
| `responseCode` | HTTP status |
|
|
78
|
+
| `success` | true/false |
|
|
79
|
+
| `bytes` | Response size |
|
|
80
|
+
| `latency` | Time to first byte |
|
|
81
|
+
| `connect` | Connection time |
|
|
82
|
+
|
|
83
|
+
### HTML Report
|
|
84
|
+
|
|
85
|
+
- **Dashboard**: Overview, APDEX, response times, throughput
|
|
86
|
+
- **APDEX**: Satisfied (fast), Tolerated (ok), Frustrated (slow)
|
|
87
|
+
- **Throughput**: Requests per second
|
|
88
|
+
- **Response Times**: Percentiles (90, 95, 99)
|
|
89
|
+
|
|
90
|
+
### Interpreting Results
|
|
91
|
+
|
|
92
|
+
| Metric | Good | Investigate |
|
|
93
|
+
|--------|------|-------------|
|
|
94
|
+
| Error rate | < 1% | > 1% |
|
|
95
|
+
| p95 latency | Within SLA | Exceeds SLA |
|
|
96
|
+
| Throughput | Meets target | Below target |
|
|
97
|
+
| Connect time | Low, stable | High or spiking |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Test Design
|
|
102
|
+
|
|
103
|
+
### Ramp-Up
|
|
104
|
+
|
|
105
|
+
- **Rule of thumb**: Ramp-up = 10–20% of total test duration
|
|
106
|
+
- Too short: artificial spike, connection storms
|
|
107
|
+
- Too long: wastes time before steady state
|
|
108
|
+
|
|
109
|
+
### Think Time
|
|
110
|
+
|
|
111
|
+
- Add **Constant Timer** or **Uniform Random Timer** between requests
|
|
112
|
+
- Typical: 1–3 seconds for web; 0–500 ms for API
|
|
113
|
+
- Omit for throughput-only tests
|
|
114
|
+
|
|
115
|
+
### Assertions
|
|
116
|
+
|
|
117
|
+
- Use **Response Assertion** for status codes (200, 201)
|
|
118
|
+
- Use **Duration Assertion** for SLA (e.g., 2000 ms)
|
|
119
|
+
- Use **JSON Assertion** for API contract validation
|
|
120
|
+
- Avoid overly strict assertions that fail on minor variations
|
|
121
|
+
|
|
122
|
+
### Naming
|
|
123
|
+
|
|
124
|
+
- Use descriptive **labels** for samplers (e.g., `GET /users`, `POST /login`)
|
|
125
|
+
- Labels appear in reports and JTL; avoid generic names like "HTTP Request"
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Performance of JMeter Itself
|
|
130
|
+
|
|
131
|
+
| Tweak | Purpose |
|
|
132
|
+
|-------|---------|
|
|
133
|
+
| Increase JVM heap | `-Xmx4g` for 5k+ threads |
|
|
134
|
+
| Disable unnecessary listeners | Reduce memory and I/O |
|
|
135
|
+
| Use `jmeter.save.saveservice.*` to minimize JTL | Smaller files, faster writes |
|
|
136
|
+
| Run workers on separate machines | Distribute load, avoid single-node bottleneck |
|
|
137
|
+
| Use latest JMeter | Bug fixes, performance improvements |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Security
|
|
142
|
+
|
|
143
|
+
- Never commit credentials; use `${__P()}` or environment variables
|
|
144
|
+
- Use `user.properties` (gitignored) for local overrides
|
|
145
|
+
- In CI: use secrets for API keys, tokens
|
|
146
|
+
- Test against staging/QA, not production, unless explicitly approved
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Integration with QA Skills
|
|
151
|
+
|
|
152
|
+
| Skill | Use Case |
|
|
153
|
+
|-------|----------|
|
|
154
|
+
| **qa-plan-creator** | Performance plan → thread groups, duration, load profile |
|
|
155
|
+
| **qa-nfr-analyst** | NFR specs → SLA assertions, duration thresholds |
|
|
156
|
+
| **qa-api-contract-curator** | OpenAPI → HTTP samplers, JSON assertions |
|
|
157
|
+
| **qa-requirements-generator** | Requirements → test scenarios, endpoints |
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# JMeter Configuration
|
|
2
|
+
|
|
3
|
+
## CLI Mode (Non-GUI)
|
|
4
|
+
|
|
5
|
+
### Basic Run
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
jmeter -n -t test.jmx -l results.jtl
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
| Option | Purpose |
|
|
12
|
+
|--------|---------|
|
|
13
|
+
| `-n` | Non-GUI mode (required for CI/headless) |
|
|
14
|
+
| `-t test.jmx` | Test plan file |
|
|
15
|
+
| `-l results.jtl` | Results file (JTL/CSV) |
|
|
16
|
+
| `-j jmeter.log` | Log file |
|
|
17
|
+
| `-q user.properties` | User properties file |
|
|
18
|
+
|
|
19
|
+
### HTML Report Generation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
jmeter -n -t test.jmx -l results.jtl -e -o report/
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
| Option | Purpose |
|
|
26
|
+
|--------|---------|
|
|
27
|
+
| `-e` | Generate HTML report after run |
|
|
28
|
+
| `-o report/` | Output directory for HTML report |
|
|
29
|
+
|
|
30
|
+
Report includes: dashboard, APDEX, response times, throughput, errors.
|
|
31
|
+
|
|
32
|
+
### Property Overrides
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
jmeter -n -t test.jmx -l results.jtl -Jhost=api.staging.example.com -Jusers=50
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Option | Purpose |
|
|
39
|
+
|--------|---------|
|
|
40
|
+
| `-Jprop=value` | Set JMeter property (single) |
|
|
41
|
+
| `-Gprop=value` | Global property (distributed mode) |
|
|
42
|
+
| `-q user.properties` | Load from file |
|
|
43
|
+
|
|
44
|
+
Use in test plan: `${__P(host, default)}`, `${__P(users, 10)}`.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Key Properties
|
|
49
|
+
|
|
50
|
+
### JTL Output Format
|
|
51
|
+
|
|
52
|
+
```properties
|
|
53
|
+
# user.properties or -J
|
|
54
|
+
jmeter.save.saveservice.output_format=csv
|
|
55
|
+
jmeter.save.saveservice.response_data=false
|
|
56
|
+
jmeter.save.saveservice.samplerData=false
|
|
57
|
+
jmeter.save.saveservice.requestHeaders=false
|
|
58
|
+
jmeter.save.saveservice.responseHeaders=false
|
|
59
|
+
jmeter.save.saveservice.url=false
|
|
60
|
+
jmeter.save.saveservice.filename=false
|
|
61
|
+
jmeter.save.saveservice.hostname=false
|
|
62
|
+
jmeter.save.saveservice.thread_counts=false
|
|
63
|
+
jmeter.save.saveservice.latency=true
|
|
64
|
+
jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss
|
|
65
|
+
jmeter.save.saveservice.print_field_names=true
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Minimal JTL for performance: `timeStamp`, `elapsed`, `label`, `responseCode`, `success`, `bytes`, `latency`.
|
|
69
|
+
|
|
70
|
+
### HTML Report
|
|
71
|
+
|
|
72
|
+
```properties
|
|
73
|
+
jmeter.reportgenerator.overall_granularity=60000
|
|
74
|
+
jmeter.reportgenerator.apdex_satisfied_threshold=500
|
|
75
|
+
jmeter.reportgenerator.apdex_tolerated_threshold=1500
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### JVM Heap
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Set in jmeter or jmeter.bat
|
|
82
|
+
HEAP="-Xms1g -Xmx4g -XX:MaxMetaspaceSize=256m"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Increase for high thread counts (e.g., 10k+ threads).
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Plugins
|
|
90
|
+
|
|
91
|
+
### JMeter Plugins Manager
|
|
92
|
+
|
|
93
|
+
Install via Plugins Manager (Options → Plugins Manager):
|
|
94
|
+
|
|
95
|
+
| Plugin | Purpose |
|
|
96
|
+
|--------|---------|
|
|
97
|
+
| **Custom Thread Groups** | Ultimate Thread Group, Stepping Thread Group |
|
|
98
|
+
| **3 Basic Graphs** | Response Times, Throughput, Active Threads |
|
|
99
|
+
| **PerfMon** | Server metrics (CPU, memory) |
|
|
100
|
+
| **Dummy Sampler** | Simulate responses for debugging |
|
|
101
|
+
| **JSON Path Assertion** | JSONPath assertions (built-in 5.2+) |
|
|
102
|
+
|
|
103
|
+
### Maven/Gradle
|
|
104
|
+
|
|
105
|
+
```xml
|
|
106
|
+
<!-- For programmatic JMeter execution -->
|
|
107
|
+
<dependency>
|
|
108
|
+
<groupId>org.apache.jmeter</groupId>
|
|
109
|
+
<artifactId>ApacheJMeter_core</artifactId>
|
|
110
|
+
<version>5.6.3</version>
|
|
111
|
+
</dependency>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Distributed Testing
|
|
117
|
+
|
|
118
|
+
### Architecture
|
|
119
|
+
|
|
120
|
+
- **Controller**: Runs GUI/non-GUI, orchestrates workers
|
|
121
|
+
- **Workers**: Run actual load, send results to controller
|
|
122
|
+
|
|
123
|
+
### Setup
|
|
124
|
+
|
|
125
|
+
1. **Same JMeter version** on all nodes
|
|
126
|
+
2. **Same plugins** on all nodes
|
|
127
|
+
3. **RMI ports**: 1099 (default), 4000 (server)
|
|
128
|
+
4. **Firewall**: Allow controller ↔ workers
|
|
129
|
+
|
|
130
|
+
### Start Workers
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# On each worker machine
|
|
134
|
+
jmeter-server
|
|
135
|
+
# or
|
|
136
|
+
jmeter -s -Jserver.rmi.localport=50000
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Run from Controller
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
jmeter -n -t test.jmx -l results.jtl -R worker1,worker2,worker3
|
|
143
|
+
# or
|
|
144
|
+
jmeter -n -t test.jmx -l results.jtl -Gremote_hosts=worker1,worker2
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
| Option | Purpose |
|
|
148
|
+
|--------|---------|
|
|
149
|
+
| `-R host1,host2` | Remote hosts (workers) |
|
|
150
|
+
| `-Gprop=value` | Global property for all workers |
|
|
151
|
+
| `-Jserver.rmi.ssl.disable=true` | Disable RMI SSL if needed |
|
|
152
|
+
|
|
153
|
+
### Remote Hosts Property
|
|
154
|
+
|
|
155
|
+
```properties
|
|
156
|
+
# jmeter.properties
|
|
157
|
+
remote_hosts=127.0.0.1:1099,worker2:1099
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Directory Layout
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
project/
|
|
166
|
+
jmeter/
|
|
167
|
+
plans/
|
|
168
|
+
api-load.jmx
|
|
169
|
+
api-stress.jmx
|
|
170
|
+
data/
|
|
171
|
+
users.csv
|
|
172
|
+
results/ # JTL output
|
|
173
|
+
report/ # HTML report
|
|
174
|
+
user.properties # Overrides
|
|
175
|
+
jmeter.log
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## CI Integration (GitHub Actions)
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
- name: Run JMeter
|
|
184
|
+
run: |
|
|
185
|
+
jmeter -n -t jmeter/plans/api-load.jmx \
|
|
186
|
+
-l jmeter/results/results.jtl \
|
|
187
|
+
-e -o jmeter/report \
|
|
188
|
+
-Jhost=${{ env.API_HOST }} \
|
|
189
|
+
-Jusers=${{ env.LOAD_USERS }}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## User Defined Variables
|
|
195
|
+
|
|
196
|
+
Define at Test Plan or Thread Group level:
|
|
197
|
+
|
|
198
|
+
| Variable | Value | Usage |
|
|
199
|
+
|----------|-------|-------|
|
|
200
|
+
| `host` | api.example.com | `${host}` |
|
|
201
|
+
| `basePath` | /v1 | `${basePath}` |
|
|
202
|
+
| `protocol` | https | `${protocol}` |
|
|
203
|
+
|
|
204
|
+
Prefer `${__P(var, default)}` for CI overrides.
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# JMeter Test Plan Patterns
|
|
2
|
+
|
|
3
|
+
## Thread Groups
|
|
4
|
+
|
|
5
|
+
### Basic Thread Group
|
|
6
|
+
|
|
7
|
+
| Property | Purpose | Example |
|
|
8
|
+
|----------|---------|---------|
|
|
9
|
+
| `num_threads` | Number of virtual users | 10, 100, 1000 |
|
|
10
|
+
| `ramp_time` | Ramp-up period (seconds) | 60, 300 |
|
|
11
|
+
| `loops` | Iterations per user (-1 = forever) | 1, 10, -1 |
|
|
12
|
+
| `duration` | Test duration (seconds) | Use with loops=-1 |
|
|
13
|
+
| `scheduler` | Enable scheduler | true/false |
|
|
14
|
+
| `delay` | Startup delay (seconds) | 0 |
|
|
15
|
+
| `on_sample_error` | Action on failure | continue, stopthread, stoppage, stopnow |
|
|
16
|
+
|
|
17
|
+
### Load Profile Mapping
|
|
18
|
+
|
|
19
|
+
| Test Type | Threads | Ramp-up | Loops/Duration |
|
|
20
|
+
|-----------|---------|---------|---------------|
|
|
21
|
+
| Smoke | 1–5 | 10s | 1–5 |
|
|
22
|
+
| Load | Target VUs | 10–20% of duration | Duration-based |
|
|
23
|
+
| Stress | Ramp to breaking point | Gradual | Until failure |
|
|
24
|
+
| Soak | Steady VUs | Ramp-up | Hours |
|
|
25
|
+
| Spike | Sudden surge | Very short | Short burst |
|
|
26
|
+
|
|
27
|
+
### Ultimate Thread Group (Plugin)
|
|
28
|
+
|
|
29
|
+
For complex load profiles (stages), use Ultimate Thread Group or Stepping Thread Group plugins when available.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Samplers
|
|
34
|
+
|
|
35
|
+
### HTTP Request Sampler
|
|
36
|
+
|
|
37
|
+
```xml
|
|
38
|
+
<HTTPSamplerProxy>
|
|
39
|
+
<stringProp name="HTTPSampler.domain">${__P(host,api.example.com)}</stringProp>
|
|
40
|
+
<stringProp name="HTTPSampler.path">/users</stringProp>
|
|
41
|
+
<stringProp name="HTTPSampler.method">GET</stringProp>
|
|
42
|
+
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
|
43
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
|
44
|
+
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
|
45
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
|
46
|
+
<elementProp name="HTTPsampler.Arguments">
|
|
47
|
+
<collectionProp name="Arguments.arguments">
|
|
48
|
+
<elementProp name="" elementType="HTTPArgument">
|
|
49
|
+
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
|
50
|
+
<stringProp name="Argument.value">{"email":"${email}"}</stringProp>
|
|
51
|
+
<stringProp name="Argument.metadata">=</stringProp>
|
|
52
|
+
</elementProp>
|
|
53
|
+
</collectionProp>
|
|
54
|
+
</elementProp>
|
|
55
|
+
</HTTPSamplerProxy>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
| Property | Purpose |
|
|
59
|
+
|----------|---------|
|
|
60
|
+
| `HTTPSampler.domain` | Host (or use full URL in path) |
|
|
61
|
+
| `HTTPSampler.path` | Path + query |
|
|
62
|
+
| `HTTPSampler.method` | GET, POST, PUT, DELETE, PATCH |
|
|
63
|
+
| `HTTPSampler.protocol` | http or https |
|
|
64
|
+
| `HTTPSampler.port` | Port (empty = default) |
|
|
65
|
+
| `HTTPsampler.Arguments` | Request body (POST/PUT) |
|
|
66
|
+
| `HTTPSampler.contentEncoding` | UTF-8 |
|
|
67
|
+
|
|
68
|
+
### HTTP Header Manager
|
|
69
|
+
|
|
70
|
+
Add as child of sampler or test plan:
|
|
71
|
+
|
|
72
|
+
```xml
|
|
73
|
+
<HeaderManager>
|
|
74
|
+
<collectionProp name="HeaderManager.headers">
|
|
75
|
+
<elementProp name="Content-Type" elementType="Header">
|
|
76
|
+
<stringProp name="Header.name">Content-Type</stringProp>
|
|
77
|
+
<stringProp name="Header.value">application/json</stringProp>
|
|
78
|
+
</elementProp>
|
|
79
|
+
<elementProp name="Authorization" elementType="Header">
|
|
80
|
+
<stringProp name="Header.name">Authorization</stringProp>
|
|
81
|
+
<stringProp name="Header.value">Bearer ${token}</stringProp>
|
|
82
|
+
</elementProp>
|
|
83
|
+
</collectionProp>
|
|
84
|
+
</HeaderManager>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### JDBC Request Sampler
|
|
88
|
+
|
|
89
|
+
For database load testing:
|
|
90
|
+
|
|
91
|
+
| Property | Purpose |
|
|
92
|
+
|----------|---------|
|
|
93
|
+
| `dataSource` | JDBC connection pool variable |
|
|
94
|
+
| `queryType` | Select, Update, Callable, Prepared |
|
|
95
|
+
| `query` | SQL statement |
|
|
96
|
+
|
|
97
|
+
### JMS Sampler
|
|
98
|
+
|
|
99
|
+
For messaging (JMS Point-to-Point, Pub/Sub) when testing message brokers.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Assertions
|
|
104
|
+
|
|
105
|
+
### Response Assertion
|
|
106
|
+
|
|
107
|
+
| Field | Purpose |
|
|
108
|
+
|-------|---------|
|
|
109
|
+
| `Assertion.test_field` | Response Code, Response Message, Response Headers, Response Body |
|
|
110
|
+
| `Assertion.pattern` | String or regex to match |
|
|
111
|
+
| `Assertion.test_type` | Contains, Matches, Equals, Substring |
|
|
112
|
+
| `Assertion.assume_success` | Treat as success if not applied |
|
|
113
|
+
|
|
114
|
+
Common patterns:
|
|
115
|
+
- Response Code: `200`, `201`, `2\d{2}`
|
|
116
|
+
- Response Body: `"success":\s*true`, `"id":\s*\d+`
|
|
117
|
+
|
|
118
|
+
### Duration Assertion
|
|
119
|
+
|
|
120
|
+
| Property | Purpose |
|
|
121
|
+
|----------|---------|
|
|
122
|
+
| `DurationAssertion.duration` | Max allowed response time (ms) |
|
|
123
|
+
|
|
124
|
+
Use for SLA validation (e.g., 2000 ms for p95).
|
|
125
|
+
|
|
126
|
+
### Size Assertion
|
|
127
|
+
|
|
128
|
+
| Property | Purpose |
|
|
129
|
+
|----------|---------|
|
|
130
|
+
| `SizeAssertion.size` | Expected size in bytes |
|
|
131
|
+
| `SizeAssertion.assume_success` | Treat as success if not applied |
|
|
132
|
+
|
|
133
|
+
### JSON Assertion (JMeter 5.2+)
|
|
134
|
+
|
|
135
|
+
| Property | Purpose |
|
|
136
|
+
|----------|---------|
|
|
137
|
+
| `JSON_PATH` | JSONPath expression (e.g., `$.data.id`) |
|
|
138
|
+
| `EXPECTED_VALUE` | Expected value or leave empty for existence |
|
|
139
|
+
| `ASSERT_JSON_PATH_EXISTS` | true/false |
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Extractors
|
|
144
|
+
|
|
145
|
+
### Regular Expression Extractor
|
|
146
|
+
|
|
147
|
+
| Property | Purpose |
|
|
148
|
+
|----------|---------|
|
|
149
|
+
| `Refname` | Variable name (e.g., `token`) |
|
|
150
|
+
| `Regex` | Regex with capture group, e.g., `"token":"([^"]+)"` |
|
|
151
|
+
| `Template` | `$1$` for first group |
|
|
152
|
+
| `Match Nr` | 1 = first, -1 = random, 0 = all |
|
|
153
|
+
| `Default` | Default value if no match |
|
|
154
|
+
|
|
155
|
+
### JSON Extractor
|
|
156
|
+
|
|
157
|
+
| Property | Purpose |
|
|
158
|
+
|----------|---------|
|
|
159
|
+
| `JSON_PATH` | JSONPath, e.g., `$.data.token` |
|
|
160
|
+
| `VAR` | Variable name |
|
|
161
|
+
| `DEFAULT` | Default if not found |
|
|
162
|
+
|
|
163
|
+
### Boundary Extractor
|
|
164
|
+
|
|
165
|
+
For simple left/right boundary extraction when regex is overkill.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Timers
|
|
170
|
+
|
|
171
|
+
### Constant Timer
|
|
172
|
+
|
|
173
|
+
| Property | Purpose |
|
|
174
|
+
|----------|---------|
|
|
175
|
+
| `ConstantTimer.delay` | Delay in ms (e.g., 1000 for 1s think time) |
|
|
176
|
+
|
|
177
|
+
### Uniform Random Timer
|
|
178
|
+
|
|
179
|
+
| Property | Purpose |
|
|
180
|
+
|----------|---------|
|
|
181
|
+
| `ConstantTimer.delay` | Minimum delay (ms) |
|
|
182
|
+
| `RandomTimer.range` | Additional random range (ms) |
|
|
183
|
+
|
|
184
|
+
Total delay = delay + random(0, range).
|
|
185
|
+
|
|
186
|
+
### Gaussian Random Timer
|
|
187
|
+
|
|
188
|
+
Similar to Uniform but with Gaussian distribution for more realistic think time.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Controllers
|
|
193
|
+
|
|
194
|
+
### Loop Controller
|
|
195
|
+
|
|
196
|
+
| Property | Purpose |
|
|
197
|
+
|----------|---------|
|
|
198
|
+
| `LoopController.loops` | Number of iterations |
|
|
199
|
+
|
|
200
|
+
### If Controller
|
|
201
|
+
|
|
202
|
+
| Property | Purpose |
|
|
203
|
+
|----------|---------|
|
|
204
|
+
| `IfController.condition` | JavaScript or `${__jexl3(...)}` expression |
|
|
205
|
+
|
|
206
|
+
Example: `${__jexl3(${status} == 200)}`
|
|
207
|
+
|
|
208
|
+
### Once Only Controller
|
|
209
|
+
|
|
210
|
+
Execute child elements only on first iteration (e.g., login once).
|
|
211
|
+
|
|
212
|
+
### Transaction Controller
|
|
213
|
+
|
|
214
|
+
Group samplers into a transaction for aggregate timing.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Pre/Post Processors
|
|
219
|
+
|
|
220
|
+
### JSR223 PreProcessor (Groovy)
|
|
221
|
+
|
|
222
|
+
```groovy
|
|
223
|
+
// Set variable from previous response
|
|
224
|
+
vars.put("timestamp", String.valueOf(System.currentTimeMillis()));
|
|
225
|
+
|
|
226
|
+
// Correlation: extract from prev sampler (use PostProcessor on prior sampler instead)
|
|
227
|
+
// vars.put("token", prev.getResponseDataAsString());
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Prefer Groovy over BeanShell (faster, maintained).
|
|
231
|
+
|
|
232
|
+
### JSR223 PostProcessor
|
|
233
|
+
|
|
234
|
+
```groovy
|
|
235
|
+
import groovy.json.JsonSlurper
|
|
236
|
+
def json = new JsonSlurper().parseText(prev.getResponseDataAsString())
|
|
237
|
+
vars.put("userId", json.data.id.toString())
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### User Parameters
|
|
241
|
+
|
|
242
|
+
For per-iteration parameter overrides without CSV.
|