@keber/qa-framework 1.3.0-0 → 1.4.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/package.json +2 -1
- package/skills/qa-ado-integration/SKILL.md +103 -0
- package/skills/qa-ado-integration/references/scripts-and-config.md +201 -0
- package/skills/qa-automation/SKILL.md +101 -0
- package/skills/qa-automation/references/config-checklist.md +79 -0
- package/skills/qa-automation/references/patterns.md +180 -0
- package/skills/qa-maintenance/SKILL.md +110 -0
- package/skills/qa-maintenance/references/update-rules.md +118 -0
- package/skills/qa-module-analysis/SKILL.md +95 -0
- package/skills/qa-module-analysis/references/exploration-checklist.md +121 -0
- package/skills/qa-module-analysis/references/spec-file-formats.md +219 -0
- package/skills/qa-spec-generation/SKILL.md +93 -0
- package/skills/qa-test-cases/SKILL.md +89 -0
- package/skills/qa-test-cases/references/test-case-template.md +142 -0
- package/skills/qa-test-plan/SKILL.md +81 -0
- package/skills/qa-test-plan/references/priority-and-feasibility.md +159 -0
- package/skills/qa-test-stabilization/SKILL.md +123 -0
- package/skills/qa-test-stabilization/references/classification-protocol.md +142 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Reference: Failure Classification Protocol
|
|
2
|
+
|
|
3
|
+
> Loaded by `skills/qa-test-stabilization/` for failure diagnosis and reporting.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Failure Categories
|
|
8
|
+
|
|
9
|
+
| Category | Definition | Correct action |
|
|
10
|
+
|----------|-----------|----------------|
|
|
11
|
+
| **A — Wrong selector** | Locator no longer matches the UI element | Fix selector; prefer `getByRole`, `getByLabel`, `getByTestId` |
|
|
12
|
+
| **B — Wrong assertion** | Assertion doesn't match TC acceptance criterion | Rewrite assertion to match spec |
|
|
13
|
+
| **C — Wrong flow** | Test steps don't reflect the user flow in the TC | Rewrite steps to match TC |
|
|
14
|
+
| **D — Fragile timing** | Intermittent failure due to missing `await`, race condition, or missing `waitFor` | Add proper async handling; never use `waitForTimeout` |
|
|
15
|
+
| **E — Incorrect data** | Data malformed, not unique, or conflicts with QA environment state | Fix data generation or `beforeAll` provisioning |
|
|
16
|
+
| **F — App Bug** | Test is correct; application doesn't behave as specified | Do NOT fix test; file defect; skip with DEF reference |
|
|
17
|
+
| **G — TC Mismatch** | TC acceptance criterion is ambiguous or wrong vs actual behavior | Do NOT fix test or app; update `05-test-scenarios.md` |
|
|
18
|
+
| **H — Infra/Environment** | Failure due to env unavailability, network, or credentials | Retry in clean environment before classifying further |
|
|
19
|
+
| **I — Intentional skip** | Test skipped for known defect or pending feature | Verify skip reason still valid; update defect reference if needed |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Decision Protocol
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Are test steps and assertion derived correctly from 05-test-scenarios.md?
|
|
27
|
+
No → Category G (fix the spec, not the test)
|
|
28
|
+
Yes ↓
|
|
29
|
+
Does the application behave as the TC acceptance criterion describes?
|
|
30
|
+
No → Category F (file defect; skip test with DEF reference)
|
|
31
|
+
Yes ↓
|
|
32
|
+
Is the failure deterministic (every run)?
|
|
33
|
+
No → Category D or H (timing or environment issue)
|
|
34
|
+
Yes ↓
|
|
35
|
+
Is the failure caused by selector, assertion, flow, or data issue?
|
|
36
|
+
→ Category A, B, C, or E (fix the test code)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Fix order**: E → A → C → B → D (data masks selectors; flow masks assertions)
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## False Positive Check
|
|
44
|
+
|
|
45
|
+
For each **passing** test, perform a negation check:
|
|
46
|
+
|
|
47
|
+
1. Temporarily change the assertion to assert the opposite
|
|
48
|
+
2. Run the test — if it still passes, the original assertion is not evaluating the element
|
|
49
|
+
3. Restore the original assertion
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// Original
|
|
53
|
+
await expect(page.locator('.toast')).toHaveText('Guardado exitosamente');
|
|
54
|
+
// Negation check (temporary — revert after)
|
|
55
|
+
await expect(page.locator('.toast')).toHaveText('TEXTO_QUE_NO_EXISTE');
|
|
56
|
+
// If this passes → false positive detected
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Confidence Scoring
|
|
62
|
+
|
|
63
|
+
| Level | Criteria |
|
|
64
|
+
|-------|---------|
|
|
65
|
+
| ✅ High (≥90%) | Passed negation check AND matches TC acceptance criterion exactly |
|
|
66
|
+
| ⚠️ Medium (70–89%) | Consistently passing; trace reviewed; negation check pending |
|
|
67
|
+
| ❌ Low (<70%) | Intermittent, unclassified, or negation check not done |
|
|
68
|
+
|
|
69
|
+
**Exit criterion**: All tests ✅ High or legitimately skipped with defect reference.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## STABILIZATION-REPORT Template
|
|
74
|
+
|
|
75
|
+
Create at: `qa/07-automation/e2e/tests/{module}/{STABILIZATION-REPORT-YYYY-MM-DD.md}`
|
|
76
|
+
|
|
77
|
+
```markdown
|
|
78
|
+
# Stabilization Report — {MODULE} > {SUBMODULE}
|
|
79
|
+
|
|
80
|
+
**Date**: YYYY-MM-DD
|
|
81
|
+
**Sprint**: {sprint label}
|
|
82
|
+
**Spec reference**: `qa/01-specifications/{module}/{submodule}/05-test-scenarios.md`
|
|
83
|
+
|
|
84
|
+
## Summary
|
|
85
|
+
|
|
86
|
+
| Metric | Value |
|
|
87
|
+
|--------|-------|
|
|
88
|
+
| Tests evaluated | N |
|
|
89
|
+
| Stabilized (✅ High confidence) | N |
|
|
90
|
+
| Skipped — App Bug (Category F) | N |
|
|
91
|
+
| Skipped — Intentional (Category I) | N |
|
|
92
|
+
| Remaining low-confidence | N |
|
|
93
|
+
| Overall confidence | NN% |
|
|
94
|
+
|
|
95
|
+
## Test-by-Test Record
|
|
96
|
+
|
|
97
|
+
| TC-ID | Test title | Baseline | Final | Category | Changes made | Confidence |
|
|
98
|
+
|-------|-----------|----------|-------|----------|-------------|-----------|
|
|
99
|
+
| TC-... | ... | ❌ fail | ✅ pass | A | Selector `#old` → `getByRole('button', { name: '...' })` | ✅ High |
|
|
100
|
+
|
|
101
|
+
## App Bugs Filed (Category F)
|
|
102
|
+
|
|
103
|
+
| DEF-ID | TC-ID | Description | ADO WI |
|
|
104
|
+
|--------|-------|-------------|--------|
|
|
105
|
+
|
|
106
|
+
## Spec Defects (Category G)
|
|
107
|
+
|
|
108
|
+
| TC-ID | Issue | Recommended 05-test-scenarios.md update |
|
|
109
|
+
|-------|-------|----------------------------------------|
|
|
110
|
+
|
|
111
|
+
## Coverage Gaps (note only — do not fix in this stage)
|
|
112
|
+
|
|
113
|
+
- TC-XXX: mapped in COVERAGE-MAPPING.md but spec function not found
|
|
114
|
+
|
|
115
|
+
## Decisions Log
|
|
116
|
+
|
|
117
|
+
- YYYY-MM-DD: Classified TC-XXX as Category F — save endpoint returns 500 on duplicate. DEF-001 filed.
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## EXEC_IDX Collision Note
|
|
123
|
+
|
|
124
|
+
Two runs within the same 60-second window produce identical `EXEC_IDX` values. For fields requiring guaranteed uniqueness:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
const EXEC_IDX = Math.floor(Date.now() / 60_000) % 100_000;
|
|
128
|
+
const RUN_SALT = Math.floor(Math.random() * 9999).toString().padStart(4, '0');
|
|
129
|
+
const uniqueName = `Test-${EXEC_IDX}-${RUN_SALT}`;
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Post-Stabilization Artifact Updates
|
|
135
|
+
|
|
136
|
+
1. **Category G found** → update `05-test-scenarios.md` with `[REVISED - {date}]`
|
|
137
|
+
2. **Category F found** → create `qa/06-defects/open/DEF-{NNN}.md` per bug
|
|
138
|
+
3. **COVERAGE-MAPPING.md** → update Status column for all TCs:
|
|
139
|
+
- `Automated` — ✅ High confidence
|
|
140
|
+
- `Skipped-Defect` — skipped with DEF reference
|
|
141
|
+
- `Skipped-Infra` — environment limitation
|
|
142
|
+
- `Manual` — intentionally not automated
|