简介
该技能提供了跨 TypeScript、Python 和 Swift 的单元测试、集成测试和端到端测试的指南,使用推荐的测试框架。
设置和示例
TypeScript/JS (Vitest/Jest)
# 安装和运行示例
npm install vitest
vitest
Python (pytest)
pip install pytest
pytest
Swift (XCTest)
// 示例测试代码
import XCTest
...
端到端测试 (Playwright)
npm install playwright
playwright test
覆盖率和最佳实践
- TypeScript/JS:
vitest --coverage 或
jest --coverage
- Python:
pytest --cov
测试模式 :TDD、Arrange-Act-Assert、模拟、异步测试注意
修复拼写错误(如 uv pip install 应为 pip install)。
在受控环境中运行命令以避免意外依赖安装或浏览器下载。 Write and run tests across languages and frameworks.
Framework Selection Language Unit Tests Integration E2E TypeScript/JS Vitest (preferred), Jest Supertest Playwright Python pytest pytest + httpx Playwright Swift XCTest XCTest XCUITest
Quick Start by Framework Vitest (TypeScript / JavaScript)
npm install -D vitest @testing-library/react @testing-library/jest-dom
// vitest.config.ts
import { defineConfig } from 'vitest/config'
export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
setupFiles: './tests/setup.ts',
},
})
npx vitest # Watch mode
npx vitest run # Single run
npx vitest --coverage # With coverage
Jest
npm install -D jest @types/jest ts-jest
npx jest # Run all
npx jest --watch # Watch mode
npx jest --coverage # With coverage
npx jest path/to/test # Single file
pytest (Python)
uv pip install pytest pytest-cov pytest-asyncio httpx
pytest # Run all
pytest -v # Verbose
pytest -x # Stop on first failure
pytest --cov=app # With coverage
pytest tests/test_api.py -k "test_login" # Specific test
pytest --tb=short # Short tracebacks
XCTest (Swift)
swift test # Run all tests
swift test --filter MyTests # Specific test suite
swift test --parallel # Parallel execution
Playwright (E2E)
npm install -D @playwright/test
npx playwright install
npx playwright test # Run all
npx playwright test --headed # With browser visible
npx playwright test --debug # Debug mode
npx playwright test --project=chromium # Specific browser
npx playwright show-report # View HTML report
TDD Workflow Red — Write a failing test that describes the desired behavior.
Green — Write the minimum code to make the test pass.
Refactor — Clean up the code while keeping tests green.┌─────────┐ ┌─────────┐ ┌──────────┐
│ Write │────▶│ Write │────▶│ Refactor │──┐
│ Test │ │ Code │ │ Code │ │
│ (Red) │ │ (Green) │ │ │ │
└─────────┘ └─────────┘ └──────────┘ │
▲ │
└──────────────────────────────────────────┘
Test Patterns Arrange-Act-Assert
test('calculates total with tax', () => {
// Arrange
const cart = new Cart([{ price: 100, qty: 2 }]); // Act
const total = cart.totalWithTax(0.08);
// Assert
expect(total).toBe(216);
});
Testing Async Code
test('fetches user data', async () => {
const user = await getUser('123');
expect(user.name).toBe('Colt');
});
Mocking
import { vi } from 'vitest';const mockFetch = vi.fn().mockResolvedValue({
json: () => Promise.resolve({ id: 1, name: 'Test' }),
});
vi.stubGlobal('fetch', mockFetch);
Testing API Endpoints (Python)
import pytest
from httpx import AsyncClient
from app.main import app@pytest.mark.asyncio
async def test_get_users():
async with AsyncClient(app=app, base_url="http://test") as client:
response = await client.get("/users")
assert response.status_code == 200
assert isinstance(response.json(), list)
Testing React Components
import { render, screen, fireEvent } from '@testing-library/react';
import { Button } from './Button';test('calls onClick when clicked', () => {
const handleClick = vi.fn();
render(Click me );
fireEvent.click(screen.getByText('Click me'));
expect(handleClick).toHaveBeenCalledOnce();
});
Coverage Commands # JavaScript/TypeScript
npx vitest --coverage # Vitest (uses v8 or istanbul)
npx jest --coverage # Jest# Python
pytest --cov=app --cov-report=html # HTML report
pytest --cov=app --cov-report=term # Terminal output
pytest --cov=app --cov-fail-under=80 # Fail if < 80%
# View HTML coverage report
open coverage/index.html # macOS
open htmlcov/index.html # Python
What to Test Always test:
Public API / exported functions
Edge cases: empty input, null, boundary values
Error handling: invalid input, network failures
Business logic: calculations, state transitions Don't bother testing:
Private implementation details
Framework internals (React rendering, Express routing)
Trivial getters/setters
Third-party library behavior