前端单元测试框架jest总结
1、jest--环境搭建:
安装VSCode (VSCodeUserSetup-x64-1.40.2.exe)
安装node.js (node-v16.13.1-x64.msi)(下载地址:https://nodejs.org/en/download/)
安装完成后cmd输入
node -v
npm -v
查看是否安装成功
cmd进入\Front-end Testing Demo\example目录下输入命令:npm install安装所需要的依赖包 (只有第一次需要安装依赖包)
安装完成后,输入npm test运行用例
选择a运行所有的用例 输入p是选择运行哪个文件的用例
2、jest--架构:(react+jest框架)
2.1.项目入口:src/index.js文件,在这里导入需要执行的文件
需要执行的文件CheckboxWithLabel.js在App目录下
src/index.js
import {CheckboxWithLabels} from './App/index';
(import时默认的方法名不需要加{},不是默认的方法名需要加{})
ReactDOM.render(
document.getElementById('root')
);
2.2.在需要执行的文件所在的项目目录下的index.js文件中,引入这个文件,才能运行这个文件
App/index.js
import CheckboxWithLabel from "./CheckboxWithLabel";
export function CheckboxWithLabels() {
return (
<>
>
);
}
在cmd窗口Front-end Testing Demo\example目录下输入npm start就可以预览文件
2.3.在src/_test_目录下创建测试文件CheckboxWithLabel.test.js
命名规则:xxx.test.js或者xxx.spec.js
3.jest--用法
3.1.匹配器:
判断数组:toBe 、 toEqual expect(2 + 2).toBe(4); expect(data).toEqual({one: 1, two: 2}); 判断浮点数:toBeCloseTo expect(value).toBeCloseTo(0.3); 判断异常:toThrow expect(compileAndroidCode).toThrow(ConfigError);
3.2.异步测试:回调函数、Promise 、async函数
回调函数示例: Promise示例:.resolves / .rejects匹配器 test('the data is peanut butter', () => { return fetchData().then(data => { expect(data).toBe('peanut butter'); }); }); test('the data is peanut butter', () => { return expect(fetchData()).resolves.toBe('peanut butter'); }); test('the fetch fails with an error', () => { return expect(fetchData()).rejects.toMatch('error'); }); Async/Await示例: test('the data is peanut butter', async () => { const data = await fetchData(); expect(data).toBe('peanut butter'); }); test('the data is peanut butter', async () => { await expect(fetchData()).resolves.toBe('peanut butter'); }); test('the fetch fails with an error', async () => { await expect(fetchData()).rejects.toMatch('error'); });
3.3.测试前后逻辑处理:beforeAll/afterAll、beforeEach/afterEach
beforeAll(() => { console.log("this is beforeAll"); }); afterAll(() => { console.log("this is afterAll"); }); beforeEach(() => { console.log("this is beforeEach"); }); afterEach(() => { console.log("this is afterEach"); });
3.4.Mock函数
示例1: test('mockCallback', () => { //通过jest.fn 可以得到一个 mock 函数 const mockCallback = jest.fn(x => 42 + x); [0, 1].forEach(mockCallback); // 此 mock 函数被调用了两次 expect(mockCallback.mock.calls.length).toBe(2); // 第一次调用函数时的第一个参数是 0 expect(mockCallback.mock.calls[0][0]).toBe(0); // 第二次调用函数时的第一个参数是 1 expect(mockCallback.mock.calls[1][0]).toBe(1); // 第一次函数调用的返回值是 42 expect(mockCallback.mock.results[0].value).toBe(42); }); 示例2: test('mockCallback', () => { const myMock = jest.fn(); const a = new myMock(); const b = {name:'b'}; const bound = myMock.bind(b); bound(); console.log(myMock.mock.instances); // 这个函数被实例化两次 expect(myMock.mock.instances.length).toBe(2); // 这个函数被第一次实例化返回的对象中,有一个 name 属性,且被设置为了 'b' expect(myMock.mock.instances[1].name).toEqual('b'); }); 示例3: users.js import axios from 'axios'; class Users { static all() { return axios.get('/users.json').then(resp => resp.data); } } export default Users; users.test.js import axios from 'axios'; import Users from './users'; jest.mock('axios'); test('should fetch users', () => { const users = [{name: 'Bob'}]; const resp = {data: users}; axios.get.mockResolvedValue(resp); return Users.all().then(data => expect(data).toEqual(users)); });
3.5.快照测试
示例: test('object equals', () => { const user = { createdAt: new Date(), id: Math.floor(Math.random() * 20), name: 'LeBron James', }; expect(user).toMatchSnapshot({ createdAt: expect.any(Date), id: expect.any(Number), }); }); 执行之后会在_test_目录下生成一个_snapshots_目录 生成一份快照 当用例中的值发生变化后,与快照不一致,用例执行会失败 比如name: 'LeBron James'改为name: 'LeBron James1'再执行用例,用例执行会失败
jest函数单元测试 相关网站:
https://jestjs.io/zh-Hans/docs/getting-started (官网)
https://www.sohu.com/a/259962384_505779