在前端開發、計算機軟件開發及運維服務中,單元測試是保證代碼質量、提升可維護性和減少線上錯誤的關鍵環節。Jest是當前流行的JavaScript測試框架,憑借其零配置、高性能和豐富的功能,成為前端及Node.js項目的首選測試工具。本文將手把手教你如何從零搭建Jest環境,并實際編寫測試用例,助力你的開發與運維工作。
Jest是由Facebook開發的JavaScript測試框架,主要特點包括:
如果你還沒有項目,先創建一個新目錄并初始化npm:`bash
mkdir jest-demo && cd jest-demo
npm init -y`
`bash
npm install --save-dev jest
# 如需支持TypeScript
npm install --save-dev ts-jest @types/jest typescript
# 如需支持Babel
npm install --save-dev babel-jest @babel/core @babel/preset-env`
創建jest.config.js文件:`javascript
module.exports = {
testEnvironment: 'node', // 或'jsdom'用于前端DOM測試
testMatch: ['/_tests_//.js', '**/?(.)+(spec|test).js'],
collectCoverage: true,
coverageDirectory: 'coverage',
coverageReporters: ['text', 'lcov'],
// TypeScript配置
preset: 'ts-jest',
// Babel配置
transform: {
'^.+\\.js$': 'babel-jest'
}
};`
創建.babelrc文件:`json
{
"presets": ["@babel/preset-env"]
}`
在package.json中添加:`json
{
"scripts": {
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage"
}
}`
創建src/math.js:`javascript
export function add(a, b) {
return a + b;
}
export function divide(a, b) {
if (b === 0) throw new Error('除數不能為零');
return a / b;
}`
創建tests/math.test.js:`javascript
import { add, divide } from '../src/math';
describe('數學函數測試', () => {
test('add函數應正確計算兩數之和', () => {
expect(add(2, 3)).toBe(5);
expect(add(-1, 1)).toBe(0);
expect(add(0.1, 0.2)).toBeCloseTo(0.3); // 處理浮點數精度
});
test('divide函數應正確處理除法', () => {
expect(divide(6, 2)).toBe(3);
expect(divide(5, 2)).toBe(2.5);
});
test('divide函數在除數為零時應拋出錯誤', () => {
expect(() => divide(10, 0)).toThrow('除數不能為零');
});
});`
創建src/api.js:`javascript
export async function fetchData() {
const response = await fetch('https://api.example.com/data');
return response.json();
}`
創建tests/api.test.js:`javascript
describe('API函數測試', () => {
beforeEach(() => {
global.fetch = jest.fn();
});
afterEach(() => {
jest.resetAllMocks();
});
test('fetchData應成功返回數據', async () => {
const mockData = { id: 1, name: '測試數據' };
fetch.mockResolvedValue({
json: jest.fn().mockResolvedValue(mockData)
});
const data = await fetchData();
expect(data).toEqual(mockData);
expect(fetch).toHaveBeenCalledWith('https://api.example.com/data');
});
test('fetchData在請求失敗時應拋出錯誤', async () => {
fetch.mockRejectedValue(new Error('網絡錯誤'));
await expect(fetchData()).rejects.toThrow('網絡錯誤');
});
});`
npm install --save-dev react-test-renderer @testing-library/react
創建src/Button.js:`jsx
import React from 'react';
function Button({ onClick, children, disabled = false }) {
return (
onClick={onClick}
disabled={disabled}
data-testid="custom-button"
>
{children}
);
}
export default Button;`
創建tests/Button.test.js:`jsx
import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import Button from '../src/Button';
describe('Button組件測試', () => {
test('應正確渲染按鈕文本', () => {
const { getByText } = render();
expect(getByText('點擊我')).toBeInTheDocument();
});
test('點擊按鈕應觸發onClick回調', () => {
const handleClick = jest.fn();
const { getByTestId } = render(
);
fireEvent.click(getByTestId('custom-button'));
expect(handleClick).toHaveBeenCalledTimes(1);
});
test('禁用狀態下按鈕不應觸發點擊', () => {
const handleClick = jest.fn();
const { getByTestId } = render(
);
fireEvent.click(getByTestId('custom-button'));
expect(handleClick).toHaveBeenCalledTimes(0);
});
});`
describe描述模塊,test或it描述具體場景beforeEach、afterEach確保測試獨立性jest.config.js中的transform選項coveragePathIgnorePatterns--maxWorkers限制并行進程數,或拆分測試套件useFakeTimers模擬時間jest.config.js中配置testEnvironment為jsdom##
通過本文的指導,你已經掌握了從零搭建Jest測試環境的方法,并學會了編寫各種類型的測試用例。在實際的前端開發、軟件開發和運維服務中,良好的測試實踐不僅能提高代碼質量,還能顯著降低維護成本。建議將測試作為開發流程的必需環節,持續完善測試覆蓋率和測試質量,構建更加健壯可靠的軟件系統。
現在你可以運行npm test開始你的測試之旅,讓自動化測試為你的項目保駕護航!
如若轉載,請注明出處:http://www.nojiaquan.cn/product/57.html
更新時間:2026-02-10 02:32:29