React Native單元測試--Jest+Enzyme+storybook

React Native的單元測試Jest+Enzyme+storybook

demo

配置

Jest配置

Jest

1. 安裝

JestReact Native利用react-native init AwesomeProject創(chuàng)建項目的時候就會默認(rèn)安裝了凛俱,這里就不多介紹了院促。

在你使用 create-react-appreact-native init 創(chuàng)建你的 React 或 React Native 項目時懂版,Jest 都已經(jīng)被配置好并可以使用了米碰。在 __tests__文件夾下放置你的測試用例届垫,或者使用 .spec.js.test.js 后綴給它們命名。不管你選哪一種方式恋拷,Jest 都能找到并且運行它們响巢。

Enzyme配置

Enzyme

1. 安裝
yarn add enzyme enzyme-adapter-react-16 --dev

每個適配器可能還有其他的對等體依賴關(guān)系,您也需要安裝它們重抖。舉例來說露氮, enzyme-adapter-react-16對應(yīng)用同版本的依賴react@16react-dom@16react-test-renderer@16钟沛。

2. 初始化配置

由于React Native有很多環(huán)境依賴性畔规,如果沒有主機設(shè)備,很難模擬恨统。所以還需要添加react-native-mock叁扫,如下

yarn add react-native-mock --dev
3. 初始化配置

做后需要配置enzyme的適配器,一個一般要根據(jù)react的版本配置畜埋,現(xiàn)在項目中用的是react@16莫绣,所以如下配置

import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import 'react-native-mock/mock';

Enzyme.configure({ adapter: new Adapter() });

還需要讓此配置,在所以test之前執(zhí)行悠鞍,進行如下設(shè)置

// package.json
// ...
"jest": {
    // ...
    "setupFiles": [
      "<rootDir>/__tests__/Setup"
    ]
  }
// ...

Storybook配置

Storybook

1. 安裝

執(zhí)行下面三條指令就能完成安裝

cd my-project-directory
npm i -g @storybook/cli
getstorybook
2. 運行
npm run storybook

運行

Jest 運行

  1. 運行全部測試用例

    npm jest
    
  2. 運行單個測試用例对室,可以借助webstorm工具,來運行咖祭,非常方便

    image

Storybook運行

  1. 在開發(fā)組件的時候要把storybook運行起來掩宜,并寫stories

    npm run storybook
    

用例

Jest 常用api用法實例

中文 英文
匹配器 Matchers
測試異步代碼 Asynchronous
模擬器 Mock Functions
全局函數(shù) Global Functions

API集合

全局方法
匹配器

Enzyme 常用api用法實例

enzyme有3種渲染方式:rendermount么翰、shallow牺汤,先了解下區(qū)別。

render硬鞍、mount慧瘤、shallow的區(qū)別

render采用的是第三方庫Cheerio的渲染,渲染結(jié)果是普通的html結(jié)構(gòu)固该,對于snapshot使用render比較合適。

shallow和mount對組件的渲染結(jié)果不是html的dom樹糖儡,而是react樹伐坏,如果你chrome裝了react devtool插件,他的渲染結(jié)果就是react devtool tab下查看的組件結(jié)構(gòu)握联,而render函數(shù)的結(jié)果是element tab下查看的結(jié)果桦沉。

這些只是渲染結(jié)果上的差別每瞒,更大的差別是shallow和mount的結(jié)果是個被封裝的ReactWrapper,可以進行多種操作纯露,譬如find()剿骨、parents()、children()等選擇器進行元素查找埠褪;state()浓利、props()進行數(shù)據(jù)查找,setState()钞速、setprops()操作數(shù)據(jù)贷掖;simulate()模擬事件觸發(fā)。

shallow只渲染當(dāng)前組件渴语,只能能對當(dāng)前組件做斷言苹威;mount會渲染當(dāng)前組件以及所有子組件,對所有子組件也可以做上述操作驾凶。一般交互測試都會關(guān)心到子組件牙甫,我使用的都是mount。但是mount耗時更長调违,內(nèi)存啥的也都占用的更多腹暖,如果沒必要操作和斷言子組件,可以使用shallow翰萨。

交互測試

主要利用simulate()接口模擬事件脏答,實際上simulate是通過觸發(fā)事件綁定函數(shù),來模擬事件的觸發(fā)亩鬼。觸發(fā)事件后殖告,去判斷props上特定函數(shù)是否被調(diào)用,傳參是否正確雳锋;組件狀態(tài)是否發(fā)生預(yù)料之中的修改黄绩;某個dom節(jié)點是否存在是否符合期望。

官方api

組件測試

  1. 用storybook做組件測試玷过,既可以存儲組件快照爽丹,也可以快速查看組件樣式

    例如:

    // 
    import React from 'react';
    import { storiesOf } from '@storybook/react-native';
    import { action } from '@storybook/addon-actions';
    import { linkTo } from '@storybook/addon-links';
    import * as img from './img';
    
    import ImageButton from './ImageButton';
    
    storiesOf('<ImageButton />', module)
      .add('normal', () =>
        <ImageButton
          title={'確認(rèn)'}
          imageName={img.ICON_DENE}
          onPress={action('點擊')}
        />
      )
      .add('cancel', () =>
        <ImageButton
          title={'取消'}
          imageName={img.ICON_CANCEL}
          onPress={action('點擊')}
        />
      )
    ;
    
  2. 效果圖如下


    image
    image
    image
    image
  3. 根據(jù)組件的需要,進行一些函數(shù)的測試辛蚊,如下

    // imageButton.test.js
    import 'react-native'
    import React from 'react';
    import { mount, shallow } from 'enzyme';
    import ImageButton from '../../src/components/ImageButton';
    
    test('<ImageButton/>', () => {
      let i = 0
      const onPress = () => I++
      const wrapper = shallow(<ImageButton title={'1'} imageName={null} onPress={onPress}/>);
      expect(wrapper.instance().props.title).toBe('1'); // uses the right handler
      expect(wrapper.prop('onPress')).toBe(onPress)
      expect(i).toBe(0);
      wrapper.simulate('press');
      expect(i).toBe(1);
    });
    

API測試

  1. API測試主要進行粤蝎,返回狀態(tài)碼(200、500袋马、502等)的驗證初澎,必要字段的返回,指定參數(shù)傳入指定數(shù)據(jù)返回等驗證虑凛,API測試可以在和后臺定義接口的時候就寫碑宴,等后臺接口寫好后直接跑一下測試用例就可驗證软啼。

    describe('api', () => {
    // ...
      test('/api/config', () => {
        expect.assertions(1); // 異步斷言數(shù)量
        const param = Object.assign(defaultParam, {});
        const path = '/api/config';
        return api.post(path, param)
          .then(response => response.data)
          .then(response => {
            expect(response.errorCode).toBe(200);
          })
      });
    // ....
    
    });
    

參考文檔

Engine單元測試調(diào)研文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市延柠,隨后出現(xiàn)的幾起案子祸挪,更是在濱河造成了極大的恐慌,老刑警劉巖贞间,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贿条,死亡現(xiàn)場離奇詭異,居然都是意外死亡榜跌,警方通過查閱死者的電腦和手機闪唆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钓葫,“玉大人悄蕾,你說我怎么就攤上這事〈「。” “怎么了帆调?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豆同。 經(jīng)常有香客問我番刊,道長,這世上最難降的妖魔是什么影锈? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任芹务,我火速辦了婚禮,結(jié)果婚禮上鸭廷,老公的妹妹穿的比我還像新娘枣抱。我一直安慰自己,他們只是感情好辆床,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布佳晶。 她就那樣靜靜地躺著,像睡著了一般讼载。 火紅的嫁衣襯著肌膚如雪轿秧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天咨堤,我揣著相機與錄音菇篡,去河邊找鬼。 笑死吱型,一個胖子當(dāng)著我的面吹牛逸贾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播津滞,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼铝侵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了触徐?” 一聲冷哼從身側(cè)響起咪鲜,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撞鹉,沒想到半個月后疟丙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鸟雏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年享郊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孝鹊。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡炊琉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出又活,到底是詐尸還是另有隱情苔咪,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布柳骄,位于F島的核電站团赏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耐薯。R本人自食惡果不足惜舔清,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曲初。 院中可真熱鬧体谒,春花似錦、人聲如沸复斥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽目锭。三九已至评汰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痢虹,已是汗流浹背被去。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奖唯,地道東北人惨缆。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坯墨。 傳聞我的和親對象是個殘疾皇子寂汇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • This project was bootstrapped with Create React App. Belo...
    unspecx閱讀 5,135評論 0 2
  • React Native 單元測試目前網(wǎng)上的資料比較少,大多數(shù)都是點到為止捣染,并沒有什么實際用處骄瓣,而在Github上...
    大斜丸閱讀 8,097評論 3 12
  • 什么是單元測試 單元測試(unit testing)是指對軟件中的最小可測試單元進行檢查和驗證。 簡單來說耍攘,單元就...
    kyleBoy閱讀 1,536評論 0 3
  • React項目的單元測試 React的組件結(jié)構(gòu)和JSX語法榕栏,對上一章的內(nèi)容來講進行測試顯得很勉強。React官方已...
    韓子盧閱讀 1,666評論 1 4
  • 命運盛開一朵巨大的花蕾各, 花瓣是它的羽翼扒磁, 花芯是它愛的語言, 命運連結(jié)一只又一只蜜蜂式曲, 噩運殺死一只又一只蜜蜂妨托。 ...
    nokkyt閱讀 231評論 0 0