自動化測試

  1. 首先我們來看下什么是BDD双藕,什么是TDD
    測試風(fēng)格:測試驅(qū)動開發(fā)(Test-Driven Development,TDD)、(Behavior Driven Development,BDD)行為驅(qū)動開發(fā)均是敏捷開發(fā)方法論浆劲。 TDD關(guān)注所有的功能是否被實(shí)現(xiàn)(每一個功能都必須有對應(yīng)的測試用 例),suite配合test利用assert('tobi' == user.name); BDD關(guān)注整體行為是否符合整體預(yù)期,編寫的每一行代碼都有目的提 供一個全面的測試用例集。expect/should,describe配合it利用自然語 言expect(1).toEqual(fn())執(zhí)行結(jié)果丢烘。

  2. 接下來我們看下單元測試的運(yùn)行流程


    image.png

來開始一個單元測試

unit測試是把代碼看成是一個個的組件俱箱。從而實(shí)現(xiàn)每一個組件的單獨(dú)測試国瓮,測試內(nèi)容主要是組件內(nèi)每一個函數(shù)的返回結(jié)果是不是和期望值一樣。
這里我們使用karma,官網(wǎng)地址為: karma: https://karma-runner.github.io/latest/index.html
安裝karma:
karma-jasmine jasmine-core是斷言庫

npm install karma --save-dev
npm install karma-jasmine karma-chrome-launcher jasmine-core --save-dev

然后執(zhí)行karma init
這里會有很多步選擇狞谱,我們都默認(rèn)就好了乃摹,但是選擇瀏覽器時我們選擇phantomjs
做完這些操作后,會生成一個karma.conf.js文件如下:

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: ['jasmine'],

    files: [
        "unit/**/*.js", // 需要被測試的文件
        "unit/**/*.spec.js" // 測試文件
    ],

    // 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
    // 在將匹配的文件提供給瀏覽器之前跟衅,對它們進(jìn)行預(yù)處理
    preprocessors: { // 哪些文件需要通過覆蓋率檢查
      'unit/**/*.js': ['coverage']
    },

    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    // 使用測試結(jié)果報告程序
    reporters: ['progress','coverage'], // 進(jìn)度孵睬,覆蓋率(需要裝karma-coverage)
    coverageReporter: { // 生成的測試報表
      type : 'html',
      dir : 'docs/coverage/'
    },

    // 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
    // 日志相關(guān)配置
    logLevel: config.LOG_INFO,

    // enable / disable watching file and executing tests whenever any file changes
    // 啟用/禁用監(jiān)視文件并在任何文件更改時執(zhí)行測試(熱更新)
    autoWatch: true,

    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['PhantomJS'], // 選擇的瀏覽器

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    // 持續(xù)集成模式
    singleRun: true, // 使用無頭瀏覽器這里必須設(shè)置為true

    // Concurrency level
    // how many browser should be started simultaneous
    // 并發(fā)級別
    concurrency: Infinity
  })
}

我們在util文件夾中新建一個文件index.js對其進(jìn)行測試,內(nèi)容如下

window.add = function (a) {
  return a + 1;
}

再新建一個測試文件index.spec.js(或indexSpec.js)

escribe("測試基本函數(shù)的api",function () {
  it("+1函數(shù)的應(yīng)用",function(){
    expect(window.add(1)).toBe(2)
  })
})

這時就可以跑執(zhí)行karma start開始測試了
到這里有一個問題,如果代碼中有if,else怎么辦伶跷。這時我們就需要代碼覆蓋率檢查了掰读。下載 karma-coverage,如果報錯可能是缺了karma-phantomjs-launcher和phantomjs這兩個包秘狞。在上面的配置文件中我已經(jīng)進(jìn)行了配置,現(xiàn)在直接跑就ok了蹈集。

頁面測試: e2e

e2e測試是把我們的程序堪稱是一個黑盒子烁试,我不懂你內(nèi)部是怎么實(shí)現(xiàn)的,我只負(fù)責(zé)打開瀏覽器拢肆,把測試內(nèi)容在頁面上輸入一遍减响,看是不是我想要得到的結(jié)果。
這里我們使用selenium-webdriver來進(jìn)行e2e測試郭怪,e2e測試需要一個瀏覽器的執(zhí)行環(huán)境辩蛋,所以首先在selenium-webdriver官網(wǎng)上下載瀏覽器驅(qū)動,然后安裝selenium-webdriver

在e2e文件夾中新建一個baidu.spec.js文件移盆,內(nèi)容如下

const {Builder, By, Key, until} = require('selenium-webdriver');

(async function example() {
  let driver = await new Builder().forBrowser('firefox').build();
  try {
    await driver.get('http://www.baidu.com/'); // 要測試網(wǎng)站的網(wǎng)址
    await driver.findElement(By.name('wd')).sendKeys('webdriver', Key.RETURN); // 通過名class名為wd的input框搜索webdriver
    await driver.wait(until.titleIs('webdriver_百度搜索'), 1000); // 等待1s看title是否等于webdriver_百度搜索
  } finally {
    await driver.quit(); // 無論是否成功悼院,退出driver
  }
})();

然后我們運(yùn)行: node ./e2e/baidu.spec.js

UI測試
PhantomCSS是一個很好的UI測試插件,但是我們這里使用backstopjs來做演示
安裝backstopjs后咒循,我們backstop init
這時會生成一個backstop_data文件夾,和backstop.json文件
我們首先來看下backstop_data文件夾結(jié)構(gòu)

+-- backstop_data  
    +-- bitmaps_reference -- 放置ui切圖的文件夾  
    +-- bitmaps_test -- 生成的測試圖例地址
    +-- engine_scripts
        +-- casper -- 在無頭瀏覽器中操作鼠標(biāo)
        +-- chromy
        +-- puppet
        +-- cookies.json -- 如果網(wǎng)頁需要配置cookie在這里配置

再來看下backstop.json文件配置

{
  "id": "yd", // 項(xiàng)目名稱
  "viewports": [ // 設(shè)備配置項(xiàng)
    {
      "label": "phone",
      "width": 375,
      "height": 667
    },
    {
      "label": "tablet",
      "width": 1024,
      "height": 768
    }
  ],
  "onBeforeScript": "puppet/onBefore.js", // 引擎据途, 在engine_scripts文件夾中
  "onReadyScript": "puppet/onReady.js", // 同上
  "scenarios": [ // 配置截圖
    {
      "label": "qqmap", 
      "cookiePath": "backstop_data/engine_scripts/cookies.json", // cookie地址
      "url": "https://map.qq.com/m/", // 要被測試頁面地址
      "referenceUrl": "",
      "readyEvent": "",
      "readySelector": "",
      "delay": 0,
      "hideSelectors": [],
      "removeSelectors": [],
      "hoverSelector": "",
      "clickSelector": "",
      "postInteractionWait": 0,
      "selectors": [],
      "selectorExpansion": true,
      "expect": 0,
      "misMatchThreshold" : 0.1,
      "requireSameDimensions": true
    }
  ],
  "paths": {
    "bitmaps_reference": "backstop_data/bitmaps_reference", // 美工圖放的地址
    "bitmaps_test": "backstop_data/bitmaps_test", // 生成測試圖的地址
    "engine_scripts": "backstop_data/engine_scripts", // 默認(rèn)js引擎
    "html_report": "docs/backstop_data/html_report", // 生成報表地址
    "ci_report": "docs/backstop_data/ci_report" // ci報表
  },
  "report": ["browser"],
  "engine": "puppeteer",
  "engineOptions": {
    "args": ["--no-sandbox"]
  },
  "asyncCaptureLimit": 5,
  "asyncCompareLimit": 50,
  "debug": false,
  "debugWindow": false
}

最后執(zhí)行backstop test進(jìn)行測試

接口測試

接口測試我們這里使用mocha
首先安裝mocha
我們新建一個app.js文件,對app.js文件的內(nèi)容進(jìn)行測試

var express = require("express");
var app = express();
app.get("/test",function(req,res){
    res.send({
        result:"Hello World"
    })
});
var server = app.listen(3000,function(){
    console.log("demo app 啟動");
});
module.exports = app;

我們再創(chuàng)建測試文件router.spec.js

const axios = require("axios");
describe("node接口", function () {
  it("test接口測試", function (done) {
    axios.get('http://localhost:3000/test')
      .then(function (response) {
        if (response.data.result == "Hello World") {
          done();
        } else {
          done(new Error("數(shù)據(jù)請求格式錯誤"));
        }
      })
      .catch(function (error) {
        done(error);
      });
  });
});

// 高級寫法
const superagent = require("superagent");
const app = require("./app");
function request(){
    return superagent(app.listen())
}
request()
.get("/test")
.expect("Content-Type",/json/)
.expect(200)
.end(function(err,res){
    if(res.data == "Hello World"){
        done();
    }else{
        done(err);
    }
})

最后新建mochaRunner.js文件如下叙甸,這里我們需要下載mochawesome來生成報表

const Mocha = require("mocha");
const mocha = new Mocha({
    reporter: 'mochawesome', // 安裝mochawesome(生成報表的包)
    reporterOptions:{
        reportDir:"./docs/mochawesome-reporter" // 生成報表位置
    }
});
mocha.addFile("./service/router.spec.js");
mocha.run(function(){
    console.log("done");
    process.exit(); // 退出進(jìn)程颖医,不退出會卡死
});

這時我們運(yùn)行node ./mochaRunner.js

如果我們需要將上面的的一起測試,只需要: npm run unit && npm run e2e && npm run ui就OK了

JavaScript Lint&Hint

目的:檢測JavaScript代碼標(biāo)準(zhǔn) 原因:JavaScript代碼詭異裆蒸,保證團(tuán)隊(duì)代碼規(guī)范 lint:http://www.jslint.com/
hint: http://www.jshint.com/
搭配自動化任務(wù)管理工具完善自動化測試grunt- jshint熔萧、grunt-jslint

下面來介紹一些工程用的測試包

  1. nightwatchjs(vue專用)
  2. rize+puppeteer+rize
  3. 阿里的f2etest(自動化錄制)
    這里我們需要注意下,在f2etest中有UI recorder僚祷,這個東西會打開兩個瀏覽器佛致,因?yàn)橛行┚W(wǎng)站像驗(yàn)證碼每次都不一樣,第二臺瀏覽器會與第一個比較辙谜,結(jié)果相同就算成功
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俺榆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子装哆,更是在濱河造成了極大的恐慌罐脊,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜕琴,死亡現(xiàn)場離奇詭異萍桌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凌简,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門上炎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人号醉,你說我怎么就攤上這事反症⌒量椋” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵铅碍,是天一觀的道長润绵。 經(jīng)常有香客問我,道長胞谈,這世上最難降的妖魔是什么尘盼? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮烦绳,結(jié)果婚禮上卿捎,老公的妹妹穿的比我還像新娘。我一直安慰自己径密,他們只是感情好午阵,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著享扔,像睡著了一般底桂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惧眠,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天籽懦,我揣著相機(jī)與錄音,去河邊找鬼氛魁。 笑死暮顺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秀存。 我是一名探鬼主播捶码,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼应又!你這毒婦竟也來了宙项?” 一聲冷哼從身側(cè)響起乏苦,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤株扛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后汇荐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞就,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年掀淘,在試婚紗的時候發(fā)現(xiàn)自己被綠了旬蟋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡革娄,死狀恐怖倾贰,靈堂內(nèi)的尸體忽然破棺而出冕碟,到底是詐尸還是另有隱情,我是刑警寧澤匆浙,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布安寺,位于F島的核電站,受9級特大地震影響首尼,放射性物質(zhì)發(fā)生泄漏挑庶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一软能、第九天 我趴在偏房一處隱蔽的房頂上張望迎捺。 院中可真熱鬧,春花似錦查排、人聲如沸凳枝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽范舀。三九已至,卻和暖如春了罪,著一層夾襖步出監(jiān)牢的瞬間锭环,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工泊藕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辅辩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓娃圆,卻偏偏與公主長得像玫锋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讼呢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361