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,258 @@
|
|
|
1
|
+
# OWASP ZAP Configuration
|
|
2
|
+
|
|
3
|
+
Configuration guide for OWASP ZAP (Zed Attack Proxy) for DAST scanning. Use with qa-security-test-writer when generating ZAP automation configs.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
| Mode | Purpose |
|
|
10
|
+
|------|---------|
|
|
11
|
+
| **Passive scan** | Observe traffic; detect issues without sending attack payloads |
|
|
12
|
+
| **Active scan** | Send probes to find vulnerabilities (injection, XSS, etc.) |
|
|
13
|
+
| **API scan** | Target OpenAPI/Swagger-defined endpoints |
|
|
14
|
+
| **AJAX spider** | Crawl SPAs and dynamic content |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Basic Configuration
|
|
19
|
+
|
|
20
|
+
### Target URL
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
# zap-config.yaml (conceptual)
|
|
24
|
+
target:
|
|
25
|
+
url: "https://staging.example.com"
|
|
26
|
+
include: ["https://staging.example.com/*"]
|
|
27
|
+
exclude: ["https://staging.example.com/logout", "https://staging.example.com/admin/dangerous"]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Command-Line (Docker)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
docker run -t owasp/zap2docker-stable zap-baseline.py \
|
|
34
|
+
-t https://staging.example.com \
|
|
35
|
+
-r zap-report.html
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Full scan (active + passive)
|
|
40
|
+
docker run -t owasp/zap2docker-stable zap-full-scan.py \
|
|
41
|
+
-t https://staging.example.com \
|
|
42
|
+
-r zap-report.html
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Scan Policies
|
|
48
|
+
|
|
49
|
+
### Policy Levels
|
|
50
|
+
|
|
51
|
+
| Policy | Risk | Description |
|
|
52
|
+
|--------|------|-------------|
|
|
53
|
+
| **Low** | Lower false positives, may miss issues |
|
|
54
|
+
| **Medium** | Balanced |
|
|
55
|
+
| **High** | More thorough, more false positives |
|
|
56
|
+
|
|
57
|
+
### Custom Policy (API)
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
# Python ZAP API example
|
|
61
|
+
import zapv2
|
|
62
|
+
|
|
63
|
+
zap = zapv2.ZAPv2(apikey='your-api-key', proxies={'http': 'http://127.0.0.1:8080'})
|
|
64
|
+
|
|
65
|
+
# Enable/disable specific scanners
|
|
66
|
+
zap.ascan.enable_all_scanners()
|
|
67
|
+
zap.ascan.disable_scanners(['40018']) # Disable specific scanner ID
|
|
68
|
+
|
|
69
|
+
# Set scan policy
|
|
70
|
+
zap.ascan.set_scanner_alert_threshold('40018', 'HIGH') # SQL Injection
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Scanner IDs (Common)
|
|
74
|
+
|
|
75
|
+
| ID | Scanner |
|
|
76
|
+
|----|---------|
|
|
77
|
+
| 40018 | SQL Injection |
|
|
78
|
+
| 40014 | Cross Site Scripting (Reflected) |
|
|
79
|
+
| 40016 | Cross Site Scripting (Persistent) |
|
|
80
|
+
| 40012 | Cross Site Scripting (DOM) |
|
|
81
|
+
| 90011 | Content Security Policy |
|
|
82
|
+
| 90033 | X-Content-Type-Options |
|
|
83
|
+
| 40009 | Path Traversal |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Authentication
|
|
88
|
+
|
|
89
|
+
### Form-Based Authentication
|
|
90
|
+
|
|
91
|
+
```yaml
|
|
92
|
+
auth:
|
|
93
|
+
type: form
|
|
94
|
+
login_url: "https://staging.example.com/login"
|
|
95
|
+
login_request:
|
|
96
|
+
method: POST
|
|
97
|
+
url: "https://staging.example.com/login"
|
|
98
|
+
body: "username={%username%}&password={%password%}"
|
|
99
|
+
logout:
|
|
100
|
+
url: "https://staging.example.com/logout"
|
|
101
|
+
credentials:
|
|
102
|
+
username: "${TEST_USER}"
|
|
103
|
+
password: "${TEST_PASSWORD}"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### JSON API Authentication
|
|
107
|
+
|
|
108
|
+
```yaml
|
|
109
|
+
auth:
|
|
110
|
+
type: json
|
|
111
|
+
login_url: "https://staging.example.com/api/auth/login"
|
|
112
|
+
login_request:
|
|
113
|
+
method: POST
|
|
114
|
+
body: '{"email":"{%username%}","password":"{%password%}"}'
|
|
115
|
+
token_extract:
|
|
116
|
+
from: response.body
|
|
117
|
+
json_path: "$.token"
|
|
118
|
+
token_usage:
|
|
119
|
+
header: "Authorization"
|
|
120
|
+
value: "Bearer {%token%}"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Script-Based Authentication (ZAP API)
|
|
124
|
+
|
|
125
|
+
```python
|
|
126
|
+
# Configure auth via ZAP API
|
|
127
|
+
zap.authentication.set_authentication_method(
|
|
128
|
+
contextid='1',
|
|
129
|
+
authmethodname='formBasedAuthentication',
|
|
130
|
+
authmethodconfigparams='loginUrl=https://staging.example.com/login' +
|
|
131
|
+
'&loginRequestData=username%3D%7B%25username%25%7D%26password%3D%7B%25password%25%7D'
|
|
132
|
+
)
|
|
133
|
+
zap.users.new_user(contextid='1', name='TestUser')
|
|
134
|
+
zap.users.set_authentication_credentials(
|
|
135
|
+
contextid='1', userid='0',
|
|
136
|
+
authcredentialsconfigparams='username=testuser&password=TestPass123!'
|
|
137
|
+
)
|
|
138
|
+
zap.users.set_user_enabled(contextid='1', userid='0', enabled='true')
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## API Scan
|
|
144
|
+
|
|
145
|
+
### OpenAPI/Swagger
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# ZAP with OpenAPI definition
|
|
149
|
+
docker run -t owasp/zap2docker-stable zap-api-scan.py \
|
|
150
|
+
-t https://staging.example.com \
|
|
151
|
+
-f openapi \
|
|
152
|
+
-d openapi.json \
|
|
153
|
+
-r zap-api-report.html
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
```yaml
|
|
157
|
+
# Config for API scan
|
|
158
|
+
api_scan:
|
|
159
|
+
definition_url: "https://staging.example.com/openapi.json"
|
|
160
|
+
# or local file path
|
|
161
|
+
definition_file: "./openapi.json"
|
|
162
|
+
target_url: "https://staging.example.com"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Passive Scan
|
|
168
|
+
|
|
169
|
+
- Runs by default when proxying or spidering
|
|
170
|
+
- No attack payloads; analyzes requests/responses
|
|
171
|
+
- Detects: missing security headers, sensitive data exposure, cookie flags
|
|
172
|
+
|
|
173
|
+
### Passive Scan Tuning
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
# Enable all passive scanners
|
|
177
|
+
zap.pscan.enable_all_scanners()
|
|
178
|
+
|
|
179
|
+
# Set alert threshold for a passive rule
|
|
180
|
+
zap.pscan.set_scanner_alert_threshold('10021', 'HIGH') # Content-Type
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Active Scan
|
|
186
|
+
|
|
187
|
+
- Sends probes to find vulnerabilities
|
|
188
|
+
- **Always run against test/staging only**
|
|
189
|
+
- Can be destructive; configure exclusions
|
|
190
|
+
|
|
191
|
+
### Active Scan Scope
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
# Scan only in-scope URLs
|
|
195
|
+
zap.ascan.scan(url='https://staging.example.com/api', recurse=True)
|
|
196
|
+
|
|
197
|
+
# Exclude sensitive paths
|
|
198
|
+
zap.context.exclude_from_context(contextname='Default', regex='https://staging.example.com/admin/.*')
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Headless / CI Integration
|
|
204
|
+
|
|
205
|
+
### GitHub Actions Example
|
|
206
|
+
|
|
207
|
+
```yaml
|
|
208
|
+
- name: ZAP Baseline Scan
|
|
209
|
+
uses: zaproxy/action-baseline@v0.10.0
|
|
210
|
+
with:
|
|
211
|
+
target: 'https://staging.example.com'
|
|
212
|
+
rules_file_name: '.zap/rules.tsv'
|
|
213
|
+
fail_action: true
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Zaproxy Jenkins Plugin
|
|
217
|
+
|
|
218
|
+
- Configure target URL, auth, and scan policy
|
|
219
|
+
- Publish HTML/XML report
|
|
220
|
+
- Fail build on high/critical findings
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Report Output
|
|
225
|
+
|
|
226
|
+
| Format | Use Case |
|
|
227
|
+
|--------|----------|
|
|
228
|
+
| HTML | Human review |
|
|
229
|
+
| JSON | CI parsing, custom tooling |
|
|
230
|
+
| XML | JUnit-style, SARIF |
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# Generate multiple formats
|
|
234
|
+
zap-full-scan.py -t https://staging.example.com \
|
|
235
|
+
-r report.html \
|
|
236
|
+
-J report.json \
|
|
237
|
+
-x report.xml
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Best Practices
|
|
243
|
+
|
|
244
|
+
1. **Never scan production** without explicit approval and change window
|
|
245
|
+
2. **Use test credentials** stored in env vars; never hardcode
|
|
246
|
+
3. **Exclude destructive endpoints** (delete, reset, admin actions)
|
|
247
|
+
4. **Whitelist test environment** in WAF/firewall to avoid blocking
|
|
248
|
+
5. **Tune false positives** by adjusting policy or excluding known-safe patterns
|
|
249
|
+
6. **Run during off-peak** to minimize impact on shared staging
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## References
|
|
254
|
+
|
|
255
|
+
- [ZAP Docker](https://www.zaproxy.org/docs/docker/)
|
|
256
|
+
- [ZAP API](https://www.zaproxy.org/docs/api/)
|
|
257
|
+
- [ZAP Jenkins Plugin](https://plugins.jenkins.io/zaproxy/)
|
|
258
|
+
- [ZAP GitHub Action](https://github.com/zaproxy/action-baseline)
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa-selenium-java-writer
|
|
3
|
+
description: Generate Selenium Java E2E tests with JUnit 5, Page Object Model, explicit waits, AssertJ assertions, and Allure reporting integration.
|
|
4
|
+
output_dir: tests/e2e
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# QA Selenium Java Writer
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Write Selenium Java E2E tests from test case specifications. Transform structured test cases (from qa-testcase-from-docs, qa-manual-test-designer, qa-browser-data-collector, or specs) into executable Selenium Java test files with JUnit 5, Page Object Model, explicit waits, AssertJ assertions, and Allure reporting.
|
|
12
|
+
|
|
13
|
+
## Trigger Phrases
|
|
14
|
+
|
|
15
|
+
- "Write Selenium Java tests for [feature/flow]"
|
|
16
|
+
- "Generate Selenium E2E tests in Java"
|
|
17
|
+
- "Create Selenium Java tests with POM"
|
|
18
|
+
- "Add Selenium Java tests for [URL/page]"
|
|
19
|
+
- "Selenium Java with JUnit 5 and Allure"
|
|
20
|
+
- "Selenium Java Page Object Model tests"
|
|
21
|
+
- "Headless Selenium Java tests for [feature]"
|
|
22
|
+
- "Selenium Java tests with WebDriverWait"
|
|
23
|
+
- "Heal my failing Selenium Java tests"
|
|
24
|
+
|
|
25
|
+
## Key Features
|
|
26
|
+
|
|
27
|
+
| Feature | Description |
|
|
28
|
+
| ------- | ----------- |
|
|
29
|
+
| **Java 21+** | Modern Java with records, pattern matching, virtual threads support |
|
|
30
|
+
| **Selenium WebDriver** | Chrome, Firefox, Edge via WebDriver API |
|
|
31
|
+
| **JUnit 5** | @Test, @BeforeEach/@AfterEach, @DisplayName, @Tag |
|
|
32
|
+
| **Page Object Model** | POM with PageFactory; base page + page-specific classes |
|
|
33
|
+
| **Explicit waits** | WebDriverWait + ExpectedConditions; avoid implicit waits |
|
|
34
|
+
| **AssertJ** | Fluent assertions: assertThat(element).isDisplayed().isEnabled() |
|
|
35
|
+
| **Allure** | @Step, @Description, @Severity, @Epic, @Feature for reporting |
|
|
36
|
+
| **Headless mode** | Chrome/Firefox headless for CI |
|
|
37
|
+
| **Parallel execution** | maven-surefire-plugin parallel configuration |
|
|
38
|
+
|
|
39
|
+
## Workflow
|
|
40
|
+
|
|
41
|
+
1. **Read test cases** — From specs, requirements, manual test designs, or browser-collected data
|
|
42
|
+
2. **Analyze app** — Inspect pages, forms, flows; identify locators and interactions
|
|
43
|
+
3. **Generate test classes with POM** — Produce `{Feature}Test.java` with Page Objects in `pages/`
|
|
44
|
+
4. **Configure WebDriver** — Set up driver lifecycle, headless options, timeouts
|
|
45
|
+
5. **Add Allure annotations** — @Step for steps, @Description, @Severity for reporting
|
|
46
|
+
6. **Run** — User runs `mvn test` or `./gradlew test` to execute tests
|
|
47
|
+
|
|
48
|
+
## Context7 MCP
|
|
49
|
+
|
|
50
|
+
Use **Context7 MCP** for Selenium Java documentation when:
|
|
51
|
+
- WebDriver API or ExpectedConditions syntax is uncertain
|
|
52
|
+
- PageFactory, Actions, or Select handling needs verification
|
|
53
|
+
- Browser-specific options (Chrome, Firefox headless) require up-to-date reference
|
|
54
|
+
|
|
55
|
+
## Key Patterns
|
|
56
|
+
|
|
57
|
+
| Pattern | Usage |
|
|
58
|
+
| ------- | ----- |
|
|
59
|
+
| `@Test` | JUnit 5 test method |
|
|
60
|
+
| `@BeforeEach` / `@AfterEach` | Driver setup and teardown |
|
|
61
|
+
| `WebDriverWait(driver, Duration.ofSeconds(10))` | Explicit wait |
|
|
62
|
+
| `ExpectedConditions.visibilityOfElementLocated(By.id("id"))` | Wait for element |
|
|
63
|
+
| `PageFactory.initElements(driver, PageClass.class)` | POM initialization |
|
|
64
|
+
| `assertThat(element).isDisplayed().isEnabled()` | AssertJ assertions |
|
|
65
|
+
| `@Step("User clicks submit")` | Allure step |
|
|
66
|
+
| `@Description("Verify login flow")` | Allure description |
|
|
67
|
+
| `@Severity(SeverityLevel.CRITICAL)` | Allure severity |
|
|
68
|
+
|
|
69
|
+
## Wait Strategies
|
|
70
|
+
|
|
71
|
+
Prefer explicit waits; avoid implicit waits for reliability:
|
|
72
|
+
|
|
73
|
+
```java
|
|
74
|
+
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
|
|
75
|
+
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit-btn")));
|
|
76
|
+
element.click();
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Common expected conditions: `visibilityOfElementLocated`, `elementToBeClickable`, `presenceOfElementLocated`, `textToBePresentInElement`, `urlContains`.
|
|
80
|
+
|
|
81
|
+
## File Naming
|
|
82
|
+
|
|
83
|
+
- `{Feature}Test.java` — Test classes (e.g., `LoginTest.java`, `CheckoutTest.java`)
|
|
84
|
+
- `pages/{Feature}Page.java` — Page objects (e.g., `pages/LoginPage.java`, `pages/CheckoutPage.java`)
|
|
85
|
+
- Place in `src/test/java` per Maven/Gradle convention
|
|
86
|
+
|
|
87
|
+
## Scope
|
|
88
|
+
|
|
89
|
+
**Can do (autonomous):**
|
|
90
|
+
- Generate Selenium Java E2E tests from test case specs
|
|
91
|
+
- Apply Page Object Model with PageFactory
|
|
92
|
+
- Use explicit waits (WebDriverWait + ExpectedConditions)
|
|
93
|
+
- Configure WebDriver (Chrome, Firefox, Edge, headless)
|
|
94
|
+
- Use AssertJ for fluent assertions
|
|
95
|
+
- Add Allure annotations for reporting
|
|
96
|
+
- Configure maven-surefire-plugin for parallel execution
|
|
97
|
+
- Use Context7 MCP for Selenium Java docs
|
|
98
|
+
- Delegate to qa-test-healer when tests fail (Heal Mode)
|
|
99
|
+
|
|
100
|
+
**Cannot do (requires confirmation):**
|
|
101
|
+
- Change production code structure
|
|
102
|
+
- Add dependencies not in pom.xml/build.gradle
|
|
103
|
+
- Override project Selenium/JUnit config without approval
|
|
104
|
+
- Navigate to URLs not provided
|
|
105
|
+
|
|
106
|
+
**Will not do (out of scope):**
|
|
107
|
+
- Execute tests (user runs `mvn test`)
|
|
108
|
+
- Write Playwright/Cypress tests (use qa-playwright-ts-writer, qa-cypress-writer)
|
|
109
|
+
- Modify CI/CD pipelines
|
|
110
|
+
- Bypass security or access restricted areas
|
|
111
|
+
|
|
112
|
+
## References
|
|
113
|
+
|
|
114
|
+
- `references/patterns.md` — POM, waits, selectors, actions, Select, alerts, frames
|
|
115
|
+
- `references/config.md` — Maven/Gradle config, WebDriver setup, parallel execution
|
|
116
|
+
- `references/best-practices.md` — Java Selenium best practices
|
|
117
|
+
|
|
118
|
+
## Quality Checklist
|
|
119
|
+
|
|
120
|
+
- [ ] Explicit waits used; avoid implicit waits where possible
|
|
121
|
+
- [ ] No Thread.sleep; prefer WebDriverWait + ExpectedConditions
|
|
122
|
+
- [ ] POM pattern applied with PageFactory
|
|
123
|
+
- [ ] Stable locators (ID, data attributes, CSS; XPath as fallback)
|
|
124
|
+
- [ ] Tests independent (no shared state, order-independent)
|
|
125
|
+
- [ ] Proper teardown (driver.quit in @AfterEach)
|
|
126
|
+
- [ ] AssertJ used for assertions
|
|
127
|
+
- [ ] Allure annotations (@Step, @Description, @Severity) where applicable
|
|
128
|
+
- [ ] Traceability to test case IDs where applicable
|
|
129
|
+
- [ ] No hardcoded secrets (use env vars)
|
|
130
|
+
- [ ] File naming follows `{Feature}Test.java` convention
|
|
131
|
+
|
|
132
|
+
## Troubleshooting
|
|
133
|
+
|
|
134
|
+
| Symptom | Likely Cause | Fix |
|
|
135
|
+
| ------- | ------------ | --- |
|
|
136
|
+
| Element not found | Selector too specific, timing | Use explicit wait; prefer ID/CSS over fragile XPath |
|
|
137
|
+
| StaleElementReferenceException | DOM changed after find | Re-find element before interaction; use explicit wait |
|
|
138
|
+
| Timeout | Element not ready, slow page | Increase WebDriverWait timeout; check for overlays/modals |
|
|
139
|
+
| Flaky tests | Implicit wait, race conditions | Replace implicit with explicit waits; ensure test isolation |
|
|
140
|
+
| Driver not found | WebDriver binary missing | Use WebDriverManager; ensure browser installed |
|
|
141
|
+
| Headless fails | Browser options incorrect | Verify Chrome/Firefox headless options for your Selenium version |
|
|
142
|
+
| PageFactory null | Not initialized | Call PageFactory.initElements in constructor or @BeforeEach |
|
|
143
|
+
| Allure not showing | Surefire config missing | Add allure-maven-plugin and surefire properties |
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Selenium Java Best Practices
|
|
2
|
+
|
|
3
|
+
## Explicit Waits Over Implicit
|
|
4
|
+
|
|
5
|
+
- Set `implicitlyWait(Duration.ZERO)` and use `WebDriverWait` + `ExpectedConditions` for all waits
|
|
6
|
+
- Avoid `Thread.sleep()` — use explicit waits for reliability
|
|
7
|
+
- Choose the right condition: `visibilityOf` for UI, `presenceOf` for DOM-only checks
|
|
8
|
+
|
|
9
|
+
## Page Object Model
|
|
10
|
+
|
|
11
|
+
- One page class per page/screen; extend `BasePage` for shared logic
|
|
12
|
+
- Use `PageFactory.initElements()` in constructor
|
|
13
|
+
- Encapsulate locators with `@FindBy`; expose actions as methods
|
|
14
|
+
- Do not expose `WebElement` directly when an action method is clearer
|
|
15
|
+
|
|
16
|
+
## Locator Strategy
|
|
17
|
+
|
|
18
|
+
1. **ID** — Fast, stable when present
|
|
19
|
+
2. **data-testid** — Explicit test hooks: `By.cssSelector("[data-testid='submit']")`
|
|
20
|
+
3. **CSS** — Readable, fast; avoid deep hierarchies
|
|
21
|
+
4. **XPath** — Use when CSS cannot express; prefer relative paths
|
|
22
|
+
|
|
23
|
+
Avoid: brittle text-based XPath, index-based selectors, dynamic class names.
|
|
24
|
+
|
|
25
|
+
## AssertJ Assertions
|
|
26
|
+
|
|
27
|
+
```java
|
|
28
|
+
assertThat(element).isDisplayed().isEnabled();
|
|
29
|
+
assertThat(element.getText()).contains("Expected");
|
|
30
|
+
assertThat(driver.getCurrentUrl()).contains("/dashboard");
|
|
31
|
+
assertThat(elements).hasSize(3);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Prefer AssertJ over JUnit `assertEquals` for readability and failure messages.
|
|
35
|
+
|
|
36
|
+
## Allure Annotations
|
|
37
|
+
|
|
38
|
+
- `@Step("User logs in with {username}")` — Wrap actions for step reporting
|
|
39
|
+
- `@Description("Verify checkout flow with valid cart")` — Test description
|
|
40
|
+
- `@Severity(SeverityLevel.CRITICAL)` — For prioritization
|
|
41
|
+
- `@Epic`, `@Feature`, `@Story` — For hierarchical reporting
|
|
42
|
+
|
|
43
|
+
## Test Independence
|
|
44
|
+
|
|
45
|
+
- Each test should run in isolation
|
|
46
|
+
- Use `@BeforeEach` for fresh driver; `@AfterEach` for cleanup
|
|
47
|
+
- No shared mutable state between tests
|
|
48
|
+
- Use `@Order` only when truly required; prefer independent tests
|
|
49
|
+
|
|
50
|
+
## Headless for CI
|
|
51
|
+
|
|
52
|
+
- Enable headless via `--headless=new` (Chrome) or `-headless` (Firefox)
|
|
53
|
+
- Set `window-size` to avoid layout issues
|
|
54
|
+
- Use `WebDriverManager` for driver binaries in CI
|
|
55
|
+
|
|
56
|
+
## Security
|
|
57
|
+
|
|
58
|
+
- Never hardcode credentials; use env vars or secrets
|
|
59
|
+
- Use `System.getenv("BASE_URL")` or config files for URLs
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Selenium Java Configuration
|
|
2
|
+
|
|
3
|
+
## Maven Dependencies
|
|
4
|
+
|
|
5
|
+
```xml
|
|
6
|
+
<dependencies>
|
|
7
|
+
<dependency>
|
|
8
|
+
<groupId>org.seleniumhq.selenium</groupId>
|
|
9
|
+
<artifactId>selenium-java</artifactId>
|
|
10
|
+
<version>4.25.0</version>
|
|
11
|
+
<scope>test</scope>
|
|
12
|
+
</dependency>
|
|
13
|
+
<dependency>
|
|
14
|
+
<groupId>org.junit.jupiter</groupId>
|
|
15
|
+
<artifactId>junit-jupiter</artifactId>
|
|
16
|
+
<version>5.10.2</version>
|
|
17
|
+
<scope>test</scope>
|
|
18
|
+
</dependency>
|
|
19
|
+
<dependency>
|
|
20
|
+
<groupId>org.assertj</groupId>
|
|
21
|
+
<artifactId>assertj-core</artifactId>
|
|
22
|
+
<version>3.25.3</version>
|
|
23
|
+
<scope>test</scope>
|
|
24
|
+
</dependency>
|
|
25
|
+
<dependency>
|
|
26
|
+
<groupId>io.qameta.allure</groupId>
|
|
27
|
+
<artifactId>allure-junit5</artifactId>
|
|
28
|
+
<version>2.29.0</version>
|
|
29
|
+
<scope>test</scope>
|
|
30
|
+
</dependency>
|
|
31
|
+
<dependency>
|
|
32
|
+
<groupId>io.github.bonigarcia</groupId>
|
|
33
|
+
<artifactId>webdrivermanager</artifactId>
|
|
34
|
+
<version>5.7.0</version>
|
|
35
|
+
<scope>test</scope>
|
|
36
|
+
</dependency>
|
|
37
|
+
</dependencies>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Gradle Dependencies
|
|
41
|
+
|
|
42
|
+
```groovy
|
|
43
|
+
dependencies {
|
|
44
|
+
testImplementation 'org.seleniumhq.selenium:selenium-java:4.25.0'
|
|
45
|
+
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
|
|
46
|
+
testImplementation 'org.assertj:assertj-core:3.25.3'
|
|
47
|
+
testImplementation 'io.qameta.allure:allure-junit5:2.29.0'
|
|
48
|
+
testImplementation 'io.github.bonigarcia:webdrivermanager:5.7.0'
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## WebDriver Setup with WebDriverManager
|
|
53
|
+
|
|
54
|
+
```java
|
|
55
|
+
@BeforeEach
|
|
56
|
+
void setUp() {
|
|
57
|
+
WebDriverManager.chromedriver().setup();
|
|
58
|
+
ChromeOptions options = new ChromeOptions();
|
|
59
|
+
if (Boolean.parseBoolean(System.getProperty("headless", "false"))) {
|
|
60
|
+
options.addArguments("--headless=new", "--disable-gpu", "--window-size=1920,1080");
|
|
61
|
+
}
|
|
62
|
+
driver = new ChromeDriver(options);
|
|
63
|
+
driver.manage().timeouts().implicitlyWait(Duration.ZERO); // Prefer explicit
|
|
64
|
+
driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(30));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@AfterEach
|
|
68
|
+
void tearDown() {
|
|
69
|
+
if (driver != null) {
|
|
70
|
+
driver.quit();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Base Test Class Pattern
|
|
76
|
+
|
|
77
|
+
```java
|
|
78
|
+
@ExtendWith(AllureJunit5.class)
|
|
79
|
+
public abstract class BaseSeleniumTest {
|
|
80
|
+
protected WebDriver driver;
|
|
81
|
+
|
|
82
|
+
@BeforeEach
|
|
83
|
+
void initDriver() {
|
|
84
|
+
driver = createDriver();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@AfterEach
|
|
88
|
+
void closeDriver() {
|
|
89
|
+
if (driver != null) driver.quit();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
protected abstract WebDriver createDriver();
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Parallel Execution (maven-surefire-plugin)
|
|
97
|
+
|
|
98
|
+
```xml
|
|
99
|
+
<plugin>
|
|
100
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
101
|
+
<artifactId>maven-surefire-plugin</artifactId>
|
|
102
|
+
<version>3.2.5</version>
|
|
103
|
+
<configuration>
|
|
104
|
+
<properties>
|
|
105
|
+
<configurationParameters>
|
|
106
|
+
junit.jupiter.execution.parallel.enabled=true
|
|
107
|
+
junit.jupiter.execution.parallel.mode.default=concurrent
|
|
108
|
+
junit.jupiter.execution.parallel.config.strategy=fixed
|
|
109
|
+
junit.jupiter.execution.parallel.config.fixed.parallelism=4
|
|
110
|
+
</configurationParameters>
|
|
111
|
+
</properties>
|
|
112
|
+
<systemPropertyVariables>
|
|
113
|
+
<headless>true</headless>
|
|
114
|
+
</systemPropertyVariables>
|
|
115
|
+
</configuration>
|
|
116
|
+
</plugin>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Allure Configuration
|
|
120
|
+
|
|
121
|
+
```xml
|
|
122
|
+
<plugin>
|
|
123
|
+
<groupId>io.qameta.allure</groupId>
|
|
124
|
+
<artifactId>allure-maven</artifactId>
|
|
125
|
+
<version>2.12.0</version>
|
|
126
|
+
</plugin>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
```properties
|
|
130
|
+
# allure.properties (src/test/resources)
|
|
131
|
+
allure.results.directory=target/allure-results
|
|
132
|
+
allure.link.issue.pattern=https://jira.example.com/browse/{}
|
|
133
|
+
allure.link.tms.pattern=https://testlink.example.com/linkto.php?tprojectPrefix=QA&item=testcase&id={}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Environment Variables
|
|
137
|
+
|
|
138
|
+
| Variable | Purpose |
|
|
139
|
+
| -------- | ------- |
|
|
140
|
+
| `BASE_URL` | Application base URL |
|
|
141
|
+
| `HEADLESS` | Run browser headless |
|
|
142
|
+
| `BROWSER` | chrome, firefox, edge |
|
|
143
|
+
| `IMPLICIT_WAIT` | Fallback implicit wait (prefer 0) |
|