首先附上官方文檔地址,https://jestjs.io/docs/zh-Hans/getting-started.htmlhtml
Jest 是Facebook的一個專門進行Javascript單元測試的工具,這些應用固然也包括了 React 應用。它的優勢之一是自帶了對 React 的支持,同時也很容易支持其它框架。node
npm i jest -D(安裝到本地)
npm i jest -g(安裝到全局)正則表達式
// package.json for example ... "jest": { "transform": { ".(ts|tsx)": "ts-jest" }, "testEnvironment": "node", "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$", "moduleFileExtensions": [ "ts", "tsx", "js" ], "coveragePathIgnorePatterns": [ "/node_modules/", "/test/" ], "coverageThreshold": { "global": { "branches": 90, "functions": 95, "lines": 95, "statements": 95 } }, "collectCoverageFrom": [ "src/*.{js,ts}" ] }, ...
接下來,咱們就簡單的說一下這幾個配置項的做用npm
簡單地說就是一種轉換器配置,好比這裏寫的json
"transform": { ".(ts|tsx)": "ts-jest" },
表示的就是ts-jest工具把.ts和.tsx文件內容轉換成js,由於咱們如今基本上也都是用ts去編寫測試代碼,因此要配置轉換器數組
測試環境瀏覽器
"testEnvironment": "node",
表示它是一個類瀏覽器的測試環境,咱們可使用瀏覽器環境中的一些APIbabel
要測試文件的正則表達式框架
"testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
表示test目錄下全部以.test.ts和.spec.ts的文件都須要跑測試工具
模塊文件擴展名,當你去引入一個模塊並無指定拓展名的時候,它會依次嘗試去添加這些擴展名去擬引入模塊文件
"moduleFileExtensions": [ "ts", "tsx", "js" ],
表示優先找.ts的模塊,其次是.tsx和.js
測試覆蓋率的閾值設定,當咱們的測試覆蓋率達不到閾值的時候,測試會失敗
"coverageThreshold": { "global": { "branches": 90, "functions": 95, "lines": 95, "statements": 95 } },
表示全局的代碼分支覆蓋率要達到90%以上,方法覆蓋率達到95%,代碼行數覆蓋率達到95%,聲明語句達到95%
收集指定文件的測試覆蓋率(即便你沒爲這些文件編寫測試,它的值爲glob patterns類型)
"collectCoverageFrom": [ "src/*.{js,ts}" ]
表示收集src目錄以及全部組目錄中的js和ts文件的測試覆蓋率
測試框架安裝後當即執行的代碼文件列表
"setupFileAfterEnv": [ "<rootDir>/test/boot.ts" ]
表示每次跑具體測試代碼以前會先運行
新建jest.config.js並添加配置項module.exports = { 配置項 }
// for example 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) }) })
Matchers俗稱斷言庫,例如上面的expect().toBe()即是其中之一,其餘常見用法以下:
toBe(value): 比較數字、字符串
toEqual(value): 比較對象、數組
toBeNull()
toBeUndefined()
toHaveProperty(keyPath, value): 是否有對應的屬性
toContain(item): 是否包含對應的值,括號裏寫上數組、字符串
toMatch(regexpOrString): 括號裏寫上正則
toBeTruthy()
toBeFalsy()
在JavaScript中,有六個falsy值:false,0,'',null, undefined,和NaN。其餘一切都是Truthy。
toBeGreaterThan(number): 大於
toBeLessThan(number): 小於
取反,用法見下面例子
// for example 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') })
Jest 默認只支持你所使用的 node.js 版本所支持的 JS 特性,例如 import export 就不支持,因此要麼你的代碼使用系統 node.js 兼容的語法寫 (也就是使用 require),要麼在這裏使用 Babel 轉義一下。
在 Jest 中使用 Babel 很簡單,只須要安裝 babel-jest 並新建一個 .babelrc 加入你想要的配置就好了,Jest 會自動使用 babel-jest。這裏咱們簡單地使用 babel-preset-env 便可,對應的 .babelrc 是:
{ "presets": ["env"] }
在大多數時候你的項目自己就已經在使用 .babelrc 了,因此這一步甚至也省略掉了。