自動(dòng)化測試

使用 Karma + Mocha做單元測試

  1. Karma([?kɑrm?] 卡瑪)是一個(gè)測試運(yùn)行器滥玷,它可以呼起瀏覽器虫埂,加載測試腳本,然后運(yùn)行測試用例
  2. Mocha([?mo?k?] 摩卡)是一個(gè)單元測試框架/庫讲婚,它可以用來寫測試用例
  3. Sinon(西農(nóng))是一個(gè) spy / stub / mock 庫总处,用以輔助測試(使用后才能理解)

步驟

  1. 安裝各種工具
    npm i -D karma karma-chrome-launcher karma-mocha karma-sinon-chai mocha sinon sinon-chai karma-chai karma-chai-spies

  2. 創(chuàng)建 karma 配置

     // 新建 karma.conf.js,內(nèi)容如下
     module.exports = function (config) {
         config.set({
    
             // base path that will be used to resolve all patterns (eg. files, exclude)
             basePath: '',
    
    
            // frameworks to use
            // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
            frameworks: ['mocha', 'sinon-chai'],
            client: {
                chai: {
                    includeStack: true
                }
            },

            // list of files / patterns to load in the browser
            files: [
                'dist/**/*.test.js',
                'dist/**/*.test.css'
            ],

            // list of files / patterns to exclude
            exclude: [],

            // preprocess matching files before serving them to the browser
            // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
            preprocessors: {},

            // test results reporter to use
            // possible values: 'dots', 'progress'
            // available reporters: https://npmjs.org/browse/keyword/karma-reporter
            reporters: ['progress'],

            // web server port
            port: 9876,

            // enable / disable colors in the output (reporters and logs)
            colors: true,

            // level of logging
            // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
            logLevel: config.LOG_INFO,

            // enable / disable watching file and executing tests whenever any file changes
            autoWatch: true,

            // start these browsers
            // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
            browsers: ['ChromeHeadless'],

            // Continuous Integration mode
            // if true, Karma captures browsers, runs the tests and exits
            singleRun: false,

            // Concurrency level
            // how many browser should be started simultaneous
            concurrency: Infinity
        })
    }

  1. 創(chuàng)建 test/button.test.js 文件

     const expect = chai.expect;
     import Vue from 'vue'
     import Button from '../src/button'
    
     Vue.config.productionTip = false
     Vue.config.devtools = false
    
     describe('Button', () => {
         it('存在.', () => {
             expect(Button).to.be.ok
         })
         it('可以設(shè)置icon.', () => {
             const Constructor = Vue.extend(Button)
             const vm = new Constructor({
             propsData: {
                 icon: 'settings'
             }
             }).$mount()
             const useElement = vm.$el.querySelector('use')
             expect(useElement.getAttribute('xlink:href')).to.equal('#i-settings')
             vm.$destroy()
         })
         it('可以設(shè)置loading.', () => {
             const Constructor = Vue.extend(Button)
             const vm = new Constructor({
             propsData: {
                 icon: 'settings',
                 loading: true
             }
             }).$mount()
             const useElements = vm.$el.querySelectorAll('use')
             expect(useElements.length).to.equal(1)
             expect(useElements[0].getAttribute('xlink:href')).to.equal('#i-loading')
             vm.$destroy()
         })
         it('icon 默認(rèn)的 order 是 1', () => {
             const div = document.createElement('div')
             document.body.appendChild(div)
             const Constructor = Vue.extend(Button)
             const vm = new Constructor({
             propsData: {
                 icon: 'settings',
             }
             }).$mount(div)
             const icon = vm.$el.querySelector('svg')
             expect(getComputedStyle(icon).order).to.eq('1')
             vm.$el.remove()
             vm.$destroy()
         })
         it('設(shè)置 iconPosition 可以改變 order', () => {
             const div = document.createElement('div')
             document.body.appendChild(div)
             const Constructor = Vue.extend(Button)
             const vm = new Constructor({
             propsData: {
                 icon: 'settings',
                 iconPosition: 'right'
             }
             }).$mount(div)
             const icon = vm.$el.querySelector('svg')
             expect(getComputedStyle(icon).order).to.eq('2')
             vm.$el.remove()
             vm.$destroy()
         })
         it('點(diǎn)擊 button 觸發(fā) click 事件', () => {
             const Constructor = Vue.extend(Button)
             const vm = new Constructor({
             propsData: {
                 icon: 'settings',
             }
             }).$mount()
    
             const callback = sinon.fake();
             vm.$on('click', callback)
             vm.$el.click()
             expect(callback).to.have.been.called
    
         })
     })
    
    
  2. 創(chuàng)建測試腳本
    在 package.json 里面找到 scripts 并改寫 scripts

     "scripts": {
         "dev-test": "parcel watch test/* --no-cache & karma start",
         "test": "parcel build test/* --no-minify && karma start --single-run"
     },
    
    
  3. 運(yùn)行測試腳本

    1. 要么使用 npm run test 一次性運(yùn)行

      截圖
    2. 要么使用 npm run dev-test 進(jìn)行 watch 運(yùn)行

      截圖

成果

如此一來狭归,你開發(fā)的時(shí)候新開一個(gè)命令行窗口運(yùn)行 npm run dev-test 就可以實(shí)時(shí)查看測試結(jié)果夭坪。
如果你只想看一次結(jié)果,就只用運(yùn)行 npm run test

持續(xù)集成

在根目錄新建文件夾.travis.yml过椎,代碼如下

language: node_js
node_js:
  - "8"
  - "9"
  - "10"
addons:
  chrome: stable
sudo: required
before_script:
  - "sudo chown root /opt/google/chrome/chrome-sandbox"
  - "sudo chmod 4755 /opt/google/chrome/chrome-sandbox"

提交代碼到github室梅,并在https://travis-ci.org/
關(guān)聯(lián)github后將自己的項(xiàng)目托管測試

image.png

之后在首頁里等待一段時(shí)間機(jī)器人便會(huì)自動(dòng)測試你的代碼,當(dāng)測試狀態(tài)改變時(shí)便會(huì)向你的郵箱發(fā)郵件
image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潭流,一起剝皮案震驚了整個(gè)濱河市竞惋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灰嫉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗓奢,死亡現(xiàn)場離奇詭異讼撒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)股耽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門根盒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人物蝙,你說我怎么就攤上這事炎滞。” “怎么了诬乞?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵册赛,是天一觀的道長钠导。 經(jīng)常有香客問我,道長森瘪,這世上最難降的妖魔是什么牡属? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮扼睬,結(jié)果婚禮上逮栅,老公的妹妹穿的比我還像新娘。我一直安慰自己窗宇,他們只是感情好措伐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著军俊,像睡著了一般侥加。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝇完,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天官硝,我揣著相機(jī)與錄音,去河邊找鬼短蜕。 笑死氢架,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朋魔。 我是一名探鬼主播岖研,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼警检!你這毒婦竟也來了孙援?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤扇雕,失蹤者是張志新(化名)和其女友劉穎拓售,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镶奉,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡础淤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哨苛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸽凶。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖建峭,靈堂內(nèi)的尸體忽然破棺而出玻侥,到底是詐尸還是另有隱情,我是刑警寧澤亿蒸,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布凑兰,位于F島的核電站掌桩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏票摇。R本人自食惡果不足惜拘鞋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矢门。 院中可真熱鬧盆色,春花似錦、人聲如沸祟剔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽物延。三九已至宣旱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叛薯,已是汗流浹背浑吟。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耗溜,地道東北人组力。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像抖拴,于是被迫代替她去往敵國和親燎字。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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