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,121 @@
|
|
|
1
|
+
# Cypress Configuration
|
|
2
|
+
|
|
3
|
+
## cypress.config.ts
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { defineConfig } from 'cypress';
|
|
7
|
+
|
|
8
|
+
export default defineConfig({
|
|
9
|
+
e2e: {
|
|
10
|
+
baseUrl: 'https://app.example.com',
|
|
11
|
+
viewportWidth: 1280,
|
|
12
|
+
viewportHeight: 720,
|
|
13
|
+
video: true,
|
|
14
|
+
screenshotOnRunFailure: true,
|
|
15
|
+
retries: {
|
|
16
|
+
runMode: 2,
|
|
17
|
+
openMode: 0,
|
|
18
|
+
},
|
|
19
|
+
setupNodeEvents(on, config) {
|
|
20
|
+
// implement node event listeners here
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
component: {
|
|
24
|
+
devServer: {
|
|
25
|
+
framework: 'react',
|
|
26
|
+
bundler: 'vite',
|
|
27
|
+
},
|
|
28
|
+
specPattern: 'src/**/*.cy.{ts,tsx}',
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Key Options
|
|
36
|
+
|
|
37
|
+
| Option | Description | Example |
|
|
38
|
+
|--------|-------------|---------|
|
|
39
|
+
| `baseUrl` | Base URL for `cy.visit()` | `'https://staging.example.com'` |
|
|
40
|
+
| `viewportWidth` / `viewportHeight` | Default viewport size | `1280`, `720` |
|
|
41
|
+
| `video` | Record video of runs | `true` / `false` |
|
|
42
|
+
| `screenshotOnRunFailure` | Capture screenshot on failure | `true` |
|
|
43
|
+
| `retries` | Retry failed tests (runMode for CI, openMode for UI) | `{ runMode: 2, openMode: 0 }` |
|
|
44
|
+
| `defaultCommandTimeout` | Timeout for commands (ms) | `4000` |
|
|
45
|
+
| `pageLoadTimeout` | Timeout for page load (ms) | `60000` |
|
|
46
|
+
| `requestTimeout` | Timeout for `cy.request()` (ms) | `5000` |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Environment Variables
|
|
51
|
+
|
|
52
|
+
### In cypress.config.ts
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
export default defineConfig({
|
|
56
|
+
env: {
|
|
57
|
+
apiUrl: 'https://api.example.com',
|
|
58
|
+
testUser: 'qa@example.com',
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Usage in Tests
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
cy.log(Cypress.env('apiUrl'));
|
|
67
|
+
cy.request(Cypress.env('apiUrl') + '/health');
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Override via CLI
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
cypress run --env apiUrl=https://staging-api.example.com
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Plugins (setupNodeEvents)
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
setupNodeEvents(on, config) {
|
|
82
|
+
on('task', {
|
|
83
|
+
log(message) {
|
|
84
|
+
console.log(message);
|
|
85
|
+
return null;
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
return config;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Support Files
|
|
95
|
+
|
|
96
|
+
| File | Purpose |
|
|
97
|
+
|------|---------|
|
|
98
|
+
| `cypress/support/e2e.ts` | Runs before every E2E spec (imports, global config) |
|
|
99
|
+
| `cypress/support/commands.ts` | Custom commands |
|
|
100
|
+
| `cypress/support/component.ts` | Runs before component specs |
|
|
101
|
+
|
|
102
|
+
### e2e.ts Example
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import './commands';
|
|
106
|
+
|
|
107
|
+
beforeEach(() => {
|
|
108
|
+
cy.intercept('GET', '/api/config', { fixture: 'config.json' });
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Component Testing Dev Server
|
|
115
|
+
|
|
116
|
+
| Framework | Config |
|
|
117
|
+
|-----------|--------|
|
|
118
|
+
| React + Vite | `framework: 'react', bundler: 'vite'` |
|
|
119
|
+
| Vue + Vite | `framework: 'vue', bundler: 'vite'` |
|
|
120
|
+
| Angular | `framework: 'angular', bundler: '@angular-devkit/build-angular'` |
|
|
121
|
+
| Svelte | `framework: 'svelte', bundler: 'vite'` |
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Cypress Test Patterns
|
|
2
|
+
|
|
3
|
+
## E2E Flows
|
|
4
|
+
|
|
5
|
+
### Basic Page Visit and Interaction
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
describe('Login flow', () => {
|
|
9
|
+
it('logs in successfully', () => {
|
|
10
|
+
cy.visit('/login');
|
|
11
|
+
cy.get('[data-cy="email-input"]').type('user@example.com');
|
|
12
|
+
cy.get('[data-cy="password-input"]').type('secret');
|
|
13
|
+
cy.get('[data-cy="submit-btn"]').click();
|
|
14
|
+
cy.url().should('include', '/dashboard');
|
|
15
|
+
cy.contains('Welcome').should('be.visible');
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Chained Commands and Retry-ability
|
|
21
|
+
|
|
22
|
+
Cypress automatically retries commands until assertions pass or timeout:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
cy.get('[data-cy="loading"]').should('not.exist');
|
|
26
|
+
cy.get('[data-cy="results"]').should('be.visible').and('contain', 'Success');
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Time-Travel Debugging
|
|
30
|
+
|
|
31
|
+
Use `.pause()` or Cypress UI to step through commands and inspect DOM at each step.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Component Testing
|
|
36
|
+
|
|
37
|
+
### React with cy.mount()
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { mount } from 'cypress/react18';
|
|
41
|
+
import { Button } from './Button';
|
|
42
|
+
|
|
43
|
+
describe('Button', () => {
|
|
44
|
+
it('calls onClick when clicked', () => {
|
|
45
|
+
const onClick = cy.stub();
|
|
46
|
+
cy.mount(<Button label="Submit" onClick={onClick} />);
|
|
47
|
+
cy.get('[data-cy="button"]').click();
|
|
48
|
+
cy.wrap(onClick).should('have.been.calledOnce');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('renders with custom props', () => {
|
|
52
|
+
cy.mount(<Button label="Save" disabled />);
|
|
53
|
+
cy.get('[data-cy="button"]').should('be.disabled');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Vue with cy.mount()
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { mount } from 'cypress/vue';
|
|
62
|
+
import HelloWorld from './HelloWorld.vue';
|
|
63
|
+
|
|
64
|
+
describe('HelloWorld', () => {
|
|
65
|
+
it('emits event on click', () => {
|
|
66
|
+
cy.mount(HelloWorld, { props: { msg: 'Hello' } });
|
|
67
|
+
cy.get('button').click();
|
|
68
|
+
cy.get('@emitSpy').should('have.been.calledWith', 'greet');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Slots and Events
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
cy.mount(Component, {
|
|
77
|
+
props: { title: 'Test' },
|
|
78
|
+
slots: { default: '<span>Slot content</span>' },
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Custom Commands
|
|
85
|
+
|
|
86
|
+
### Defining Commands (cypress/support/commands.ts)
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
Cypress.Commands.add('login', (email: string, password: string) => {
|
|
90
|
+
cy.session([email, password], () => {
|
|
91
|
+
cy.visit('/login');
|
|
92
|
+
cy.get('[data-cy="email-input"]').type(email);
|
|
93
|
+
cy.get('[data-cy="password-input"]').type(password);
|
|
94
|
+
cy.get('[data-cy="submit-btn"]').click();
|
|
95
|
+
cy.url().should('include', '/dashboard');
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
Cypress.Commands.add('fillForm', (selector: string, data: Record<string, string>) => {
|
|
100
|
+
Object.entries(data).forEach(([name, value]) => {
|
|
101
|
+
cy.get(`${selector} [data-cy="${name}"]`).clear().type(value);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Using Custom Commands
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
beforeEach(() => {
|
|
110
|
+
cy.login('user@example.com', 'password');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('creates a new item', () => {
|
|
114
|
+
cy.visit('/items/new');
|
|
115
|
+
cy.fillForm('[data-cy="item-form"]', { name: 'Item 1', description: 'Desc' });
|
|
116
|
+
cy.get('[data-cy="save-btn"]').click();
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Fixtures
|
|
123
|
+
|
|
124
|
+
### Loading Fixtures
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
cy.fixture('users.json').then((users) => {
|
|
128
|
+
cy.get('[data-cy="user-select"]').select(users[0].name);
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### With cy.intercept
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
cy.fixture('users.json').as('users');
|
|
136
|
+
cy.intercept('GET', '/api/users', { fixture: 'users.json' }).as('getUsers');
|
|
137
|
+
cy.visit('/users');
|
|
138
|
+
cy.wait('@getUsers');
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Aliases and cy.wait(@alias)
|
|
144
|
+
|
|
145
|
+
### Request Aliases
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
cy.intercept('POST', '/api/orders').as('createOrder');
|
|
149
|
+
cy.get('[data-cy="checkout"]').click();
|
|
150
|
+
cy.wait('@createOrder').its('response.statusCode').should('eq', 201);
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Fixture Aliases
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
cy.fixture('order.json').as('orderData');
|
|
157
|
+
cy.get('@orderData').then((data) => {
|
|
158
|
+
cy.get('[data-cy="order-id"]').type(data.id);
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Assertions in E2E
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
cy.get('[data-cy="count"]').should('have.text', '5');
|
|
168
|
+
cy.get('form').should('have.class', 'valid');
|
|
169
|
+
cy.get('[data-cy="list"]').find('li').should('have.length', 3);
|
|
170
|
+
```
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa-data-factory
|
|
3
|
+
description: Generate realistic test data using fixtures, factory patterns, and faker-based seeds for consistent and reproducible test environments.
|
|
4
|
+
output_dir: data/fixtures
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# QA Data Factory
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Generate realistic, consistent, and reproducible test data for automated and manual testing. Supports fixtures (static JSON/YAML), factory patterns (dynamic generation with overrides), faker-based seeds (realistic random data), and builder patterns (fluent API for complex objects). Produces fixtures, factory classes, seed scripts, and data cleanup utilities.
|
|
12
|
+
|
|
13
|
+
## Trigger Phrases
|
|
14
|
+
|
|
15
|
+
- "Generate test data for [entity type]"
|
|
16
|
+
- "Create fixtures for [Users/Products/Orders]"
|
|
17
|
+
- "Factory pattern for test data"
|
|
18
|
+
- "Faker-based seed data"
|
|
19
|
+
- "Test data builder for [complex object]"
|
|
20
|
+
- "Realistic test data with locale [en_US/de_DE]"
|
|
21
|
+
- "Seed script for test database"
|
|
22
|
+
- "Data cleanup utilities for tests"
|
|
23
|
+
|
|
24
|
+
## Data Generation Approaches
|
|
25
|
+
|
|
26
|
+
| Approach | Use Case | Output |
|
|
27
|
+
|----------|----------|--------|
|
|
28
|
+
| **Fixtures** | Static, version-controlled data; predictable | JSON, YAML, CSV files |
|
|
29
|
+
| **Factory pattern** | Dynamic generation with overrides; per-test customization | Factory classes (TypeScript/Python) |
|
|
30
|
+
| **Faker-based seeds** | Realistic but random; locale-aware | Seed scripts, inline generation |
|
|
31
|
+
| **Builder pattern** | Complex nested objects; fluent API | Builder classes |
|
|
32
|
+
|
|
33
|
+
See `references/factory-patterns.md` for implementation details.
|
|
34
|
+
|
|
35
|
+
## TypeScript Tools
|
|
36
|
+
|
|
37
|
+
| Tool | Purpose |
|
|
38
|
+
|------|---------|
|
|
39
|
+
| **@faker-js/faker** | Realistic random data (names, emails, addresses, dates) |
|
|
40
|
+
| **fishery** | Factory pattern with sequences and traits |
|
|
41
|
+
| **factory.ts** | TypeScript factories with associations |
|
|
42
|
+
| **Test data builders** | Fluent API for complex objects |
|
|
43
|
+
|
|
44
|
+
## Python Tools
|
|
45
|
+
|
|
46
|
+
| Tool | Purpose |
|
|
47
|
+
|------|---------|
|
|
48
|
+
| **Faker** | Realistic random data; locale support |
|
|
49
|
+
| **factory_boy** | Factory pattern with sequences, subfactories |
|
|
50
|
+
| **pytest-factoryboy** | Pytest integration; fixtures from factories |
|
|
51
|
+
| **model_bakery** | Django model factories; minimal boilerplate |
|
|
52
|
+
|
|
53
|
+
See `references/faker-guide.md` for usage patterns.
|
|
54
|
+
|
|
55
|
+
## Data Types Supported
|
|
56
|
+
|
|
57
|
+
| Type | Examples | Locale-aware |
|
|
58
|
+
|------|----------|--------------|
|
|
59
|
+
| **Users** | name, email, username, password hash | Yes (names, formats) |
|
|
60
|
+
| **Products** | SKU, title, price, category | Yes (currency, formats) |
|
|
61
|
+
| **Orders** | order ID, items, totals, status | Yes (dates, currency) |
|
|
62
|
+
| **Addresses** | street, city, postal code, country | Yes |
|
|
63
|
+
| **Payment info** | card numbers (test), expiry, CVV | Test card patterns |
|
|
64
|
+
| **Dates** | birthdate, created_at, expiry | Yes (formats) |
|
|
65
|
+
| **Emails** | valid format, domain | Yes |
|
|
66
|
+
| **Names** | first, last, full | Yes (locale-specific) |
|
|
67
|
+
|
|
68
|
+
## Output Artifacts
|
|
69
|
+
|
|
70
|
+
1. **Test data fixtures** — Static JSON/YAML/CSV for predictable scenarios
|
|
71
|
+
2. **Factory classes** — TypeScript or Python factories with overrides
|
|
72
|
+
3. **Seed scripts** — Scripts to populate test DB with faker data
|
|
73
|
+
4. **Data cleanup utilities** — Teardown scripts, truncate/reset helpers
|
|
74
|
+
|
|
75
|
+
## Workflow
|
|
76
|
+
|
|
77
|
+
1. **Identify data needs** — Entity types, required fields, relationships
|
|
78
|
+
2. **Choose approach** — Fixtures vs factory vs faker based on use case
|
|
79
|
+
3. **Select tools** — Match project stack (TS/Python, framework)
|
|
80
|
+
4. **Generate artifacts** — Fixtures, factories, seed scripts
|
|
81
|
+
5. **Add cleanup** — Teardown for isolation between test runs
|
|
82
|
+
|
|
83
|
+
## Scope
|
|
84
|
+
|
|
85
|
+
**Can do (autonomous):**
|
|
86
|
+
- Generate fixtures, factories, seed scripts for specified entities
|
|
87
|
+
- Use Faker/faker-js for realistic locale-aware data
|
|
88
|
+
- Produce TypeScript (fishery, factory.ts) and Python (factory_boy, Faker) code
|
|
89
|
+
- Create data cleanup utilities
|
|
90
|
+
- Reference factory-patterns and faker-guide
|
|
91
|
+
|
|
92
|
+
**Cannot do (requires confirmation):**
|
|
93
|
+
- Add new dependencies without approval
|
|
94
|
+
- Modify production schemas or migrations
|
|
95
|
+
- Generate data for proprietary/restricted formats
|
|
96
|
+
|
|
97
|
+
**Will not do (out of scope):**
|
|
98
|
+
- Execute seed scripts or modify databases directly
|
|
99
|
+
- Generate production data or PII
|
|
100
|
+
- Bypass data validation or security constraints
|
|
101
|
+
|
|
102
|
+
## References
|
|
103
|
+
|
|
104
|
+
| Topic | File |
|
|
105
|
+
|-------|------|
|
|
106
|
+
| Factory pattern implementations (TS, Python) | `references/factory-patterns.md` |
|
|
107
|
+
| Faker library usage for realistic data | `references/faker-guide.md` |
|
|
108
|
+
|
|
109
|
+
## Quality Checklist
|
|
110
|
+
|
|
111
|
+
- [ ] Generated data matches entity schema/contract
|
|
112
|
+
- [ ] Locale specified when names/addresses/formats matter
|
|
113
|
+
- [ ] No real PII or production-like secrets
|
|
114
|
+
- [ ] Fixtures are deterministic; faker seeds use configurable seed for reproducibility
|
|
115
|
+
- [ ] Cleanup utilities included for test isolation
|
|
116
|
+
- [ ] Factory overrides documented for common scenarios
|
|
117
|
+
|
|
118
|
+
## Troubleshooting
|
|
119
|
+
|
|
120
|
+
| Symptom | Likely Cause | Fix |
|
|
121
|
+
|---------|--------------|-----|
|
|
122
|
+
| Data conflicts between tests | Shared state; no cleanup | Add teardown; use unique IDs/emails per test |
|
|
123
|
+
| Unrealistic data | Default faker; wrong locale | Set locale; use appropriate faker providers |
|
|
124
|
+
| Factory too verbose | Over-specification | Use sensible defaults; override only when needed |
|
|
125
|
+
| Seed non-reproducible | Random seed not set | Use faker.seed(123) or equivalent |
|
|
126
|
+
| Schema mismatch | Generated fields don't match API/DB | Align with OpenAPI/DB schema; validate output |
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Factory Pattern Implementations for Test Data
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Factory patterns enable dynamic generation of test data with sensible defaults and per-test overrides. This document covers TypeScript and Python implementations.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## TypeScript: fishery
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { Factory } from 'fishery';
|
|
13
|
+
import type { User } from '../types';
|
|
14
|
+
|
|
15
|
+
export const UserFactory = Factory.define<User>(({ sequence }) => ({
|
|
16
|
+
id: sequence,
|
|
17
|
+
email: `user${sequence}@example.com`,
|
|
18
|
+
name: `User ${sequence}`,
|
|
19
|
+
createdAt: new Date(),
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
// Usage
|
|
23
|
+
const user = UserFactory.build();
|
|
24
|
+
const admin = UserFactory.build({ role: 'admin' });
|
|
25
|
+
const users = UserFactory.buildList(5);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Traits
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
export const UserFactory = Factory.define<User>(({ sequence, traits }) => ({
|
|
32
|
+
id: sequence,
|
|
33
|
+
email: `user${sequence}@example.com`,
|
|
34
|
+
name: `User ${sequence}`,
|
|
35
|
+
role: 'user',
|
|
36
|
+
})).trait('admin', { role: 'admin' })
|
|
37
|
+
.trait('inactive', { status: 'inactive' });
|
|
38
|
+
|
|
39
|
+
// Usage
|
|
40
|
+
const admin = UserFactory.build({}, { traits: ['admin'] });
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## TypeScript: factory.ts
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { factory } from 'factory.ts';
|
|
49
|
+
import type { Product } from '../types';
|
|
50
|
+
|
|
51
|
+
export const ProductFactory = factory.make<Product>(s => ({
|
|
52
|
+
id: s.sequence(),
|
|
53
|
+
sku: `SKU-${s.sequence()}`,
|
|
54
|
+
title: `Product ${s.sequence()}`,
|
|
55
|
+
price: 9.99,
|
|
56
|
+
inStock: true,
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
// Usage
|
|
60
|
+
const product = ProductFactory.build();
|
|
61
|
+
const expensive = ProductFactory.build({ price: 999 });
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Python: factory_boy
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
import factory
|
|
70
|
+
from myapp.models import User
|
|
71
|
+
|
|
72
|
+
class UserFactory(factory.Factory):
|
|
73
|
+
class Meta:
|
|
74
|
+
model = User
|
|
75
|
+
|
|
76
|
+
id = factory.Sequence(lambda n: n)
|
|
77
|
+
email = factory.Sequence(lambda n: f'user{n}@example.com')
|
|
78
|
+
name = factory.Sequence(lambda n: f'User {n}')
|
|
79
|
+
role = 'user'
|
|
80
|
+
|
|
81
|
+
# Usage
|
|
82
|
+
user = UserFactory()
|
|
83
|
+
admin = UserFactory(role='admin')
|
|
84
|
+
users = UserFactory.create_batch(5)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Subfactories and LazyAttribute
|
|
88
|
+
|
|
89
|
+
```python
|
|
90
|
+
class OrderFactory(factory.Factory):
|
|
91
|
+
class Meta:
|
|
92
|
+
model = Order
|
|
93
|
+
|
|
94
|
+
user = factory.SubFactory(UserFactory)
|
|
95
|
+
total = factory.LazyAttribute(lambda o: sum(i.price for i in o.items))
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Python: pytest-factoryboy
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
# conftest.py
|
|
104
|
+
import pytest
|
|
105
|
+
from .factories import UserFactory
|
|
106
|
+
|
|
107
|
+
@pytest.fixture
|
|
108
|
+
def user(db):
|
|
109
|
+
return UserFactory()
|
|
110
|
+
|
|
111
|
+
@pytest.fixture
|
|
112
|
+
def admin_user(db):
|
|
113
|
+
return UserFactory(role='admin')
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Builder Pattern (TypeScript)
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
class UserBuilder {
|
|
122
|
+
private data: Partial<User> = {};
|
|
123
|
+
|
|
124
|
+
withId(id: number) {
|
|
125
|
+
this.data.id = id;
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
withEmail(email: string) {
|
|
129
|
+
this.data.email = email;
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
132
|
+
asAdmin() {
|
|
133
|
+
this.data.role = 'admin';
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
build(): User {
|
|
137
|
+
return { id: 1, email: 'default@example.com', role: 'user', ...this.data };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Usage
|
|
142
|
+
const user = new UserBuilder().withEmail('test@example.com').asAdmin().build();
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Builder Pattern (Python)
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
class UserBuilder:
|
|
151
|
+
def __init__(self):
|
|
152
|
+
self._data = {}
|
|
153
|
+
|
|
154
|
+
def with_email(self, email: str):
|
|
155
|
+
self._data['email'] = email
|
|
156
|
+
return self
|
|
157
|
+
|
|
158
|
+
def as_admin(self):
|
|
159
|
+
self._data['role'] = 'admin'
|
|
160
|
+
return self
|
|
161
|
+
|
|
162
|
+
def build(self) -> dict:
|
|
163
|
+
return {'id': 1, 'email': 'default@example.com', 'role': 'user', **self._data}
|
|
164
|
+
```
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Faker Library Usage Guide for Realistic Test Data
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Faker libraries generate realistic-looking random data for names, addresses, emails, dates, and more. Support for multiple locales ensures culturally appropriate data.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## TypeScript: @faker-js/faker
|
|
10
|
+
|
|
11
|
+
### Basic Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { faker } from '@faker-js/faker';
|
|
15
|
+
|
|
16
|
+
// Names
|
|
17
|
+
faker.person.fullName(); // "John Doe"
|
|
18
|
+
faker.person.firstName(); // "Jane"
|
|
19
|
+
faker.internet.email(); // "john.doe@example.com"
|
|
20
|
+
|
|
21
|
+
// Addresses
|
|
22
|
+
faker.location.streetAddress();
|
|
23
|
+
faker.location.city();
|
|
24
|
+
faker.location.country();
|
|
25
|
+
|
|
26
|
+
// Dates
|
|
27
|
+
faker.date.past();
|
|
28
|
+
faker.date.between({ from: '2020-01-01', to: '2024-12-31' });
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Locale
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { faker } from '@faker-js/faker/locale/de';
|
|
35
|
+
|
|
36
|
+
faker.person.fullName(); // German names
|
|
37
|
+
faker.location.city(); // German cities
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Reproducibility (Seed)
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
faker.seed(12345);
|
|
44
|
+
const name1 = faker.person.fullName();
|
|
45
|
+
faker.seed(12345);
|
|
46
|
+
const name2 = faker.person.fullName();
|
|
47
|
+
// name1 === name2
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Common Providers
|
|
51
|
+
|
|
52
|
+
| Provider | Example |
|
|
53
|
+
|----------|---------|
|
|
54
|
+
| `faker.person.*` | fullName, firstName, lastName |
|
|
55
|
+
| `faker.internet.*` | email, userName, url |
|
|
56
|
+
| `faker.finance.*` | creditCardNumber, iban (test patterns) |
|
|
57
|
+
| `faker.commerce.*` | productName, price, department |
|
|
58
|
+
| `faker.string.uuid()` | UUID |
|
|
59
|
+
| `faker.number.int({ min, max })` | Bounded integers |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Python: Faker
|
|
64
|
+
|
|
65
|
+
### Basic Usage
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
from faker import Faker
|
|
69
|
+
|
|
70
|
+
fake = Faker()
|
|
71
|
+
|
|
72
|
+
# Names
|
|
73
|
+
fake.name()
|
|
74
|
+
fake.first_name()
|
|
75
|
+
fake.last_name()
|
|
76
|
+
|
|
77
|
+
# Emails and internet
|
|
78
|
+
fake.email()
|
|
79
|
+
fake.user_name()
|
|
80
|
+
fake.url()
|
|
81
|
+
|
|
82
|
+
# Addresses
|
|
83
|
+
fake.street_address()
|
|
84
|
+
fake.city()
|
|
85
|
+
fake.country()
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Locale
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
fake_de = Faker('de_DE')
|
|
92
|
+
fake_de.name() # German names
|
|
93
|
+
fake_de.city() # German cities
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Reproducibility (Seed)
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
Faker.seed(12345)
|
|
100
|
+
name1 = fake.name()
|
|
101
|
+
Faker.seed(12345)
|
|
102
|
+
name2 = fake.name()
|
|
103
|
+
# name1 == name2
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Common Providers
|
|
107
|
+
|
|
108
|
+
| Provider | Example |
|
|
109
|
+
|----------|---------|
|
|
110
|
+
| `fake.name()`, `fake.first_name()` | Names |
|
|
111
|
+
| `fake.email()`, `fake.user_name()` | Internet |
|
|
112
|
+
| `fake.street_address()`, `fake.city()` | Addresses |
|
|
113
|
+
| `fake.credit_card_number()` | Test card numbers |
|
|
114
|
+
| `fake.uuid4()` | UUID |
|
|
115
|
+
| `fake.date_between()`, `fake.date_time_between()` | Dates |
|
|
116
|
+
| `fake.random_int(min=1, max=100)` | Integers |
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Test Card Numbers
|
|
121
|
+
|
|
122
|
+
Use provider-specific test patterns (e.g., 4111... for Visa test cards). Never use real card numbers.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Best Practices
|
|
127
|
+
|
|
128
|
+
1. **Set seed** for reproducible test runs when debugging.
|
|
129
|
+
2. **Use locale** when testing i18n or region-specific formats.
|
|
130
|
+
3. **Avoid PII** — generated data should not resemble real people.
|
|
131
|
+
4. **Unique identifiers** — use sequences or UUIDs when uniqueness matters.
|