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