Jest

Jest是 Facebook 的一套開源的 JavaScript 測試框架灭袁, 它自動集成了斷言杆烁、JSDom、覆蓋率報(bào)告等開發(fā)者所需要的所有測試工具简卧,是一款幾乎零配置的測試框架兔魂。并且它對同樣是 Facebook 的開源前端框架 React 的測試十分友好。

1. 全局安裝

yarn global add jestnpm install jest --global
這樣就可以通過命令行直接運(yùn)行Jest
yarn與npm對比

2. 結(jié)合babel使用jest

安裝所需的依賴:
yarn add --dev babel-jest @babel/core @babel/preset-env

還需安裝@babel/plugin-transform-runtime举娩, @babel/runtime析校,不然測試會報(bào)錯(cuò)

  • .babelrc文件配置
    可以在工程的根目錄下創(chuàng)建一個(gè)babel.config.js文件用于配置與你當(dāng)前Node版本兼容的Babel
{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "node": "current"
      }
    }]
  ],
  "plugins": ["@babel/plugin-transform-runtime"]
}
  • package.json配置
  "jest": {
    // moduleNameMapper:  一種正則表達(dá)式到模塊名的映射,匹配到的文件的內(nèi)容可以是空的
    // 可以通過該參數(shù)铜涉,來mock一些圖片智玻,css等靜態(tài)資源文件
    // 因?yàn)槲覀冊跍y試的時(shí)候?qū)嶋H上是不太需要這些文件的,但是有需要引入它作為環(huán)境上的依賴芙代。
    "moduleNameMapper": {
      "^vue$": "vue/dist/vue.common.js"
    },
    // moduleFileExtensions: 讓jest知道你需要測試覆蓋的文件的擴(kuò)展名都是什么吊奢。
    "moduleFileExtensions": [
      "js",
      "vue"
    ],
    //  transform: 簡單來說就是轉(zhuǎn)換器,正則匹配到的文件可以通過對應(yīng)模塊的轉(zhuǎn)換器來解決一些未來版本語法時(shí)可以使用它纹烹。通過正則來匹配文件页滚,為匹配到的文件使用對應(yīng)的模塊
    "transform": {
      "^.+\\.js$": "<rootDir>/node_modules/babel-jest",
      ".*\\.(vue)$": "<rootDir>/node_modules/vue-jest"
    }
  }

注意: jest24不支持babel6

  • 如要使用jest24,可以將babel升級到版本7
  • 如果babel不能升級到7铺呵,那么就使用jest23
  • babel不能升級到7裹驰,要使用jest24,那么就將babel-test版本鎖在23

3. 匹配器

常用匹配器:

  • 普通匹配器: toBe, toEqual
  • Truthiness: toBeNull片挂,toBeUndefined幻林,toBeDefined,toBeTruthy音念,toBeFalsy
  • 數(shù)字: toBeGreaterThan沪饺,toBeGreaterThanOrEqual,toBeLessThan闷愤,toBeLessThanOrEqual整葡,toBeCloseTo
  • 字符串:toMatch
  • 數(shù)組:toContain

4. 測試用例

Jest會自動找到項(xiàng)目中所有使用.test.js文件命名的測試文件并執(zhí)行,通常我們在編寫測試文件時(shí)遵循的命名規(guī)范:測試文件的文件名 = 被測試模塊名 + .test.js肝谭,例如被測試模塊為functions.js掘宪,那么對應(yīng)的測試文件命名為functions.test.js蛾扇。

快照測試

只要想確保UI不會意外更改,快照測試是非常有用的工具魏滚。(其實(shí)就是運(yùn)行測試的時(shí)候镀首,把結(jié)果存一份,之后闊以用來對比鼠次,對比不上就測試不通過)

// Snapshot Testing
it('will fail every time', () => {
  const user = {
    createdAt: new Date(),
    id: Math.floor(Math.random() * 20),
    name: 'LeBron James',
  }

  // expect () 返回一個(gè)"期望"的對象
  expect(user).toMatchSnapshot()
})

The first time this test is run, Jest creates a snapshot file that looks like this:

exports[`will fail every time 1`] = `
Object {
  "createdAt": 2019-12-13T02:11:50.571Z,
  "id": 1,
  "name": "LeBron James",
}
`;

Jest使用pretty-format對快照文件進(jìn)行了處理更哄,當(dāng)代碼在審查期間,會讓代碼快照變成讓人類可閱讀的文件腥寇。
jest --updateSnapshot更新快照

測試異步

單元測試的核心之一就是測試方法的行為是否符合預(yù)期成翩,在測試時(shí)要避免一切的依賴,將所有的依賴都mock掉

  1. 回調(diào):一種最常見的異步編程模式
    錯(cuò)誤示例:
  // 不要這么做赦役!
  //  一旦 fetchData 執(zhí)行完畢麻敌,測試隨即完畢,而不會等待 callback 回調(diào)的執(zhí)行掂摔。
test('the data is peanut butter', () => {
  function callback(data) {
    expect(data).toBe('peanut butter')
  }

  fetchData(callback)
})

正確示例:

// 使用一個(gè)名為 done 的參數(shù)术羔,Jest 會一直等待 done 回調(diào)的執(zhí)行,一旦 done 回調(diào)執(zhí)行完畢乙漓,測試即完成级历。
// 如果 done 一直沒有被回調(diào),那么測試失敗叭披。
test('the data is peanut butter', done => {
  function callback(data) {
    expect(data).toBe('peanut butter');
    done()
  }

  fetchData(callback)
})
  1. Promise
    只需要在測試中返回一個(gè) promise寥殖,Jest 會自動等待 promise 被解析處理,如果 promise 被拒絕涩蜘,那么測試失敗嚼贡。
test('the data is peanut butter', () => {
   // expect.assertions 來驗(yàn)證一定數(shù)量的斷言被調(diào)用。 否則一個(gè)fulfilled態(tài)的 Promise 不會讓測試失敗
  expect.assertions(1)
  return fetchData().then(data => {
    expect(data).toBe('peanut butter');
  })
})

test('the fetch fails with an error', () => {
  expect.assertions(1);
  return fetchData().catch(e => {
    expect(e).toMatch('error')
  })
})

5. 在webpack項(xiàng)目中用

  • (1)如果你的項(xiàng)目使用了babel轉(zhuǎn)換皱坛,具體的配置编曼,參見上述第二個(gè)菜單
    (2)如果你的項(xiàng)目沒有使用babel轉(zhuǎn)換,可以配置Jest的transform參數(shù)來進(jìn)行轉(zhuǎn)換
  • 接下來剩辟,讓我們配置Jest,使其優(yōu)雅地處理資源文件往扔,如樣式表和圖像贩猎。 通常,這些文件在測試中無足輕重萍膛,因?yàn)槲覀兛梢园踩豰ock他們吭服。 然而, 如果你使用CSS模塊蝗罗,那么最好是給你的類名查找模擬一個(gè)代理艇棕。
// package.json
{
  "jest": {
    "moduleNameMapper": {
      "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
      "\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js"
    }
  }
}

6. 在react項(xiàng)目中使用

  • (1) 使用create react app:
    它已經(jīng)包含了 可用的 Jest蝌戒! 您只需要添加 react-test-renderer 來渲染快照。
    yarn add --dev react-test-renderer
    (2) 不使用create react app:
    yarn add --dev jest babel-jest @babel/preset-env @babel/preset-react react-test-renderer

  • 配置

// babel.config.js
module.exports = {
  presets: ['@babel/preset-env', '@babel/preset-react'],
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沼琉,一起剝皮案震驚了整個(gè)濱河市北苟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌打瘪,老刑警劉巖友鼻,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闺骚,居然都是意外死亡彩扔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門僻爽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虫碉,“玉大人,你說我怎么就攤上這事胸梆《嘏酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵乳绕,是天一觀的道長绞惦。 經(jīng)常有香客問我,道長洋措,這世上最難降的妖魔是什么济蝉? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮菠发,結(jié)果婚禮上王滤,老公的妹妹穿的比我還像新娘。我一直安慰自己滓鸠,他們只是感情好雁乡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著糜俗,像睡著了一般踱稍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悠抹,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天珠月,我揣著相機(jī)與錄音,去河邊找鬼楔敌。 笑死啤挎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卵凑。 我是一名探鬼主播庆聘,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胜臊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伙判?” 一聲冷哼從身側(cè)響起象对,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澳腹,沒想到半個(gè)月后织盼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酱塔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年沥邻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊娃。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唐全,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蕊玷,到底是詐尸還是另有隱情邮利,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布垃帅,位于F島的核電站延届,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贸诚。R本人自食惡果不足惜方庭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酱固。 院中可真熱鬧械念,春花似錦、人聲如沸运悲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽班眯。三九已至希停,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間署隘,已是汗流浹背脖苏。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留定踱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓恃鞋,卻偏偏與公主長得像崖媚,于是被迫代替她去往敵國和親亦歉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355