前端測試-大醬的冬季前端之旅第一遊

大醬發表於2018-11-03

從這周開始,每週至少完成一篇分享~每週週六睡前完成本週的初步讀文章分享,下週四睡前將上週的大問題修改完畢,將深刻理解的知識補充完~一定要堅持下去~也希望自己能夠深刻理解每一個內容,如果大家發現文章中的問題或者有好的建議可直接留言,有好的相關文章也歡迎發給我~一起加油吧!


1.node assert

node-assert函式分組講解

node中文api文件

斷言是程式設計術語,表示為一些布林表示式,程式設計師相信在程式中的某個特定點該表示式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。assert主要是用於有肯定結果的測試。

主要函式

assert(value, message), assert.ok(value, [message]) //判斷中值是否為true

assert.ifError(value) //測試值是否不為 false,當為 true 時丟擲。常用於回撥中第一個 error 引數的檢查。

assert.fail(actual, expected, message, operator) //丟擲異常,有message時顯示  message,沒有使用operator作為為分隔符

assert.equal(actual, expected, [message]) //("=="判斷)是否相等

assert.notEqual(actual, expected, [message]) //("=="判斷)是否不相等

assert.strictEqual(actual, expected, [message]) //("==="判斷)是否相等 相反:notStrictEqual

assert.deepEqual(actual, expected[, message]) // 是否深度匹配 

assert.notDeepEqual(actual, expected[, message]) // 是否深度匹配

assert.throws(block, [error], [message]) //宣告一個block用於丟擲錯誤,'error'可以是建構函式,驗證函式或者正規表示式

assert.doesNotThrow(block, [message])//宣告模組不丟擲錯誤

2.ATDD,TDD,BDD

ATDD,TDD,BDD的區別

單元測試,BDD,TDD

TDD(測試驅動開發)

TDD指的是Test Drive Development,很明顯的意思是測試驅動開發,也就是說我們可以從測試的角度來檢驗整個專案。大概的流程是先針對每個功能點抽象出介面程式碼,然後編寫單元測試程式碼,接下來實現介面,執行單元測試程式碼,迴圈此過程,直到整個單元測試都通過。這一點和敏捷開發有類似之處。

BDD(行為驅動開發)

BDD指的是Behavior Drive Development,也就是行為驅動開發。BDD用自然語言來描述,讓開發、測試、BA以及客戶都能在這個基礎上達成一致。因為測試優先的概念並不是每個人都能接受的,可能有人覺得系統太複雜而難以測試,有人認為不存在的東西無法測試。所以,我們在這裡試圖轉換一種觀念,那便是考慮它的行為,也就是說它應該如何執行,然後抽象出能達成共識的規範。

3.mocha(音:摩卡)

mocha是一款功能豐富的javascript單元測試框架,它既可以執行在nodejs環境中,也可以執行在瀏覽器環境中。mocha會序列地執行我們編寫的測試用例,可以在將未捕獲的異常對映到對應測試用例(?這裡是指的哪部分)的同時,保證輸出靈活準確的測試結果。

阮一峰mocha+chai(斷言庫)教程

mocha官網

mocha詳解

mocha會生成一個包在最外面的describe函式

同步程式碼測試

var assert = require('chai').assert;     //斷言模組chai中的assert風格
describe('用例集描述string', function() {    // "測試套件"test suite),表示一組相關的測試
    it('用例的描述string', function() {   //it為一個測試用例,用例通過後會在描述前打勾
      // function為用例的內容
      assert.equal(-1, [1,2,3].indexOf(5));
      assert.equal(-1, [1,2,3].indexOf(0));
    });
});複製程式碼

非同步程式碼測試

callback:x

describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done) {
      var user = new User('Luna');
      user.save(function(err) {
        if (err) throw err;       //判斷用例執行成功與否是在非同步程式碼的回撥裡邊完成的
        done();                    // 通知Mocha測試結束

        /* user.save(done);  // 非同步程式碼中邏輯錯誤時,會在回撥中丟擲一個錯誤,直接這樣寫即可 */複製程式碼
      });
    });
  });
});複製程式碼

promise:  讓用例函式返回一個promise物件來進行正確性判斷

不建議使用箭頭函式~~

鉤子函式 (下面4種)

describe('hooks', function() {

  before('可選:描述string',function [funName可選] () {
    // runs before all tests in this block
  });

  after(function() {
    // runs after all tests in this block
  });

  beforeEach(function() {
    // runs before each test in this block
  });

  afterEach(function() {
    // runs after each test in this block
  });

  // test cases
});複製程式碼

如果在用例集函式之外定義鉤子函式,那麼這個鉤子函式將會對所有的mocha單元測試用例生效。

常用方法

describe.only()/it.only() :  只執行此用例集或用例

describe.skip()/it.skip():跳過此用例集或用例的執行,跳過的用例會被標記為pending的用例

 this.skip();: 呼叫skip函式跳過此用例

this.retries();:重新執行用例(會重新執行用例函式的beforeEach和afterEach鉤子函式)

 this.slow(num);:標記耗費num時間認為執行耗時過長

 this.timeout(500):定義用例、用例集、鉤子函式超時時間,如果巢狀的用例集或者用例重寫了timeout時間,則會覆蓋上層的設定。通過this.timeout(0),可以關掉用例或用例集的超時判斷。

mocha.setup('bdd'): 設定介面型別

 mocha.run(); :  測試指令碼載入完之後用mocha.run()函式來執行測試

常用命令

mocha init: 生成一個瀏覽器中單元測試的架子

mocha --delay: 在全域性環境中生成一個run函式,延遲工作完成後呼叫run函式run()即可啟動測試。

mocha命令的基本格式是:mocha [debug] [options] [files]

測試介面型別

mocha的測試介面型別指的是集中測試用例組織模式的選擇,包括BDD行為驅動開發(Behavior Driven Development),TDD測試驅動開發(Test-Driven Development),Exports,QUnit 和 Require-style 幾種

BDD(預設的測試介面)

BDD測試介面提供 describe(), context(), it(), specify(), before(), after(), beforeEach(), 和 afterEach()幾種函式,其中context函式只是describe函式的別名,specify函式也是if函式的別名。

TDD

TDD介面提供 suite(), test(), suiteSetup(), suiteTeardown(), setup(), 和 teardown()函式

額外補充知識點(讀取檔案時用到) :

  bash萬用字元(node萬用字元)【eg:$ mocha 'test/**/*.@(js|jsx)'  需加單引號

前端測試-大醬的冬季前端之旅第一遊

shell萬用字元

  萬用字元     意義

  *         匹配0任意多個字元(包括零個或一個)
  ?         匹配任意一個字元(不包括零個)
  [characters]    匹配任意一個屬於字符集中的字元
  [!characters]    匹配任意一個不是字符集中的字元
  [[:class:]]     匹配任意一個屬於指定字元類中的字元

  

   字元類         意義

  [:alnum:]      匹配任意一個字母或數字
  [:alpha:]       匹配任意一個字母
  [:digit:]       匹配任意一個數字
  [:lower:]      匹配任意一個小寫字母
  [:upper]       匹配任意一個大寫字母

4.should.js

should.js語法

api英文文件

shouldjs是一個BDD測試斷言庫,它包裝了assert,改變了書寫風格,擴充套件了Object.prototype,額外提供了".should"語法。一旦引入了should,即“var should = require('should');”,那麼當前js檔案內的所有繼承至Object的物件都可以.should:

目標物件.should.xxxx複製程式碼

如果目標物件沒有繼承至Object,那就換一種方式使用:

  should(目標物件).xxx複製程式碼

或者

 should.xxxxx(目標物件);複製程式碼

should庫需要額外安裝:$ npm install should --save-dev

瀏覽器端將should包下的should.js引入到前臺頁面,即可和後端一樣使用。

靜態方法

should提供了一系列的靜態方法,這些方法可以對非Object物件使用。它們和assert的基本方法其實是一樣的。具體api看上面連結。

Assertions 斷言

每一個should斷言都返回一個被should.js包裝過的物件,所以他可以形成鏈式語法,但是有一些斷言,比如.length,.property 等將被斷言的物件改變成了其屬性值。 

而且在“鏈”中,可以使用下面等方便理解的詞,這些詞其實對should的斷言一點實際影響都沒有,注意,沒有.or

.an, .of, .a, .and, .be, .have, .w ith, .is, .which.

5.自動化測試工具karma

karma的設計分析以及與其他框架對比

Karma中文配置API

karma入門操作(yarn)

karma就是把我們測試過程中編寫的測試用例,通過它呼叫瀏覽器來執行這些測試用例,然後再彙集測試結果,生成測試報告。可以選擇各類測試框架(mocha、Jasmine 等)。

6.Travis CI

官網

travis自動構建nodejs專案實戰

Travis-ci是一款持續整合(Continuous Integration)服務,它能夠很好地與Github結合,每當程式碼更新時自動地觸發整合過程。

配置.travis.yml檔案,在travis官網上開啟自動構建,則可以簡單地開始某一專案的自動構建



相關文章