一、Jest 基本概念
Jest 是Facebook的一个专门进行Javascript单元测试的工具,适合React全家桶使用,具有零配置、内置代码覆盖率、强大的Mocks等特点。
安装:
-
npm i jest -D
(安装到本地) -
npm i jest -g
(安装到全局)
运行:
-
npx jest
(安装到本地的前提下) -
jest
(安装到全局的前提下) - 修改
"script"
中的"test"
为"jest"
后使用npm run test
或npm t
零配置:
但测试用例文件名格式为**test.js
(默认配置下)
基本方法:
- 分组(Test Group):
descripe(描述语,function)
- 测试用例(Test Case):
test(描述语,function)
- 断言(Assert):
expect(运行需测试的方法并返回实际结果).toBe(预期结果)
例:
Pencil.query =(name, url)=> { //方法,返回捕获
// ?hello=test&wonghan=handsome
var reg = new RegExp('(?:\\?|&)' + name + '=(.*?)(?:&|$)')
var ret = reg.exec(url) || []
return ret[1]
}
test('query',()=>{ // testCase
// 断言
expect(Pencil.query('hello', '?hello=test')).toBe('test')
expect(Pencil.query('hello', '?hello2=test')).toBe(undefined)
//可以写多个`ecpect()`
})
test('query2',()=>{
expect(Pencil.query('hello/test', '?hello/test=test')).toBe('test')
})
//可以写多个`test()`
describe('test query',()=>{
test('query3',()=>{ // testCase
// assert
expect(Pencil.query('hello', '?hello=test')).toBe('test')
expect(Pencil.query('hello', '?hello2=test')).toBe(undefined)
})
})
结果:
二、Jest 配置
虽然说Jest是零配置,但也是可以配置
(一)配置位置
1. package.json
在package.json
添加配置项"jest" : { 配置项 }
2. jest.config.js
新建jest.config.js
并添加配置项module.exports = { 配置项 }
3. 命令行(独有的option)
见:命令行配置
(二)配置项
1. testMatch
设置识别哪些文件是测试文件(glob形式),与testRegex
互斥,不能同时写
testMatch: ['\*\*/\_\_tests\_\_/\*\*/\*.js?(x)','\*\*/?(*.)(spec|test).js?(x)']
2. testRegex
设置识别哪些文件是测试文件(正则形式),与testMatch
互斥,不能同时写
testRegex: '(/\_\_tests\_\_).*|(\\\\.|/)(test|spec))\\\\.jsx?$'
3. testRnviroment
测试环境,默认值是:jsdom
,可修改为node
testEnvironment: 'jsdom'
4. rootDir
默认值:当前目录,一般是package.json
所在的目录。
rootDir: ' '
5. moduleFileExtensions
测试文件的类型
moduleFileExtensions: ['js','json','jsx','node']
一般配置:
module.exports = {
testMatch: ['/test/\*\*/\*.js'],
testEnvironment: 'jsdom',
rootDir: '',
moduleFileExtensions: ['js','json','jsx','node']
}
三、Jest Matchers
Matchers俗称断言库,例如上面的expect().toBe()
便是其中之一,其他常见用法如下:
1.相等断言
toBe(value): 比较数字、字符串
toEqual(value): 比较对象、数组
toBeNull()
toBeUndefined()
2.包含断言
toHaveProperty(keyPath, value): 是否有对应的属性
toContain(item): 是否包含对应的值,括号里写上数组、字符串
toMatch(regexpOrString): 括号里写上正则
3.逻辑断言
toBeTruthy()
toBeFalsy()
在JavaScript中,有六个falsy值:false
,0
,''
,null
, undefined
,和NaN
。其他一切都是Truthy。
toBeGreaterThan(number): 大于
toBeLessThan(number): 小于
4.not
取反,用法见下面例子
例:
test('matchers',()=>{
const a = {
hello: 'jest',
hi :{
name: 'jest'
}
}
const b = {
hello: 'jest',
hi:{
name: 'jest'
}
}
// 以下结果均为true
expect(a).toEqual(b)
expect([1,2,3]).toEqual([1,2,3])
expect(null).toBeNull()
expect([1,2,3]).toContain(1)
expect(b).toHaveProperty('hi')
expect('123').toContain('2')
expect('123').toMatch(/^\d+$/)
expect('123').not.toContain('4')
})
- 使用
npx jest
测试执行,结果为passed
附:官方文档