前言
jest是针对JavaScript的测试框架。如果遵循TDD原则,在任何功能开发之前都需要先写测试。而测试分为单元测试,集成测试和系统测试。
单元测试
单元测试可以理解为对于单个函数(单一功能)进行的测试。单元测试一般由开发人员来执行,首先设定最小的测试单元,然后通过设计相应的测试用例来验证各个单元功能的正确性。
集成测试
在单元测试后,需要确认几个单元之间互动没有问题。这就需要集成测试对几个单元组成的模块进行测试,或者测试单元的接口没问题。集成测试的主要关注点是系统能够成功编译,实现了主要的业务功能,系统各个模块之间数据能够正常通信等。
系统测试
系统测试就是针对这个项目的测试。通常与联调相关。验证整个系统是否满足需求规格说明。
验收测试
依照产品说明书,逐步进行检查。从用户的角度检查系统是否满足合同中定义的需求或者用户需求。作为开发,这一步几乎接触不到。
开始入门
直接用npm包管理进行下载安装,同时可以在Package.json的script项中进行设置相关脚本。
//用npm进行安装
npm install --save-dev jest
//设置脚本
{
"scripts": {
"test": "jest"
}
}
package.json初始化
用原生js写项目时,是没有package.json。而使用jest却需要用到。此时可以简单用npm init
命令。
Jest测试命名约定
测试文件的文件名 = 被测试模块名 + .test.js
Cannot use import statement outside a module
配置好以上之后,如果在测试开头import,会报错。原因是jest运行在node中,不能使用es6语法,需要用bable转换为es5。
先安装npm i babel-jest @babel/core @babel/preset-env -D
再创建babel.config.cjs
文件
module.exports = {
presets: [
[
"@babel/preset-env",
{
targets: {
node: "current",
},
},
],
],
};
Jest中几类函数
描述函数
这两个仅有可读性的区别,而非功能性。
test("描述信息",()=>{
})
it("描述信息",()=>{
})
分组函数
某个功能,某个组件所有的相关测试
describe("这组是做什么的 "(){
test("测试一号",()=>{
})
it("c测试二号",()=>{
})
})
Jest的匹配器
常见的匹配器
匹配器可以用于简单输出结果的测试。详情可以参照expect API文档。
// 1 toBe 精确相等
test("一加一必须等于二",()=>{
expect(1+1).toBe(2);
})
// 2 toEqual 对象,数组相等
test('object assignment', () => {
const data = {cat: "miao"};
data['dog'] = “wang";
expect(data).toEqual({cat: miao, dog: “wang"});
});
//3 加个Not测试相反情况
test("一加一不等于三",()=>{
expect(1+1).not.toBe(3);
})
特殊类型和真假
undefined和null等特殊类型可以单独拎出来判断。同时也可以判定语句真假
test('null', () => {
const n = null;
expect(n).toBeNull();
expect(n).toBeDefined();
expect(n).not.toBeUndefined();
expect(n).not.toBeTruthy();
expect(n).toBeFalsy();
});
test('zero', () => {
const z = 0;
expect(z).not.toBeNull();
expect(z).toBeDefined();
expect(z).not.toBeUndefined();
expect(z).not.toBeTruthy();
expect(z).toBeFalsy();
});
数字
大于小于等关系。
这里js浮点运算的精确问题也考虑进去了。
test('two plus two', () => {
const value = 2 + 2;
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3.5);
expect(value).toBeLessThan(5);
expect(value).toBeLessThanOrEqual(4.5);
// toBe and toEqual are equivalent for numbers
expect(value).toBe(4);
expect(value).toEqual(4);
});
test('adding floating point numbers', () => {
const value = 0.1 + 0.2;
//expect(value).toBe(0.3); This won't work because of rounding error
expect(value).toBeCloseTo(0.3); // This works.
});
字符串
主要还是用正则规则匹配
test('there is no I in team', () => {
expect('team').not.toMatch(/I/);
});
test('but there is a "stop" in Christoph', () => {
expect('Christoph').toMatch(/stop/);
});
数组和可迭代对象
const shoppingList = [
'diapers',
'kleenex',
'trash bags',
'paper towels',
'milk',
];
test('the shopping list has milk on it', () => {
expect(shoppingList).toContain('milk');
expect(new Set(shoppingList)).toContain('milk');
});
异常
function compileAndroidCode() {
throw new Error('you are using the wrong JDK');
}
test('compiling android goes as expected', () => {
expect(() => compileAndroidCode()).toThrow();
expect(() => compileAndroidCode()).toThrow(Error);
// You can also use the exact error message or a regexp
expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
expect(() => compileAndroidCode()).toThrow(/JDK/);
});