大前端測試

引子

在之前分享的編輯器相關(guān)文章里饲齐,講到了語雀是全棧js開發(fā)的,并且號稱團(tuán)隊沒有測試工程師咧最,參考文章里面有放關(guān)于全棧 JavaScript 測試的相關(guān)總結(jié)分享捂人,今天我們就聊一聊前端的測試。

單元測試

  1. 定義:

在計算機(jī)編程中矢沿,單元測試(Unit Testing)又稱為模塊測試滥搭,是針對程序模塊(軟件設(shè)計的最小單位)來進(jìn)行正確性檢驗(yàn)的測試工作。
程序單元是應(yīng)用的最小可測試部件捣鲸。在過程化編程中瑟匆,一個單元就是單個程序、函數(shù)栽惶、過程等愁溜;對于面向?qū)ο缶幊蹋钚卧褪欠椒ㄍ獬Вɑ悾ǔ悾┟嵯蟆⒊橄箢悺⒒蛘吲缮悾ㄗ宇悾┲械姆椒ā?/p>

  1. 意義
  • 提升能力
  • 提升效率:及早發(fā)現(xiàn)問題
  • 追求卓越:有助于開發(fā)人員去思考代碼結(jié)構(gòu)的設(shè)計汁蝶,讓代碼更加有利于測試
  • 覆蓋全面:能夠覆蓋到QA測試覆蓋不到的情況
  • 大型項(xiàng)目渐扮,協(xié)同開發(fā),公共抽離組件會出現(xiàn)一些問題掖棉,有了單測后墓律,更強(qiáng)壯,更易讀幔亥,升級時耻讽,回歸測試任務(wù)少,提升公共組件的質(zhì)量紫谷。
  1. 測試方法論 TDD&BDD
  • TDD:Test-driven development 測試驅(qū)動開發(fā)
    TDD 從測試的角度來檢驗(yàn)整個項(xiàng)目齐饮。大概的流程是先針對每個功能點(diǎn)抽象出接口代碼捐寥,然后編寫單元測試代碼,接下來實(shí)現(xiàn)接口祖驱,運(yùn)行單元測試代碼握恳,循環(huán)此過程,直到整個單元測試都通過捺僻。
  • BDD:Behavior Driven Development 行為驅(qū)動開發(fā)
    是通過編寫行為和規(guī)范來驅(qū)動軟件開發(fā)乡洼。更注重功能本身。
  1. 原則:FIRST
  • F fast 快速 過程快
  • I Isolate 隔離 測試用例應(yīng)當(dāng)獨(dú)立執(zhí)行匕坯,避免一個測試結(jié)果依賴于另外一個束昵。需要把測試分解成盡可能小的單元,這將幫我們確定在錯誤發(fā)生時的確切代碼位置葛峻。
  • R Repeatable 可重復(fù):多次運(yùn)行測試應(yīng)該產(chǎn)生相同的結(jié)果锹雏,如果不確定,就不知道哪些結(jié)果是有效的术奖,哪些又是無效的礁遵。另外,反復(fù)性可以確保我們的測試不依賴于外部因素(諸如網(wǎng)絡(luò)或 CPU 負(fù)載)采记。
  • S Self-validating 自我驗(yàn)證無需人工
  • T Timely 及時佣耐,上線前
  1. 測什么
    結(jié)果正確
    邊界條件檢查
    反向關(guān)聯(lián)(加密解密 讀寫操作)
    強(qiáng)制錯誤條件

  2. 測試的核心
    斷言(assert)即表達(dá)程序設(shè)計人員對于系統(tǒng)應(yīng)達(dá)到狀態(tài)的一種預(yù)期。

前端測試框架:

幫助我們把測試代碼抽離出來唧龄,作為一個整體結(jié)構(gòu)化地去設(shè)計測試用例兼砖,放置到專門測試文件,然后也可以實(shí)現(xiàn)自動運(yùn)行以及顯示測試結(jié)果既棺。
介紹:
Mocha讽挟,Jest,Jasmine 可以說都是測試框架援制,可以達(dá)到之前說的戏挡,抽離,結(jié)構(gòu)化晨仑,自動運(yùn)行等等,其中 Jest 是一個相當(dāng)全面的框架拆檬,且零配置洪己,同時需要注意的是 Jest 也是基于 Jasmine 的,所以 Jest 的一些語法和 Jasmine 一模一樣竟贯,連報錯有時都會相同答捕。
Chai,Should 都屬于斷言庫屑那,它們的 API 相對測試框架自帶的斷言 API 更加語義化拱镐,更好用艘款,可以和上面的測試框架結(jié)合著用。
Karma 是一個 Test-Runner沃琅,可以說是凌駕測試框架之上哗咆,可以讓給你的瀏覽器自動跑所有的測試用例。
Enzyme是由airbnb開發(fā)的React單元測試工具益眉。它擴(kuò)展了React的TestUtils并通過支持類似jQuery的find語法可以很方便的對render出來的結(jié)果做各種斷言晌柬。

Jest

https://github.com/facebook/jest star 36.2k
Jest是Facebook開發(fā)的一個測試框架,它集成了測試執(zhí)行器郭脂、斷言庫年碘、spy、mock展鸡、snapshot和測試覆蓋率報告等功能屿衅。React項(xiàng)目本身也是使用Jest進(jìn)行單測的,因此契合度相當(dāng)高莹弊。

  • 自帶斷言函數(shù)
exspect(運(yùn)行結(jié)果).toBe(期望的結(jié)果);
//常見斷言方法
expect({a:1}).toBe({a:1})//判斷兩個對象是否相等
expect(1).not.toBe(2)//判斷不等
expect({ a: 1, foo: { b: 2 } }).toEqual({ a: 1, foo: { b: 2 } })//判斷相等
expect(n).toBeNull(); //判斷是否為null
expect(n).toBeUndefined(); //判斷是否為undefined
expect(n).toBeDefined(); //判斷結(jié)果與toBeUndefined相反
expect(n).toBeTruthy(); //判斷結(jié)果為true
expect(n).toBeFalsy(); //判斷結(jié)果為false
expect(value).toBeGreaterThan(3); //大于3
expect(value).toBeGreaterThanOrEqual(3.5); //大于等于3.5
expect(value).toBeLessThan(5); //小于5
expect(value).toBeLessThanOrEqual(4.5); //小于等于4.5
expect(value).toBeCloseTo(0.3); // 浮點(diǎn)數(shù)判斷相等
expect('Christoph').toMatch(/stop/); //正則表達(dá)式判斷
expect(['one','two']).toContain('one'); //包含
  • 支持異步測試
  • 支持Dom測試
  • Mock Functions

一個簡單的示例:

  1. 安裝 npm install --save-dev jest
  2. 新建測試文件 unit.test.js
import {dealData} from "./src/util/Util";

describe("dealData測試",()=>{
  test('dealData 1 GB to equal 1 GB', () => {
    expect(dealData(1, 'GB')).toEqual({
      value:1,
            unit:'GB'
    });
  });
  //輸入數(shù)據(jù)大于1024GB則轉(zhuǎn)換為TB
  test('dealData 2048 GB to equal 2 TB', () => {
    expect(dealData(2048, 'GB')).toEqual({
      value:2,
            unit:'TB'
    });
  });
  //輸入數(shù)據(jù)大于1024*1024*10GB則轉(zhuǎn)換為PB
  test('dealData 20971520 GB to equal 20 PB', () => {
    expect(dealData(20971520, 'GB')).toEqual({
      value:20,
            unit:'PB'
    });
  });
  //PB為最大單位涤久,不進(jìn)行進(jìn)一步處理
  test('dealData 419430400 GB to equal 20 PB', () => {
    expect(dealData(41943040000, 'GB')).toEqual({
      value:40000,
            unit:'PB'
    });
  });
  //其他單位不進(jìn)行轉(zhuǎn)換
  test('dealData 1 KB to equal 1 KB', () => {
    expect(dealData(1, 'KB')).toEqual({
      value:1,
            unit:'KB'
    });
  });
  //接口異常時數(shù)據(jù)不進(jìn)行轉(zhuǎn)換
  test('dealData --  to equal --', () => {
    expect(dealData('--', '')).toEqual({
      value:'--',
            unit:''
    });
  });
})

注:dealData 是一個抽離出來的工具函數(shù),幫助動態(tài)處理業(yè)務(wù)數(shù)據(jù)單位

  1. package.json中增加代碼
{
  "scripts": {
    "test": "jest"
  }
}
  1. 運(yùn)行npm run test
    image.png

Enzyme

https://github.com/enzymejs/enzyme star 19.7k
React測試必須使用官方的測試工具庫箱硕,但是它用起來不夠方便拴竹,所以有人做了封裝,推出了一些第三方庫剧罩,其中Airbnb公司的Enzyme最容易上手栓拜。

項(xiàng)目實(shí)戰(zhàn)時,結(jié)合jest和enzyme惠昔。

Enzyme為我們提供來三種渲染組件的方法shallow幕与、render、mount镇防。
shallow 方法就是官方的shallow rendering的封裝啦鸣。
render 方法將React組件渲染成靜態(tài)的HTML字符串,然后分析這段HTML代碼的結(jié)構(gòu)来氧,返回一個對象诫给。它跟shallow方法非常像,主要的不同是采用了第三方HTML解析庫Cheerio啦扬,它返回的是一個Cheerio實(shí)例對象中狂。
mount方法用于將React組件加載為真實(shí)DOM節(jié)點(diǎn)。

測試登錄交互例子:

import Login from 'pages/Login';
import React from 'react';
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import { mount } from 'enzyme';
configure({ adapter: new Adapter() });

const wrapper = mount(<Login />);
describe('', () => {
 it('標(biāo)題顯示', () => {
   const title = wrapper.find('.title').text();
   expect(title).toBe('登錄');
 })
 const accountInput = wrapper.find('.account').find('input');
 const accountTitle = wrapper.find('.account .name').find('span');
 it('輸入不合法賬號', () => {
     const event = {
         target: {
           value: 'abc123'
       }
     }
   accountInput.simulate('change', event);
   expect(accountTitle.text()).toBe('賬戶輸入錯誤扑毡,請重新輸入');
 })
})

uirecorder

https://github.com/alibaba/uirecorder star 1.8k
UI Recorder 是一款面向多端的 UI 自動化錄制工具胃榕,類似于Selenium IDE 但比Selenium IDE 更加強(qiáng)大!
UI Recorder 非常簡單易用,零成本解決測試回歸問題瞄摊。

功能:

  1. 支持所有用戶行為: 鍵盤事件, 鼠標(biāo)事件, alert, 文件上傳, 拖放, svg, shadow dom
  2. 全平臺支持勋又,移動端 Android, iOS 錄制, 基于 Macaca 實(shí)現(xiàn)
  3. 無干擾錄制: 和正常測試無任何區(qū)別苦掘,無需任何交互
  4. 錄制用例存儲在本地
  5. 支持豐富的斷言類型: val,text,displayed,enabled,selected,attr,css,url,title,cookie,localStorage,sessionStorage
  6. 支持圖片對比
  7. 支持強(qiáng)大的變量字符串
  8. 支持公共測試用例: 允許用例中動態(tài)調(diào)用另外一個
  9. 支持并發(fā)測試
  10. 支持多國語言: 英文, 簡體中文, 繁體中文
  11. 支持單步截圖
  12. 支持HTML報告和JUnit報告
  13. 全系統(tǒng)支持: Windows, Mac, Linux
  14. 基于Nodejs的測試用例: jWebDriver

官方教程:https://www.yuque.com/artist/uirecorder/yd7ztf

  • 初始化工程
  • 開始錄制,進(jìn)行界面操作楔壤,可以添加斷言鹤啡,懸停等等
  • 結(jié)束錄制,自動生成腳本文件
  • 利用已有腳本文件進(jìn)行回歸測試
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挺邀,一起剝皮案震驚了整個濱河市揉忘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌端铛,老刑警劉巖泣矛,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異禾蚕,居然都是意外死亡您朽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門换淆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哗总,“玉大人,你說我怎么就攤上這事倍试⊙肚” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵县习,是天一觀的道長涮母。 經(jīng)常有香客問我,道長躁愿,這世上最難降的妖魔是什么叛本? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮彤钟,結(jié)果婚禮上来候,老公的妹妹穿的比我還像新娘。我一直安慰自己逸雹,他們只是感情好营搅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梆砸,像睡著了一般剧防。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辫樱,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音俊庇,去河邊找鬼狮暑。 笑死鸡挠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搬男。 我是一名探鬼主播拣展,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缔逛!你這毒婦竟也來了备埃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤褐奴,失蹤者是張志新(化名)和其女友劉穎按脚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敦冬,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辅搬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脖旱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堪遂。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萌庆,靈堂內(nèi)的尸體忽然破棺而出溶褪,到底是詐尸還是另有隱情,我是刑警寧澤践险,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布猿妈,位于F島的核電站,受9級特大地震影響捏境,放射性物質(zhì)發(fā)生泄漏于游。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一垫言、第九天 我趴在偏房一處隱蔽的房頂上張望贰剥。 院中可真熱鬧,春花似錦筷频、人聲如沸蚌成。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽担忧。三九已至,卻和暖如春坯癣,著一層夾襖步出監(jiān)牢的瞬間瓶盛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惩猫,地道東北人芝硬。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像轧房,于是被迫代替她去往敵國和親拌阴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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