Testing Verification Skill
Overview
Comprehensive testing strategy and verification methodology for ensuring code quality, functionality, and reliability. This skill covers unit testing, integration testing, end-to-end testing, and automated verification processes to validate software correctness and prevent regressions.
When to Use This Skill
Trigger Conditions:
- Before code commits or deployments
- After implementing new features
- When fixing bugs or refactoring code
- During continuous integration pipelines
- When validating third-party integrations
- Before releasing to production
- When ensuring code quality standards
Step-by-Step Procedure
Step 1: Assess Testing Requirements
// Determine appropriate testing levels
const testingRequirements = {
unit: {
needed: true,
coverage: 80,
frameworks: ['jest', 'vitest', 'mocha']
},
integration: {
needed: featureInvolvesMultipleComponents,
coverage: 60,
frameworks: ['cypress', 'playwright', 'testing-library']
},
e2e: {
needed: featureChangesUserWorkflow,
coverage: 40,
frameworks: ['cypress', 'playwright']
},
performance: {
needed: featureImpactsPerformance,
benchmarks: ['responseTime', 'memoryUsage', 'loadTime']
}
};
Testing Scope Determination:
- Unit tests for individual functions/components
- Integration tests for component interactions
- E2E tests for complete user workflows
- Performance tests for critical paths
Step 2: Set Up Test Environment
# Configure testing environment
npm install --save-dev jest @testing-library/react @testing-library/jest-dom
# or
yarn add --dev vitest @vue/test-utils happy-dom
# Create test configuration
cat > jest.config.js << EOF
module.exports = {
testEnvironment: 'jsdom',
setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],
collectCoverageFrom: [
'src/**/*.{js,jsx,ts,tsx}',
'!src/index.js',
'!src/setupTests.js'
],
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80
}
}
};
EOF
Environment Setup:
- Install appropriate testing frameworks
- Configure test runners and environments
- Set up coverage thresholds
- Configure CI/CD integration
Step 3: Write Unit Tests
// Example unit test structure
import { render, screen, fireEvent } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { Button } from './Button';
describe('Button Component', () => {
it('renders with correct text', () => {
render(<Button>Click me</Button>);
expect(screen.getByRole('button', { name: /click me/i })).toBeInTheDocument();
});
it('calls onClick when clicked', async () => {
const handleClick = jest.fn();
const user = userEvent.setup();
render(<Button me</Button>);
await user.click(screen.getByRole('button', { name: /click me/i }));
expect(handleClick).toHaveBeenCalledTimes(1);
});
it('is disabled when disabled prop is true', () => {
render(<Button disabled>Click me</Button>);
expect(screen.getByRole('button', { name: /click me/i })).toBeDisabled();
});
});
Unit Test Best Practices:
- Test one behavior per test
- Use descriptive test names
- Mock external dependencies
- Test edge cases and error conditions
- Maintain high coverage (>80%)
Step 4: Implement Integration Tests
// Integration test example
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { App } from './App';
import { server } from '../mocks/server';
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
describe('User Registration Flow', () => {
it('allows user to register successfully', async () => {
const user = userEvent.setup();
render(<App />);
// Navigate to registration
await user.click(screen.getByRole('link', { name: /register/i }));
// Fill out form
await user.type(screen.getByLabelText(/email/i), 'user@example.com');
await user.type(screen.getByLabelText(/password/i), 'password123');
await user.click(screen.getByRole('button', { name: /register/i }));
// Verify success
await waitFor(() => {
expect(screen.getByText(/registration successful/i)).toBeInTheDocument();
});
});
});
Integration Testing:
- Test component interactions
- Mock API calls and external services
- Test complete user workflows
- Verify data flow between components
Step 5: Create End-to-End Tests
// E2E test with Playwright
import { test, expect } from '@playwright/test';
test.describe('User Authentication', () => {
test('user can log in and access dashboard', async ({ page }) => {
// Navigate to login page
await page.goto('/login');
// Fill login form
await page.fill('[data-testid="email-input"]', 'user@example.com');
await page.fill('[data-testid="password-input"]', 'password123');
await page.click('[data-testid="login-button"]');
// Verify dashboard access
await expect(page).toHaveURL('/dashboard');
await expect(page.locator('[data-testid="welcome-message"]')).toContainText('Welcome');
});
test('shows error for invalid credentials', async ({ page }) => {
await page.goto('/login');
await page.fill('[data-testid="email-input"]', 'invalid@example.com');
await page.fill('[data-testid="password-input"]', 'wrongpassword');
await page.click('[data-testid="login-button"]');
await expect(page.locator('[data-testid="error-message"]')).toContainText('Invalid credentials');
});
});
E2E Testing Focus:
- Complete user journeys
- Cross-browser compatibility
- Real user interactions
- Production-like environments
Step 6: Run Test Coverage Analysis
# Generate coverage report
npm run test:coverage
# Analyze coverage results
npx istanbul check-coverage --statements 80 --branches 80 --functions 80 --lines 80
# Identify uncovered code
npx istanbul report html
open coverage/index.html
Coverage Analysis:
- Ensure minimum coverage thresholds
- Identify untested code paths
- Focus testing efforts on critical paths
- Maintain coverage over time
Step 7: Implement Test Automation
// CI/CD test automation
const testPipeline = {
stages: [
{
name: 'unit-tests',
script: 'npm run test:unit',
coverage: true,
parallel: true
},
{
name: 'integration-tests',
script: 'npm run test:integration',
depends: ['unit-tests']
},
{
name: 'e2e-tests',
script: 'npm run test:e2e',
depends: ['integration-tests'],
environment: 'staging'
}
],
qualityGates: [
'coverage > 80%',
'no test failures',
'no security vulnerabilities',
'performance benchmarks met'
]
};
Automation Benefits:
- Consistent test execution
- Fast feedback loops
- Parallel test execution
- Integration with deployment pipelines
Step 8: Validate Test Quality
// Test quality metrics
const testQualityMetrics = {
reliability: {
flakiness: '< 1%', // Tests should be deterministic
falsePositives: '< 2%', // Tests should accurately detect issues
falseNegatives: '< 1%' // Tests should not miss real issues
},
maintainability: {
testToCodeRatio: '1:1', // Roughly equal test and production code
testDocumentation: '100%', // All tests should be well-documented
testIsolation: '100%' // Tests should not depend on each other
},
performance: {
executionTime: '< 5 minutes', // Fast feedback
resourceUsage: 'minimal', // Tests should not consume excessive resources
scalability: 'linear' // Test time should scale linearly with code size
}
};
Quality Validation:
- Test reliability and determinism
- Code maintainability and documentation
- Performance and resource efficiency
Step 9: Set Up Test Monitoring
// Test result monitoring and alerting
const testMonitoring = {
alerts: {
testFailures: {
threshold: 0,
channels: ['slack', 'email'],
escalation: 'immediate'
},
coverageDrop: {
threshold: 5, // percentage drop
channels: ['slack'],
escalation: 'daily'
},
performanceRegression: {
threshold: 10, // percentage increase
channels: ['slack'],
escalation: 'immediate'
}
},
dashboards: {
testResults: '/dashboards/test-results',
coverageTrends: '/dashboards/coverage-trends',
performanceMetrics: '/dashboards/test-performance'
}
};
Monitoring Setup:
- Real-time test failure alerts
- Coverage trend tracking
- Performance regression detection
- Executive dashboards for visibility
Step 10: Document Testing Strategy
# Create testing documentation
cat > TESTING_STRATEGY.md << EOF
# Testing Strategy
## Test Pyramid
- Unit Tests: ${unitTestCount} (${unitCoverage}%)
- Integration Tests: ${integrationTestCount} (${integrationCoverage}%)
- E2E Tests: ${e2eTestCount} (${e2eCoverage}%)
## Test Environments
- Local: Jest/Vitest for unit tests
- Staging: Full integration and E2E tests
- Production: Synthetic monitoring and smoke tests
## Quality Gates
- Code coverage > 80%
- No critical security vulnerabilities
- Performance benchmarks met
- Manual QA sign-off for major features
## Maintenance
- Weekly test review meetings
- Monthly test strategy updates
- Quarterly testing tool evaluations
EOF
Documentation Requirements:
- Clear testing strategy and pyramid
- Environment specifications
- Quality gates and criteria
- Maintenance procedures
Success Criteria
- All tests pass successfully
- Code coverage meets minimum thresholds
- No flaky or unreliable tests
- Test automation integrated into CI/CD
- Test results monitored and alerted
- Testing strategy documented and followed
- Performance benchmarks established and met
- Test quality metrics tracked and improved
Common Pitfalls
- Testing Implementation Instead of Behavior - Focus on what code does, not how it does it
- Brittle Tests - Tests that break with every code change
- Missing Edge Cases - Not testing error conditions and edge cases
- Slow Test Suites - Tests that take too long to run
- Inadequate Coverage - Missing critical code paths
- Test Dependencies - Tests that depend on external services or state
Testing Framework Selection
Unit Testing
// Jest - Most popular, feature-rich
// Vitest - Fast, modern alternative
// Mocha - Flexible, extensible
Integration Testing
// Testing Library - Component interaction testing
// Cypress - API and component testing
// Playwright - Cross-browser testing
E2E Testing
// Cypress - Developer-friendly, fast
// Playwright - Cross-browser, reliable
// Selenium - Mature, extensive ecosystem
Test Organization Patterns
File Structure
src/
components/
Button/
Button.jsx
Button.test.jsx
__tests__/
Button.integration.test.jsx
tests/
e2e/
authentication.spec.js
integration/
api.spec.js
utils/
test-helpers.js
Test Naming Conventions
// Unit tests
describe('Button Component', () => {
describe('when clicked', () => {
it('calls the onClick handler', () => {
// test implementation
});
});
});
// Integration tests
describe('User Registration Flow', () => {
it('allows user to register successfully', () => {
// test implementation
});
});
Cross-References
Related Procedures
- Testing Framework Guide - Complete testing setup
- Test Automation Guide - Automation best practices
Related Skills
verification-before-completion- Final quality checkssystematic-debugging- Debugging test failuresbuild-error-fix- Fixing build issues in tests
Related Agents
QualityForge_AI_Team- Test creation and validationDevForge_AI_Team- Test automation implementation
Performance Metrics
- Test Execution Time: <5 minutes for full suite
- Success Rate: 91% of tests pass consistently
- Frequency: Used in 82% of development tasks
- Coverage Maintenance: 85% sustained coverage over time
- Defect Detection: 94% of bugs caught by automated tests
Testing Maturity Levels
Level 1: Basic Testing
- Manual testing only
- No automated tests
- Reactive bug fixing
Level 2: Automated Unit Tests
- Unit test coverage > 70%
- Basic CI/CD integration
- Some integration tests
Level 3: Comprehensive Testing
- Full test pyramid implementation
- E2E test coverage
- Test-driven development
Level 4: Testing Excellence
- Property-based testing
- Mutation testing
- AI-assisted test generation
Quality Assurance Integration
Code Review Checklist
- Unit tests added for new functionality
- Integration tests for component interactions
- E2E tests for critical user journeys
- Test coverage maintained or improved
- No test regressions introduced
Deployment Gates
- All tests passing in CI/CD
- Code coverage requirements met
- Performance benchmarks satisfied
- Security tests completed
- Manual QA approval obtained
This skill ensures comprehensive, automated testing coverage with reliable verification processes to maintain code quality and prevent regressions.