Introducing Jest

[TOC]

Introducing Jest

Delightful JavaScript Testing.

簡單說Jest就是一個 JS 測試框架

項目主頁

http://facebook.github.io/jest/

為什么選擇 Jest

Jest 是 Facebook 出品的一個測試框架,相對其他測試框架,其一大特點就是就是內置了常用的測試工具,比如自帶斷言、測試覆蓋率工具,實現了開箱即用。

而作為一個面向前端的測試框架, Jest 可以利用其特有的快照測試功能,通過比對 UI 代碼生成的快照文件,實現對 React 等常見框架的自動測試。

此外, Jest 的測試用例是并行執行的,而且只執行發生改變的文件所對應的測試,提升了測試速度。目前在 Github 上其 star 數已經破萬;而除了 Facebook 外,業內其他公司也開始從其它測試框架轉向 Jest ,比如 Airbnb 的嘗試 ,相信未來 Jest 的發展趨勢仍會比較迅猛。

適用范圍

不僅能測試RN,甚至能測試Vue:http://facebook.github.io/jest/docs/en/testing-frameworks.html

Although Jest may be considered a React-specific test runner, in fact it is a universal testing platform, with the ability to adapt to any JavaScript library or framework.

特性

image.png

Easy Setup

完整又輕松的JS測試方案,安裝、設置簡單,與工程代碼隔離。

Instant Feedback

多線程測試,即刻的測試結果反饋。只運行那些和更改了的文件有關的測試,提高測試速度。

Snapshot

還有一個奇妙的功能叫snapshot:對React trees(VDOM) 進行檢測,比對UI代碼分析改動。

安裝

Install Jest using npm:

npm install --save-dev jest

Or via yarn:

yarn add --dev jest

使用

Jest 內部使用了 Jasmine 2 來進行測試,故其用例語法與 Jasmine 相同。

First, create a sum.js file:

function sum(a, b) {
  return a + b;
}
module.exports = sum;

Then, create a file named sum.test.js. This will contain our actual test:

const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

Add the following section to your package.json:

{
  "scripts": {
    "test": "jest"
  }
}

Finally, run npm test and Jest will print this message:

PASS  ./sum.test.js
? adds 1 + 2 to equal 3 (5ms)

You just successfully wrote your first test using Jest!

在上述代碼中,expect(sum(1, 2))返回一個“期望”對象,通常我們不會對這個期望對象進行匹配,而是由matchers完成,在這里.toBe(3)便是這個matchers,當Jest運行時,它會跟蹤所有失敗的matchers以便打印正確的錯誤信息給我們。

toBe使用 === 來測試全等于,如果我們想檢查一個對象object中的值,使用toEqual來替代,toEqual遞歸遍歷檢查對象或數組里的每一個領域。
To learn about the other things that Jest can test, seeUsing Matchers.

測試覆蓋率

Jest 內置了測試覆蓋率工具 istanbul,要開啟,可以直接在命令中添加 --coverage 參數,或者在 package.json 文件進行更詳細的配置
運行 istanbul 除了會再終端展示測試覆蓋率情況,還會在項目下生產一個 coverage 目錄,內附一個測試覆蓋率的報告,讓我們可以清晰看到分支的代碼的測試情況。

Snapshot Test

針對前端框架的測試, Jest 的一大特色就是提供了快照測試功能。首次運行快照測試,會讓 UI 框架生產一個可讀的快照,再次測試時便會通過比對快照文件和新 UI 框架產生的快照判斷測試是否通過。

import 'react-native';
import React from 'react';
import App from '../App';

// Note: test renderer must be required after react-native.
import renderer from 'react-test-renderer';

it('renders correctly', () => {
  const tree = renderer.create(
    <App />
  ).toJSON();
  expect(tree).toMatchSnapshot();
});

運行測試即可生成一個快照文件。這個文件以可讀的形式展示出了React渲染出的DOM結構。相比于肉眼觀察效果,快照測試直接由Jest進行比對、速度更快。
在你下一次run tests的時候,rendered output 會和先前生成的快照文件進行對比。因此快照文件應該被包含于git追蹤。
當快照測試失敗時,你需要去判定這是你需要的修改還是無意中改動的。若是你需要的修改,調用 jest -u 去更新快照。

參考資料

  1. https://juejin.im/post/597aa518f265da3e345f3262
  2. https://segmentfault.com/a/1190000008628067
  3. http://facebook.github.io/jest/docs/en/tutorial-react-native.html
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,823評論 18 139
  • React Native 單元測試目前網上的資料比較少,大多數都是點到為止,并沒有什么實際用處,而在Github上...
    大斜丸閱讀 8,122評論 3 12
  • iOS資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列的資源整理。...
    chy1ee閱讀 8,851評論 5 83
  • iOS資源大全中文版 轉載 :https://github.com/phlls/awesome-ios-cn 另一...
    喜歡就可以閱讀 10,219評論 8 132
  • iOS資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列的資源整理。...
    CocoaC_Wang閱讀 2,901評論 1 10