Inteligentne testowanie kontraktów
Generuj kompleksowe testy API ze specyfikacji OpenAPI z automatycznym odkrywaniem przypadków brzegowych i wykrywaniem zmian łamiących
Przekształć testowanie API z ręcznej walidacji w inteligentną automatyzację. Dowiedz się, jak używać Cursor i Claude Code do generowania kompleksowych zestawów testów, walidacji kontraktów, analizy wydajności i zabezpieczania API poprzez prompty w języku naturalnym i przepływy pracy wspierane przez AI.
Nowoczesne aplikacje opierają się na niezliczonych interakcjach API. Tradycyjne podejścia testowe nie radzą sobie ze złożonością, podczas gdy testowanie wspierane przez AI przekształca wyzwania w możliwości:
Inteligentne testowanie kontraktów
Generuj kompleksowe testy API ze specyfikacji OpenAPI z automatycznym odkrywaniem przypadków brzegowych i wykrywaniem zmian łamiących
Walidacja wydajności
Twórz realistyczne testy obciążeniowe, które dostosowują się do wzorców produkcyjnych i identyfikują wąskie gardła zanim wpłyną na użytkowników
Automatyzacja bezpieczeństwa
Implementuj ciągłe testowanie bezpieczeństwa z walidacją OWASP API Top 10 i inteligentnym skanowaniem luk
Testowanie oparte na danych
Generuj realistyczne dane testowe respektujące ograniczenia i relacje przy zachowaniu zgodności z prywatnością
Prompt: “Wygeneruj kompleksowe testy API z naszej specyfikacji OpenAPI z pełnym pokryciem i walidacją bezpieczeństwa.”
// Tryb agenta: Generuj kompleksowy zestaw testów APIAgent: "Przeanalizuj naszą specyfikację OpenAPI i utwórz testy, które:- Pokrywają wszystkie punkty końcowe ze scenariuszami pozytywnymi i negatywnymi- Włączają testowanie uwierzytelniania i autoryzacji- Dodają testy ograniczania szybkości i granic błędów- Generują realistyczne dane testowe dla każdego punktu końcowego- Walidują schematy odpowiedzi i kody statusu"
// AI generuje kompletny zestaw testówdescribe('API zarządzania użytkownikami', () => { describe('POST /api/users', () => { it('creates user with valid data', async () => { const userData = { email: 'test@example.com', name: 'Test User', role: 'user' };
const response = await request(app) .post('/api/users') .send(userData) .expect(201);
expect(response.body).toMatchObject({ id: expect.any(String), ...userData, createdAt: expect.any(String) }); });
// AI dodaje kompleksowe przypadki brzegowe it('handles duplicate email gracefully', async () => { await request(app) .post('/api/users') .send({ email: 'duplicate@test.com', name: 'User One' }) .expect(201);
await request(app) .post('/api/users') .send({ email: 'duplicate@test.com', name: 'User Two' }) .expect(409) .expect(res => { expect(res.body.error).toContain('already exists'); }); }); });});
# Generuj kompleksowy zestaw testów APIclaude "Utwórz testy API dla naszej platformy e-commerce:
Wymagania:- Testuj wszystkie punkty końcowe REST (produkty, zamówienia, użytkownicy, płatności)- Włącz przepływy uwierzytelniania (JWT, OAuth)- Dodaj walidację ograniczania szybkości- Testuj scenariusze błędów i przypadki brzegowe- Generuj realistyczne dane testowe- Włącz benchmarki wydajności- Waliduj zgodność ze specyfikacją OpenAPI"
# Claude analizuje bazę kodu i generuje:# tests/api/# ├── auth.test.js # Przepływy uwierzytelniania# ├── products.test.js # Operacje CRUD produktów# ├── orders.test.js # Przetwarzanie zamówień# ├── payments.test.js # Walidacja płatności# ├── fixtures/ # Generatory danych testowych# └── helpers/ # Wspólne narzędzia testowe
Prompt: “Skonfiguruj testowanie kontraktów między naszymi mikroserwisami, aby zapobiec zmianom łamiącym i zapewnić kompatybilność API.”
// Tryb agenta: Konfiguracja testowania kontraktówAgent: "Utwórz testy kontraktów napędzane przez konsumenta dla naszych mikroserwisów:
1. Konsument: Aplikacja frontendowa → Dostawca: Serwis użytkowników2. Konsument: Serwis zamówień → Dostawca: Serwis płatności3. Konsument: Serwis powiadomień → Dostawca: Serwis użytkowników
Włącz:- Wszystkie krytyczne interakcje API- Walidację żądań/odpowiedzi- Zarządzanie stanem dla danych testowych- Wykrywanie zmian łamiących- Integrację CI/CD"
// AI generuje testy kontraktów Pactconst { pactWith } = require('jest-pact');const { UserService } = require('../services/UserService');
pactWith({ consumer: 'Frontend', provider: 'UserService' }, provider => { describe('API użytkowników', () => { beforeEach(() => { const interaction = { state: 'user exists', uponReceiving: 'a request for user details', withRequest: { method: 'GET', path: '/api/users/123', headers: { 'Authorization': 'Bearer some-token' } }, willRespondWith: { status: 200, headers: { 'Content-Type': 'application/json' }, body: { id: '123', name: 'John Doe', email: 'john@example.com' } } };
return provider.addInteraction(interaction); });
it('returns user details', async () => { const user = await UserService.getUser('123'); expect(user).toEqual({ id: '123', name: 'John Doe', email: 'john@example.com' }); }); });});
</TabItem><TabItem label="Claude Code">```bash# Skonfiguruj kompleksowe testowanie kontraktówclaude "Implementuj testowanie kontraktów dla naszej architektury mikroserwisów:
Todo:- [ ] Skonfiguruj brokера Pact do przechowywania kontraktów- [ ] Utwórz testy konsumentów dla każdej zależności serwisu- [ ] Skonfiguruj weryfikację dostawców w CI/CD- [ ] Dodaj wykrywanie zmian łamiących- [ ] Skonfiguruj przepływy pracy ewolucji kontraktów- [ ] Utwórz dokumentację procesu testowania kontraktów
Serwisy do testowania:- Serwis użytkowników (dostarcza dane użytkowników)- Serwis płatności (przetwarza płatności)- Serwis zamówień (zarządza zamówieniami)- Serwis powiadomień (wysyła alerty)
Zapewnij kompatybilność wsteczną i strategie migracji."
# Claude konfiguruje kompletny potok testowania kontraktów
Prompt: “Przeanalizuj zmiany schematów naszego API i wykryj potencjalne zmiany łamiące przed wdrożeniem.”
// Wykrywanie zmian łamiących wspierane przez AIAgent: "Porównaj nasze schematy API i zidentyfikuj zmiany łamiące:
1. Przeanalizuj obecne vs nowe specyfikacje OpenAPI2. Wykryj zmiany łamiące (usunięte pola, zmiany typów)3. Oceń wpływ na istniejących konsumentów4. Zasugeruj strategie migracji5. Wygeneruj testy kompatybilności"
// AI generuje analizę zmian łamiącychconst { detectBreakingChanges } = require('./schema-analyzer');
async function validateApiChanges() { const analysis = await detectBreakingChanges({ currentSchema: './openapi/v1.yaml', newSchema: './openapi/v2.yaml', consumers: [ 'mobile-app', 'web-frontend', 'partner-integrations' ] });
if (analysis.hasBreakingChanges) { console.log('⚠️ Wykryto zmiany łamiące:'); analysis.breakingChanges.forEach(change => { console.log(`- ${change.type}: ${change.description}`); console.log(` Wpływ: ${change.impact}`); console.log(` Dotknięci konsumenci: ${change.affectedConsumers.join(', ')}`); console.log(` Migracja: ${change.migrationStrategy}`); }); }
return analysis.isBackwardCompatible;}
// AI zapewnia kompatybilność wersji APIAgent: "Testuj kompatybilność wsteczną między wersjami API:
- Testuj, czy punkty końcowe v1 nadal działają ze zmianami v2- Waliduj wzorce graceful degradation- Sprawdź obsługę nagłówków wersji- Testuj implementacje flag funkcji"
describe('Kompatybilność wersji API', () => { const versions = ['v1', 'v2', 'v3'];
versions.forEach(version => { describe(`Wersja ${version}`, () => { it('maintains backward compatibility', async () => { // Testuj krytyczne punkty końcowe w wersjach const criticalEndpoints = [ '/api/users', '/api/orders', '/api/payments' ];
for (const endpoint of criticalEndpoints) { const response = await request(app) .get(endpoint) .set('API-Version', version) .expect(200);
// Waliduj, że struktura odpowiedzi nie została złamana expect(response.body).toHaveProperty('data'); expect(response.body).toHaveProperty('meta'); } });
it('handles version negotiation gracefully', async () => { // Testuj obsługę nieobsługiwanej wersji await request(app) .get('/api/users') .set('API-Version', 'v999') .expect(400) .expect(res => { expect(res.body.error).toContain('unsupported version'); }); }); }); });});
// Inteligentne testowanie obciążenia z AIclass AILoadTester { async generateLoadScenarios(apiSpec: OpenAPISpec) { // AI analizuje API, aby stworzyć realistyczne wzorce obciążenia const patterns = await ai.analyzeProductionTraffic({ logs: await this.getAccessLogs(), duration: '30d', identify: ['peak_hours', 'user_journeys', 'geographic_distribution'] });
return { scenarios: patterns.map(pattern => ({ name: pattern.name, executor: ai.selectExecutor(pattern), startTime: pattern.timing,
// AI generuje realistycznych użytkowników wirtualnych vus: ai.calculateVirtualUsers({ pattern, targetLoad: pattern.expectedLoad, rampUp: pattern.rampUpStrategy }),
// AI tworzy scenariusze testowe exec: ai.generateLoadTest({ endpoints: pattern.endpoints, dataVariation: pattern.dataPatterns, thinkTime: pattern.userBehavior.thinkTime, sessionLength: pattern.userBehavior.sessionDuration }) })),
// AI ustawia progi wydajności thresholds: ai.generateThresholds({ sla: await this.getSLARequirements(), historical: await this.getHistoricalPerformance(), businessCritical: await this.getCriticalEndpoints() }) }; }
async runIntelligentLoadTest() { const scenarios = await this.generateLoadScenarios();
// AI monitoruje i dostosowuje podczas testu const monitor = ai.createAdaptiveMonitor({ adjustLoad: true, detectAnomalies: true, predictFailures: true });
const results = await k6.run({ scenarios,
// AI dostosowuje obciążenie na podstawie odpowiedzi systemu extensions: { adaptive: monitor.adapt.bind(monitor) } });
// AI analizuje wyniki return ai.analyzePerformanceResults({ results, identifyBottlenecks: true, suggestOptimizations: true, predictScalability: true }); }}
// Monitorowanie wydajności API wspierane przez AIclass APIPerformanceMonitor { async setupIntelligentMonitoring() { return { // AI uczy się normalnych wzorców baseline: await ai.establishPerformanceBaseline({ duration: '7d', endpoints: await this.getAllEndpoints(), metrics: ['latency', 'throughput', 'error_rate', 'cpu', 'memory'] }),
// AI wykrywa anomalie anomalyDetection: ai.createAnomalyDetector({ sensitivity: 'high', algorithms: ['isolation_forest', 'lstm', 'prophet'], alertThreshold: 0.95 }),
// AI przewiduje problemy prediction: ai.createPredictor({ models: ['time_series', 'regression', 'neural_network'], horizons: ['5m', '1h', '24h'], features: ['time', 'load', 'errors', 'dependencies'] }) }; }
async handlePerformanceAnomaly(anomaly: Anomaly) { // AI diagnozuje problem const diagnosis = await ai.diagnosePerformanceIssue({ anomaly, logs: await this.getRecentLogs(anomaly.timeRange), metrics: await this.getMetrics(anomaly.timeRange), traces: await this.getDistributedTraces(anomaly.traceIds) });
// AI sugeruje naprawę const remediation = await ai.suggestRemediation({ diagnosis, previousIncidents: await this.getSimilarIncidents(diagnosis), systemCapabilities: await this.getSystemCapabilities() });
// AI może auto-naprawić jeśli skonfigurowane if (this.config.autoRemediate && remediation.confidence > 0.9) { await this.applyRemediation(remediation); }
return { diagnosis, remediation, prediction: await ai.predictImpact(anomaly) }; }}
// Testowanie bezpieczeństwa wspierane przez AIclass APISecurityTester { async performSecurityAudit(api: API) { const securityTests = { // Uwierzytelnianie i autoryzacja auth: await this.testAuthentication(api), authz: await this.testAuthorization(api),
// Ataki iniekcji injection: await this.testInjectionVulnerabilities(api),
// Ekspozycja danych dataExposure: await this.testDataExposure(api),
// Ograniczanie szybkości i DoS rateLimiting: await this.testRateLimiting(api),
// Szyfrowanie i transport encryption: await this.testEncryption(api) };
return ai.consolidateSecurityFindings(securityTests); }
async testInjectionVulnerabilities(api: API) { const injectionPayloads = ai.generateInjectionPayloads({ types: ['sql', 'nosql', 'ldap', 'xpath', 'json', 'xml'], context: await ai.analyzeAPIContext(api), evasionTechniques: true });
const results = [];
for (const endpoint of api.endpoints) { for (const payload of injectionPayloads) { const result = await this.testEndpoint({ endpoint, payload, monitor: ['response_time', 'error_messages', 'status_codes'] });
if (ai.detectsVulnerability(result)) { results.push({ endpoint: endpoint.path, vulnerability: payload.type, severity: ai.assessSeverity(result), exploitation: ai.generateExploitProof(result), remediation: ai.suggestFix(result) }); } } }
return results; }
async testAuthentication(api: API) { const authTests = [];
// Testuj różne obejścia uwierzytelniania const bypassTechniques = ai.generateAuthBypassTechniques({ authType: api.authentication.type, knownVulnerabilities: await this.getKnownVulnerabilities(api.authentication.type) });
for (const technique of bypassTechniques) { const result = await this.attemptBypass(technique); authTests.push({ technique: technique.name, successful: result.bypassed, details: result.details, fix: result.bypassed ? ai.generateAuthFix(technique, api) : null }); }
// Testuj bezpieczeństwo tokenów if (api.authentication.usesTokens) { authTests.push(...await this.testTokenSecurity(api)); }
return authTests; }}
// Przykład: Testowanie OWASP API Security Top 10describe('OWASP API Security Top 10', () => { const securityTester = new APISecurityTester();
test('API1:2023 - Broken Object Level Authorization', async () => { const results = await securityTester.testObjectLevelAuth({ endpoints: api.endpoints.filter(e => e.hasPathParameters), users: await generateTestUsers(['user', 'admin', 'guest']), strategy: 'horizontal_privilege_escalation' });
expect(results.vulnerabilities).toHaveLength(0); });
test('API2:2023 - Broken Authentication', async () => { const results = await securityTester.testAuthentication(api);
results.forEach(result => { expect(result.successful).toBe(false); if (result.successful) { console.error(`Authentication bypass: ${result.technique}`, result.fix); } }); });
# Generuj kompleksowy zestaw testów bezpieczeństwaclaude "Utwórz testy bezpieczeństwa API zgodnie z OWASP API Security Top 10:
Todo:- [ ] Testy API1: Broken Object Level Authorization- [ ] Testy API2: Broken Authentication- [ ] API3: Broken Object Property Level Authorization- [ ] API4: Unrestricted Resource Consumption- [ ] API5: Broken Function Level Authorization- [ ] API6: Unrestricted Access to Sensitive Business Flows- [ ] API7: Server Side Request Forgery (SSRF)- [ ] API8: Security Misconfiguration- [ ] API9: Improper Inventory Management- [ ] API10: Unsafe Consumption of APIs
Dla każdej luki:1. Utwórz automatyczne testy2. Włącz pozytywne i negatywne przypadki testowe3. Dodaj wektory ataków iniekcji4. Testuj uwierzytelnianie i autoryzację5. Waliduj sanityzację wejścia6. Sprawdź ekspozycję danych7. Generuj raporty bezpieczeństwa
Skup się na punktach końcowych obsługujących wrażliwe dane."
# Claude generuje kompletny zestaw testów bezpieczeństwa
// Inteligentne mockowanie APIclass AIMockServer { async createIntelligentMock(openApiSpec: OpenAPISpec) { // AI analizuje specyfikację i generuje realistyczne odpowiedzi const mockBehaviors = await ai.generateMockBehaviors({ spec: openApiSpec, realDataSamples: await this.getRealDataSamples(), businessRules: await this.getBusinessRules() });
return { routes: mockBehaviors.map(behavior => ({ path: behavior.endpoint, method: behavior.method,
handler: async (req, res) => { // AI generuje kontekstową odpowiedź const response = await ai.generateResponse({ request: req, behavior, context: { previousRequests: this.getRequestHistory(req.session), userProfile: await this.getUserProfile(req), systemState: await this.getSystemState() } });
// AI symuluje realistyczne opóźnienia const delay = ai.calculateRealisticDelay({ endpoint: behavior.endpoint, load: this.getCurrentLoad(), complexity: behavior.complexity });
await sleep(delay);
// AI może symulować błędy na podstawie wzorców if (ai.shouldSimulateError(req, behavior)) { const error = ai.generateRealisticError(behavior); return res.status(error.status).json(error.body); }
res.status(response.status).json(response.body); } })),
// AI tworzy scenariusze stanowe scenarios: ai.generateStatefulScenarios({ spec: openApiSpec, workflows: await this.getCommonWorkflows() }) }; }}
// Testowanie specyficzne dla GraphQL z AIclass GraphQLTester { async generateGraphQLTests(schema: GraphQLSchema) { const introspection = await ai.introspectSchema(schema);
return { // Testowanie zapytań queries: await this.generateQueryTests(introspection),
// Testowanie mutacji mutations: await this.generateMutationTests(introspection),
// Testowanie subskrypcji subscriptions: await this.generateSubscriptionTests(introspection),
// Testowanie wydajności performance: await this.generatePerformanceTests(introspection) }; }
async generateQueryTests(introspection: IntrospectionResult) { const queries = [];
for (const type of introspection.types) { if (type.kind === 'OBJECT') { // AI generuje zapytania o różnej złożoności const complexityLevels = ['simple', 'nested', 'deep', 'circular'];
for (const complexity of complexityLevels) { const query = ai.generateGraphQLQuery({ type, complexity, includeFragments: true, includeVariables: true, includeDirectives: true });
queries.push({ name: `Test ${type.name} - ${complexity}`, query, variables: ai.generateVariables(query), expectedShape: ai.predictResponseShape(query), assertions: ai.generateAssertions(type, complexity) }); } } }
return queries; }
async testGraphQLSecurity(endpoint: string) { const securityTests = [];
// Testuj ataki głębokości zapytań const depthAttack = ai.generateDeepQuery({ depth: 20, breadth: 5 });
securityTests.push({ name: 'Query Depth Attack', test: async () => { const response = await graphql(endpoint, depthAttack); expect(response.errors).toContainError('Query depth limit exceeded'); } });
// Testuj nadużycie zasobów const complexityAttack = ai.generateComplexQuery({ aliases: 100, fragments: 50 });
securityTests.push({ name: 'Complexity Attack', test: async () => { const response = await graphql(endpoint, complexityAttack); expect(response.errors).toContainError('Query complexity limit exceeded'); } });
return securityTests; }}
name: Testowanie API wspierane przez AI
on: push: paths: - 'api/**' - 'openapi.yaml' pull_request: types: [opened, synchronize]
jobs: contract-testing: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3
- name: Generuj testy kontraktów run: | npx ai-contract-test generate \ --spec ./openapi.yaml \ --consumers ./consumers.json \ --output ./tests/contracts
- name: Uruchom testy kontraktów run: | npx ai-contract-test run \ --parallel \ --fail-fast \ --report ./reports/contracts
- name: Analizuj zmiany łamiące if: github.event_name == 'pull_request' run: | npx ai-api-analyzer \ --base ${{ github.base_ref }} \ --head ${{ github.head_ref }} \ --check breaking-changes \ --suggest-migration
security-testing: runs-on: ubuntu-latest steps: - name: Uruchom skan bezpieczeństwa run: | npx ai-security-test \ --api-url ${{ secrets.API_URL }} \ --auth-token ${{ secrets.API_TOKEN }} \ --owasp-top-10 \ --custom-payloads ./security/payloads.json
- name: Prześlij raport bezpieczeństwa uses: actions/upload-artifact@v3 with: name: security-report path: reports/security/
performance-testing: runs-on: ubuntu-latest steps: - name: Uruchom test obciążenia AI run: | npx ai-load-test \ --analyze-traffic \ --generate-scenarios \ --duration 10m \ --target-rps auto \ --fail-on-degradation 20%
- name: Analiza wydajności run: | --contract-failures 0
{ "scripts": { "test:api:unit": "jest tests/api/unit --coverage", "test:api:contract": "pact-broker can-i-deploy --pacticipant api-service", "test:api:security": "newman run security-tests.postman_collection.json", "test:api:performance": "k6 run performance-tests.js", "test:api:all": "npm run test:api:unit && npm run test:api:contract && npm run test:api:security && npm run test:api:performance" }}
Zacznij od specyfikacji OpenAPI
Najpierw zdefiniuj kontrakty API. AI może automatycznie wygenerować 80% zestawu testów ze dobrze udokumentowanych specyfikacji.
Warstwowa strategia testowania
Używaj piramidy testowej: testy jednostkowe dla logiki biznesowej, testy kontraktów dla granic API, testy E2E dla krytycznych przepływów.
Przyjmij generowanie danych testowych
Pozwól AI generować realistyczne dane testowe odpowiadające wzorcom produkcyjnym przy zachowaniu zgodności z prywatnością.
Automatyzuj testowanie bezpieczeństwa
Integruj testowanie OWASP API Security Top 10 z potokiem CI/CD. Bezpieczeństwo powinno być testowane ciągle.
Zacznij od dokumentacji - Upewnij się, że twoje API mają kompleksowe specyfikacje OpenAPI
Generuj podstawowe testy - Używaj AI do tworzenia testów jednostkowych i kontraktów ze specyfikacji
Dodaj testowanie bezpieczeństwa - Implementuj walidację OWASP API Security Top 10
Utwórz linie bazowe wydajności - Skonfiguruj testowanie obciążenia z realistycznymi scenariuszami użytkowników
Integruj z CI/CD - Automatyzuj wszystkie testy w potoku wdrażania
Monitoruj i iteruj - Używaj wglądów produkcyjnych do ulepszania pokrycia testów
Agent: "Wygeneruj kompleksowe testy API dla naszego serwisu zarządzania użytkownikami:- Utwórz testy ze specyfikacji OpenAPI- Włącz testowanie uwierzytelniania i autoryzacji- Dodaj testy walidacji wejścia i obsługi błędów- Generuj realistyczne dane testowe- Włącz benchmarki wydajności"
claude "Skonfiguruj kompletny potok testowania API:
Todo:- [ ] Generuj testy ze specyfikacji OpenAPI- [ ] Skonfiguruj testowanie kontraktów między serwisami- [ ] Dodaj walidację OWASP API Security Top 10- [ ] Utwórz testowanie wydajności z k6- [ ] Skonfiguruj integrację CI/CD- [ ] Skonfiguruj zarządzanie danymi testowymi
Skup się na krytycznych punktach końcowych: auth, płatności, dane użytkowników"