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,354 @@
|
|
|
1
|
+
# Qase.io REST API Reference
|
|
2
|
+
|
|
3
|
+
Base URL: `https://api.qase.io/v1`
|
|
4
|
+
|
|
5
|
+
Authentication: `Token: {QASE_API_TOKEN}` (header)
|
|
6
|
+
|
|
7
|
+
## Projects
|
|
8
|
+
|
|
9
|
+
### GET /project
|
|
10
|
+
|
|
11
|
+
List all projects.
|
|
12
|
+
|
|
13
|
+
**Query params:** `limit` (1–100, default 10), `offset` (default 0)
|
|
14
|
+
|
|
15
|
+
**Response 200:**
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"status": true,
|
|
19
|
+
"result": {
|
|
20
|
+
"total": 5,
|
|
21
|
+
"filtered": 5,
|
|
22
|
+
"count": 5,
|
|
23
|
+
"entities": [
|
|
24
|
+
{
|
|
25
|
+
"title": "My Project",
|
|
26
|
+
"code": "MP",
|
|
27
|
+
"counts": {
|
|
28
|
+
"cases": 42,
|
|
29
|
+
"suites": 3,
|
|
30
|
+
"milestones": 2,
|
|
31
|
+
"runs": { "total": 10, "active": 1 },
|
|
32
|
+
"defects": { "total": 5, "open": 2 }
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### POST /project
|
|
41
|
+
|
|
42
|
+
Create a new project.
|
|
43
|
+
|
|
44
|
+
**Request body:**
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"title": "My Project",
|
|
48
|
+
"code": "MP",
|
|
49
|
+
"description": "Optional description"
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Response 200:**
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"status": true,
|
|
57
|
+
"result": {
|
|
58
|
+
"id": 1,
|
|
59
|
+
"code": "MP"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Test Suites
|
|
67
|
+
|
|
68
|
+
### GET /suite/{code}
|
|
69
|
+
|
|
70
|
+
List test suites. `{code}` = project code.
|
|
71
|
+
|
|
72
|
+
**Query params:** `limit`, `offset`, `search`
|
|
73
|
+
|
|
74
|
+
**Response 200:**
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"status": true,
|
|
78
|
+
"result": {
|
|
79
|
+
"total": 3,
|
|
80
|
+
"entities": [
|
|
81
|
+
{
|
|
82
|
+
"id": 1,
|
|
83
|
+
"title": "Login",
|
|
84
|
+
"description": "Login flow tests",
|
|
85
|
+
"parent_id": null
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### POST /suite/{code}
|
|
93
|
+
|
|
94
|
+
Create a test suite.
|
|
95
|
+
|
|
96
|
+
**Request body:**
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"title": "Login",
|
|
100
|
+
"description": "Login flow tests",
|
|
101
|
+
"parent_id": null
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Response 200:**
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"status": true,
|
|
109
|
+
"result": {
|
|
110
|
+
"id": 1
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Test Cases
|
|
118
|
+
|
|
119
|
+
### GET /case/{code}
|
|
120
|
+
|
|
121
|
+
List test cases. `{code}` = project code.
|
|
122
|
+
|
|
123
|
+
**Query params:** `limit`, `offset`, `suite_id`, `search`, `milestone_id`, `severity`, `priority`, `type`, `automation`
|
|
124
|
+
|
|
125
|
+
**Response 200:**
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"status": true,
|
|
129
|
+
"result": {
|
|
130
|
+
"total": 42,
|
|
131
|
+
"entities": [
|
|
132
|
+
{
|
|
133
|
+
"id": 1,
|
|
134
|
+
"title": "Valid login",
|
|
135
|
+
"description": "User can login with valid credentials",
|
|
136
|
+
"preconditions": "User is on login page",
|
|
137
|
+
"postconditions": null,
|
|
138
|
+
"severity": 2,
|
|
139
|
+
"priority": 2,
|
|
140
|
+
"type": 1,
|
|
141
|
+
"automation": 1,
|
|
142
|
+
"suite_id": 1,
|
|
143
|
+
"steps": [
|
|
144
|
+
{
|
|
145
|
+
"action": "Enter valid email and password",
|
|
146
|
+
"expected_result": "User is logged in"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### POST /case/{code}
|
|
156
|
+
|
|
157
|
+
Create a test case.
|
|
158
|
+
|
|
159
|
+
**Request body:**
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"title": "Valid login",
|
|
163
|
+
"description": "User can login with valid credentials",
|
|
164
|
+
"preconditions": "User is on login page",
|
|
165
|
+
"postconditions": null,
|
|
166
|
+
"severity": 2,
|
|
167
|
+
"priority": 2,
|
|
168
|
+
"type": 1,
|
|
169
|
+
"automation": 1,
|
|
170
|
+
"suite_id": 1,
|
|
171
|
+
"steps": [
|
|
172
|
+
{
|
|
173
|
+
"action": "Enter valid email and password",
|
|
174
|
+
"expected_result": "User is logged in"
|
|
175
|
+
}
|
|
176
|
+
],
|
|
177
|
+
"tags": ["login", "smoke"]
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Response 200:**
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"status": true,
|
|
185
|
+
"result": {
|
|
186
|
+
"id": 1
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### PATCH /case/{code}/{id}
|
|
192
|
+
|
|
193
|
+
Update a test case. `{id}` = case ID.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Test Runs
|
|
198
|
+
|
|
199
|
+
### GET /run/{code}
|
|
200
|
+
|
|
201
|
+
List test runs. `{code}` = project code.
|
|
202
|
+
|
|
203
|
+
**Query params:** `limit`, `offset`, `status`, `milestone_id`, `environment_id`
|
|
204
|
+
|
|
205
|
+
**Response 200:**
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"status": true,
|
|
209
|
+
"result": {
|
|
210
|
+
"total": 10,
|
|
211
|
+
"entities": [
|
|
212
|
+
{
|
|
213
|
+
"id": 1,
|
|
214
|
+
"title": "Regression Run 2024-01-15",
|
|
215
|
+
"status": "active",
|
|
216
|
+
"is_autotest": true
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### POST /run/{code}
|
|
224
|
+
|
|
225
|
+
Create a test run.
|
|
226
|
+
|
|
227
|
+
**Request body:**
|
|
228
|
+
```json
|
|
229
|
+
{
|
|
230
|
+
"title": "Regression Run 2024-01-15",
|
|
231
|
+
"description": "Full regression",
|
|
232
|
+
"include_all_cases": false,
|
|
233
|
+
"cases": [1, 2, 3],
|
|
234
|
+
"is_autotest": true,
|
|
235
|
+
"environment_id": 1,
|
|
236
|
+
"milestone_id": 1,
|
|
237
|
+
"tags": ["regression", "ci"]
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Response 200:**
|
|
242
|
+
```json
|
|
243
|
+
{
|
|
244
|
+
"status": true,
|
|
245
|
+
"result": {
|
|
246
|
+
"id": 1
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Test Results
|
|
254
|
+
|
|
255
|
+
### POST /result/{code}/{id}
|
|
256
|
+
|
|
257
|
+
Create a test result. `{code}` = project code, `{id}` = run ID.
|
|
258
|
+
|
|
259
|
+
**Request body:**
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"case_id": 1,
|
|
263
|
+
"status": "passed",
|
|
264
|
+
"time_ms": 1500,
|
|
265
|
+
"comment": "Optional comment",
|
|
266
|
+
"stacktrace": "Optional stack trace for failures",
|
|
267
|
+
"defect": false,
|
|
268
|
+
"attachments": []
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Status values:** `passed`, `failed`, `blocked`, `skipped`, `invalid` (+ custom)
|
|
273
|
+
|
|
274
|
+
**Alternative (create case on-the-fly):**
|
|
275
|
+
```json
|
|
276
|
+
{
|
|
277
|
+
"case": {
|
|
278
|
+
"title": "New test case title",
|
|
279
|
+
"suite_title": "Suite Name",
|
|
280
|
+
"description": "Description",
|
|
281
|
+
"preconditions": "Preconditions",
|
|
282
|
+
"severity": "major",
|
|
283
|
+
"priority": "high"
|
|
284
|
+
},
|
|
285
|
+
"status": "failed",
|
|
286
|
+
"comment": "Assertion failed",
|
|
287
|
+
"stacktrace": "Error: expected..."
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Response 200:**
|
|
292
|
+
```json
|
|
293
|
+
{
|
|
294
|
+
"status": true,
|
|
295
|
+
"result": {
|
|
296
|
+
"case_id": 1,
|
|
297
|
+
"hash": "abc123"
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### POST /result/{code}/{id}/bulk
|
|
303
|
+
|
|
304
|
+
Bulk create results. Same structure with array of result objects.
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Defects
|
|
309
|
+
|
|
310
|
+
### GET /defect/{code}
|
|
311
|
+
|
|
312
|
+
List defects. `{code}` = project code.
|
|
313
|
+
|
|
314
|
+
**Query params:** `limit`, `offset`, `status`, `milestone_id`
|
|
315
|
+
|
|
316
|
+
### POST /defect/{code}
|
|
317
|
+
|
|
318
|
+
Create a defect.
|
|
319
|
+
|
|
320
|
+
**Request body:**
|
|
321
|
+
```json
|
|
322
|
+
{
|
|
323
|
+
"title": "Login fails with special characters",
|
|
324
|
+
"actual_result": "Error 500",
|
|
325
|
+
"severity": 2,
|
|
326
|
+
"priority": 2,
|
|
327
|
+
"description": "When password contains @#$...",
|
|
328
|
+
"steps": ["Step 1", "Step 2"],
|
|
329
|
+
"attachments": []
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**Response 200:**
|
|
334
|
+
```json
|
|
335
|
+
{
|
|
336
|
+
"status": true,
|
|
337
|
+
"result": {
|
|
338
|
+
"id": 1
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Error Codes
|
|
346
|
+
|
|
347
|
+
| Code | Meaning |
|
|
348
|
+
| ---- | ------- |
|
|
349
|
+
| 400 | Bad Request |
|
|
350
|
+
| 401 | Unauthorized (invalid/missing token) |
|
|
351
|
+
| 403 | Forbidden (insufficient permissions) |
|
|
352
|
+
| 404 | Not Found |
|
|
353
|
+
| 422 | Unprocessable Entity (validation errors) |
|
|
354
|
+
| 429 | Too Many Requests (rate limit; check Retry-After) |
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# CI/CD Integration with Qase.io
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Push test execution results from CI/CD pipelines to Qase.io. Two main approaches:
|
|
6
|
+
|
|
7
|
+
1. **qase-api reporter** — Native reporter that sends results directly to Qase during test execution
|
|
8
|
+
2. **JUnit XML → Qase** — Parse JUnit XML artifacts and push via REST API (e.g., in a separate job)
|
|
9
|
+
|
|
10
|
+
## Option 1: qase-api Reporter
|
|
11
|
+
|
|
12
|
+
### Supported Frameworks
|
|
13
|
+
|
|
14
|
+
- **Jest** — `@qase/jest`
|
|
15
|
+
- **Playwright** — `@qase/playwright`
|
|
16
|
+
- **Cypress** — `@qase/cypress`
|
|
17
|
+
- **Pytest** — `qase-pytest`
|
|
18
|
+
- **Mocha** — `@qase/mocha`
|
|
19
|
+
- **PHPUnit** — `qase-phpunit`
|
|
20
|
+
|
|
21
|
+
### Configuration
|
|
22
|
+
|
|
23
|
+
Set environment variables:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
QASE_API_TOKEN=your_api_token
|
|
27
|
+
QASE_PROJECT_CODE=MP
|
|
28
|
+
QASE_RUN_ID=123 # Optional: append to existing run
|
|
29
|
+
QASE_RUN_NAME="CI Run $(date +%Y-%m-%d)"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Jest Example
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
// jest.config.js
|
|
36
|
+
module.exports = {
|
|
37
|
+
reporters: [
|
|
38
|
+
'default',
|
|
39
|
+
['@qase/jest', {
|
|
40
|
+
apiToken: process.env.QASE_API_TOKEN,
|
|
41
|
+
projectCode: process.env.QASE_PROJECT_CODE,
|
|
42
|
+
runId: process.env.QASE_RUN_ID,
|
|
43
|
+
runName: process.env.QASE_RUN_NAME,
|
|
44
|
+
logging: true
|
|
45
|
+
}]
|
|
46
|
+
]
|
|
47
|
+
};
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Playwright Example
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// playwright.config.ts
|
|
54
|
+
import { defineConfig } from '@playwright/test';
|
|
55
|
+
|
|
56
|
+
export default defineConfig({
|
|
57
|
+
reporter: [
|
|
58
|
+
['html'],
|
|
59
|
+
['@qase/playwright', {
|
|
60
|
+
apiToken: process.env.QASE_API_TOKEN,
|
|
61
|
+
projectCode: process.env.QASE_PROJECT_CODE,
|
|
62
|
+
runId: process.env.QASE_RUN_ID,
|
|
63
|
+
runName: process.env.QASE_RUN_NAME
|
|
64
|
+
}]
|
|
65
|
+
]
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Pytest Example
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
# pytest.ini or pyproject.toml
|
|
73
|
+
[pytest]
|
|
74
|
+
addopts = -v --qase --qase-api-token=${QASE_API_TOKEN} --qase-project=${QASE_PROJECT_CODE} --qase-run-id=${QASE_RUN_ID}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Or in `conftest.py`:
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
def pytest_configure(config):
|
|
81
|
+
config.addinivalue_line("addopts", "--qase")
|
|
82
|
+
config.addinivalue_line("addopts", f"--qase-api-token={os.environ.get('QASE_API_TOKEN')}")
|
|
83
|
+
config.addinivalue_line("addopts", f"--qase-project={os.environ.get('QASE_PROJECT_CODE')}")
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Case ID Mapping
|
|
87
|
+
|
|
88
|
+
Reporters map test names to Qase cases. Options:
|
|
89
|
+
|
|
90
|
+
- **Case ID in test name** — e.g., `C1` or `C123` prefix
|
|
91
|
+
- **Decorator/annotation** — `@qase.id(123)` or `@qase.id("C123")`
|
|
92
|
+
- **Title matching** — Match by test title (less reliable)
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Option 2: GitHub Actions + JUnit XML
|
|
97
|
+
|
|
98
|
+
Push JUnit XML results to Qase.io in a separate step.
|
|
99
|
+
|
|
100
|
+
### Workflow Example
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
name: Tests + Qase Sync
|
|
104
|
+
|
|
105
|
+
on:
|
|
106
|
+
push:
|
|
107
|
+
branches: [main]
|
|
108
|
+
pull_request:
|
|
109
|
+
branches: [main]
|
|
110
|
+
|
|
111
|
+
jobs:
|
|
112
|
+
test:
|
|
113
|
+
runs-on: ubuntu-latest
|
|
114
|
+
steps:
|
|
115
|
+
- uses: actions/checkout@v4
|
|
116
|
+
|
|
117
|
+
- name: Setup Node
|
|
118
|
+
uses: actions/setup-node@v4
|
|
119
|
+
with:
|
|
120
|
+
node-version: '20'
|
|
121
|
+
|
|
122
|
+
- name: Install dependencies
|
|
123
|
+
run: npm ci
|
|
124
|
+
|
|
125
|
+
- name: Run tests
|
|
126
|
+
run: npm test -- --ci --reporters=default --reporters=jest-junit
|
|
127
|
+
env:
|
|
128
|
+
JEST_JUNIT_OUTPUT_DIR: ./test-results
|
|
129
|
+
|
|
130
|
+
- name: Upload JUnit results
|
|
131
|
+
uses: actions/upload-artifact@v4
|
|
132
|
+
with:
|
|
133
|
+
name: junit-results
|
|
134
|
+
path: test-results/
|
|
135
|
+
|
|
136
|
+
qase-push:
|
|
137
|
+
needs: test
|
|
138
|
+
runs-on: ubuntu-latest
|
|
139
|
+
steps:
|
|
140
|
+
- uses: actions/checkout@v4
|
|
141
|
+
|
|
142
|
+
- name: Download JUnit results
|
|
143
|
+
uses: actions/download-artifact@v4
|
|
144
|
+
with:
|
|
145
|
+
name: junit-results
|
|
146
|
+
|
|
147
|
+
- name: Push to Qase.io
|
|
148
|
+
uses: qase-io/qase-report-action@v1
|
|
149
|
+
with:
|
|
150
|
+
api-token: ${{ secrets.QASE_API_TOKEN }}
|
|
151
|
+
project-code: ${{ vars.QASE_PROJECT_CODE }}
|
|
152
|
+
results-path: ./
|
|
153
|
+
run-name: "CI Run ${{ github.run_number }}"
|
|
154
|
+
run-complete: true
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Alternative: Custom Script
|
|
158
|
+
|
|
159
|
+
If no ready-made action fits, use a script that:
|
|
160
|
+
|
|
161
|
+
1. Parses JUnit XML
|
|
162
|
+
2. Creates a run via `POST /run/{code}`
|
|
163
|
+
3. Maps each `<testcase>` to a Qase case (by title or external ID)
|
|
164
|
+
4. Posts results via `POST /result/{code}/{run_id}` or bulk endpoint
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Example: using qase-api CLI or custom Node/Python script
|
|
168
|
+
npx qase-api push-results \
|
|
169
|
+
--token $QASE_API_TOKEN \
|
|
170
|
+
--project $QASE_PROJECT_CODE \
|
|
171
|
+
--results ./test-results/junit.xml \
|
|
172
|
+
--run-name "CI Run"
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Environment Variables
|
|
178
|
+
|
|
179
|
+
| Variable | Required | Description |
|
|
180
|
+
| -------- | -------- | ----------- |
|
|
181
|
+
| `QASE_API_TOKEN` | Yes | API token from app.qase.io/user/api/token |
|
|
182
|
+
| `QASE_PROJECT_CODE` | Yes | Project code (2–10 chars) |
|
|
183
|
+
| `QASE_RUN_ID` | No | Append to existing run |
|
|
184
|
+
| `QASE_RUN_NAME` | No | Name for new run |
|
|
185
|
+
| `QASE_ENVIRONMENT_ID` | No | Environment for the run |
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Best Practices
|
|
190
|
+
|
|
191
|
+
1. **Secrets** — Store `QASE_API_TOKEN` in GitHub Secrets (or equivalent); never in code
|
|
192
|
+
2. **Run naming** — Include build ID, branch, or date for traceability
|
|
193
|
+
3. **Case mapping** — Use consistent test naming or `@qase.id()` for reliable mapping
|
|
194
|
+
4. **Bulk results** — Use `POST /result/{code}/{id}/bulk` for large result sets
|
|
195
|
+
5. **Run completion** — Call run complete endpoint when all results are posted
|
|
196
|
+
6. **Retries** — Handle 429; implement exponential backoff for rate limits
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Field Mapping: Local QA Skills ↔ Qase.io
|
|
2
|
+
|
|
3
|
+
## Test Case Fields
|
|
4
|
+
|
|
5
|
+
| Local (QA Skills) | Qase.io Field | Notes |
|
|
6
|
+
| ----------------- | ------------- | ----- |
|
|
7
|
+
| ID | — | Local identifier; use for traceability; Qase assigns its own `id` |
|
|
8
|
+
| Title | `title` | Required; max 255 chars |
|
|
9
|
+
| Description | `description` | Free text |
|
|
10
|
+
| Module / Component | `suite_id` or `suite_title` | Map to Qase suite |
|
|
11
|
+
| Preconditions | `preconditions` | Free text |
|
|
12
|
+
| Steps (Action \| Expected) | `steps[].action`, `steps[].expected_result` | See steps format below |
|
|
13
|
+
| Postconditions | `postconditions` | Free text |
|
|
14
|
+
| Test Data | `steps[].data` or in description | Optional |
|
|
15
|
+
| Traceability (Req ID) | `tags` or custom field | e.g., tag `req:REQ-FN-001` |
|
|
16
|
+
| Priority | `priority` | See Priority enum |
|
|
17
|
+
| Severity | `severity` | See Severity enum |
|
|
18
|
+
| Type | `type` | See Type enum |
|
|
19
|
+
| Automation status | `automation` | See Automation enum |
|
|
20
|
+
|
|
21
|
+
## Steps Format
|
|
22
|
+
|
|
23
|
+
**Local (QA Skills):**
|
|
24
|
+
```
|
|
25
|
+
| Step# | Action | Expected Result |
|
|
26
|
+
| 1 | Enter valid email | Email accepted |
|
|
27
|
+
| 2 | Enter valid password | Password accepted |
|
|
28
|
+
| 3 | Click Login | User is logged in |
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Qase.io:**
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"steps": [
|
|
35
|
+
{
|
|
36
|
+
"action": "Enter valid email",
|
|
37
|
+
"expected_result": "Email accepted"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"action": "Enter valid password",
|
|
41
|
+
"expected_result": "Password accepted"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"action": "Click Login",
|
|
45
|
+
"expected_result": "User is logged in"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Priority Enum
|
|
52
|
+
|
|
53
|
+
| Local | Qase.io (integer) | Qase.io (slug) |
|
|
54
|
+
| ----- | ----------------- | -------------- |
|
|
55
|
+
| Critical / P1 | 1 | `critical` |
|
|
56
|
+
| High / P2 | 2 | `high` |
|
|
57
|
+
| Medium / P3 | 3 | `medium` |
|
|
58
|
+
| Low / P4 | 4 | `low` |
|
|
59
|
+
| Not set | 5 | `not_set` |
|
|
60
|
+
|
|
61
|
+
## Severity Enum
|
|
62
|
+
|
|
63
|
+
| Local | Qase.io (integer) | Qase.io (slug) |
|
|
64
|
+
| ----- | ----------------- | -------------- |
|
|
65
|
+
| Blocker | 1 | `blocker` |
|
|
66
|
+
| Critical | 2 | `critical` |
|
|
67
|
+
| Major | 3 | `major` |
|
|
68
|
+
| Minor | 4 | `minor` |
|
|
69
|
+
| Trivial | 5 | `trivial` |
|
|
70
|
+
| Not set | 6 | `not_set` |
|
|
71
|
+
|
|
72
|
+
## Type Enum
|
|
73
|
+
|
|
74
|
+
| Local | Qase.io (integer) |
|
|
75
|
+
| ----- | ----------------- |
|
|
76
|
+
| functional | 1 |
|
|
77
|
+
| smoke | 2 |
|
|
78
|
+
| regression | 3 |
|
|
79
|
+
| security | 4 |
|
|
80
|
+
| usability | 5 |
|
|
81
|
+
| performance | 6 |
|
|
82
|
+
| other | 7 |
|
|
83
|
+
|
|
84
|
+
## Automation Enum
|
|
85
|
+
|
|
86
|
+
| Local | Qase.io (integer) |
|
|
87
|
+
| ----- | ----------------- |
|
|
88
|
+
| Manual / Not automated | 0 |
|
|
89
|
+
| Automated | 1 |
|
|
90
|
+
| To be automated | 2 |
|
|
91
|
+
|
|
92
|
+
## Test Result Status
|
|
93
|
+
|
|
94
|
+
| JUnit / Source | Qase.io `status` |
|
|
95
|
+
| -------------- | ---------------- |
|
|
96
|
+
| passed / success | `passed` |
|
|
97
|
+
| failed / failure | `failed` |
|
|
98
|
+
| skipped | `skipped` |
|
|
99
|
+
| error / blocked | `blocked` |
|
|
100
|
+
| (invalid) | `invalid` |
|
|
101
|
+
|
|
102
|
+
## Local Test Case JSON Example
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"id": "TC-LOGIN-001",
|
|
107
|
+
"title": "Valid login",
|
|
108
|
+
"module": "Auth",
|
|
109
|
+
"priority": "High",
|
|
110
|
+
"severity": "Major",
|
|
111
|
+
"type": "functional",
|
|
112
|
+
"automation": "Planned",
|
|
113
|
+
"preconditions": "User is on login page",
|
|
114
|
+
"steps": [
|
|
115
|
+
{ "action": "Enter valid email", "expected": "Email accepted" },
|
|
116
|
+
{ "action": "Enter valid password", "expected": "Password accepted" },
|
|
117
|
+
{ "action": "Click Login", "expected": "User is logged in" }
|
|
118
|
+
],
|
|
119
|
+
"traceability": ["REQ-FN-001"]
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Mapped Qase.io Payload
|
|
124
|
+
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"title": "Valid login",
|
|
128
|
+
"description": "",
|
|
129
|
+
"preconditions": "User is on login page",
|
|
130
|
+
"suite_id": 1,
|
|
131
|
+
"priority": 2,
|
|
132
|
+
"severity": 3,
|
|
133
|
+
"type": 1,
|
|
134
|
+
"automation": 2,
|
|
135
|
+
"tags": ["req:REQ-FN-001", "Auth"],
|
|
136
|
+
"steps": [
|
|
137
|
+
{ "action": "Enter valid email", "expected_result": "Email accepted" },
|
|
138
|
+
{ "action": "Enter valid password", "expected_result": "Password accepted" },
|
|
139
|
+
{ "action": "Click Login", "expected_result": "User is logged in" }
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Custom Fields
|
|
145
|
+
|
|
146
|
+
Qase.io supports custom fields. Map local fields to `custom_field` object:
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"custom_field": {
|
|
151
|
+
"1": "REQ-FN-001",
|
|
152
|
+
"2": "2024-Q1"
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Field IDs come from Qase project settings. Configure mapping per project.
|