javascript 自動化單元測試

#JavaScript 自動化單元測試

 - 爲什麼要進行自動化測試?

 - 什麼項目適合做自動化測試?

 - 測試運行器 karma

 - 測試框架 jasmine

 

### 爲什麼要進行自動化測試?


1. 正確性:驗證代碼的正確性

2. 自動化:一次編寫,多次運行

3. 解釋性:閱讀測試用例,有時比文檔說明更清晰

4. 驅動開發:快速反饋提高開發效率

5. 保證重構:測試用例做後盾,就可以大膽的進行重構持續集成


### 什麼項目適合做自動化測試?

自動化的收益 = 迭代次數 * (全手動執行成本 - 維護成本) - 首次自動化成本

從三個方面進行權衡


    1、需求變動不頻繁

  測試腳本的穩定性決定了自動化測試的維護成本。如果軟件需求變動過於頻繁,測試人員需要根據變動的需求來更新測試用例以及相關的測試腳本,而腳本的維護本身就是一個代碼開發的過程,需要修改、調試,必要的時候還要修改自動化測試的框架,如果所花費的成本不低於利用其節省的測試成本,那麼自動化測試便是失敗的。


  項目中的某些模塊相對穩定,而某些模塊需求變動性很大。我們便可對相對穩定的模塊進行自動化測試,而變動較大的仍是用手工測試。


    2、項目週期較長

由於自動化測試需求的確定、自動化測試框架的設計、測試腳本的編寫與調試均需要相當長的時間來完成。這樣的過程本身就是一個測試軟件的開發過程,需要較長的時間來完成。如果項目的週期比較短,沒有足夠的時間去支持這樣一個過程,那麼自動化測試便成爲笑談。


    3、自動化測試腳本可重複使用

  自動化測試腳本的重複使用要考量,測試的項目之間是否很大的差異性;所選擇的測試工具是否適應這種差異;測試人員是否有能力開發出適應這種差異的自動化測試框架。



### 測試運行器

- karma: 設置測試需要的框架、環境、源文件、測試文件等,配置完後,就可以輕鬆地執行測試。


### 測試框架

- Qunit: 該框架誕生之初是爲了jquery的單元測試,後來獨立出來不再依賴於jquery本身,但是其身上還是脫離不開jquery的影子

- jasmine: Behavior-Drive development(BDD)風格的測試框架,在業內較爲流行,功能很全面,自帶asssert、mock功能

- mocha: node社區大神tj的作品,可以在node和browser端使用,具有很強的靈活性。

- intern: 看官方介紹該測試框架功能極其全面,似乎囊括了業內跟測試相關的所有功能


### 斷言庫

- chai:應該是目前組流行的斷言庫了,支持TDD(assert)、BDD(expect、should)兩個風格的斷言庫

- should.js: TJ的另外一個開源貢獻

- expect.js:BDD風格的另外一個斷言庫,基於should.js,是mini版的BDD庫

- assert(node自帶核心模塊): 可以在node中使用的斷言模塊


### 測試運行器 karma


Karma是Testacular的新名字,在2012年google開源了Testacular,2013年Testacular改名爲Karma。Karma是一個讓人感到非常神祕的名字,表示佛教中的緣分,因果報應,這種名字更讓人猜不透!

Karma是一個基於Node.js的JavaScript測試執行過程管理工具(Test Runner)。該工具可用於測試所有主流Web瀏覽器,也可和其他代碼編輯器一起使用。這個測試工具的一個強大特性就是,它可以監控(Watch)文件的變化,然後自行執行,通過console.log顯示測試結果。



參考資料:

 - karma官網:https://karma-runner.github.io/1.0/index.html


 - Karma-runner安裝步驟: https://karma-runner.github.io/0.12/intro/installation.html


 - Karma config file: http://karma-runner.github.io/0.8/config/configuration-file.html


 - Karma files: http://karma-runner.github.io/0.8/config/files.html


 - Karma和Jasmin自動化單元測試: http://blog.fens.me/nodejs-karma-jasmine/


 - AngularJS的UnitTest: https://docs.angularjs.org/guide/unit-testing

 

### 測試框架  jasmine


#### Jasmine的基礎語法

 1. TDD(Test Driven Development)測試驅動開發

 2. BDD(Behavior Driven Development)行爲驅動開發 可以有效的改善設計,並在系統的演化過程中爲團隊指明前進方向

 

 - Jasmine有四個核心概念:分組(Suites)、用例(Specs)、期望(Expectations)、匹配(Matchers)。

    - Suites可以理解爲一組測試用例,使用全局的Jasmin函數describe 創建。describe函數接受兩個參數,一個字符串和一個函數。

    - Specs可以理解爲一個測試用例,使用全局的Jasmin函數it創建。和describe一樣接受兩個參數,一個字符串和一個函數,函數就是要執行的測試代碼,字符串就是測試用例的名字。

    - Expectations由expect 函數創建。接受一個參數。和Matcher一起聯用,設置測試的預期值。

    - Matcher實現一個“期望值”與“實際值”的對比,如果結果爲true,則通過測試,反之,則失敗。每一個matcher都能通過not執行否定判斷。

    

```

expect(a).toBe(true);//期望變量a爲true  

expect(a).toEqual(true);//期望變量a等於true  

expect(a).toMatch(/reg/);//期望變量a匹配reg正則表達式,也可以是字符串  

expect(a.foo).toBeDefined();//期望a.foo已定義  

expect(a.foo).toBeUndefined();//期望a.foo未定義  

expect(a).toBeNull();//期望變量a爲null  

expect(a.isMale).toBeTruthy();//期望a.isMale爲真  

expect(a.isMale).toBeFalsy();//期望a.isMale爲假  

expect(true).toEqual(true);//期望true等於true  

expect(a).toBeLessThan(b);//期望a小於b  

expect(a).toBeGreaterThan(b);//期望a大於b  

expect(a).toThrowError(/reg/);//期望a方法拋出異常

expect(a).toThrow();//期望a方法拋出異常  

expect(a).toContain(b);//期望a(數組或者對象)包含b  

```

- 爲了在複雜的測試用例中更加便於組裝和拆卸,Jasmine提供了四個函數:

```

beforeEach(function)  //在每一個測試用例(it)執行之前都執行一遍beforeEach函數;  

afterEach(function)  //在每一個測試用例(it)執行完成之後都執行一遍afterEach函數;  

beforeAll(function)  //在所有測試用例執行之前執行一遍beforeAll函數;  

afterAll(function)  //在所有測試用例執行完成之後執行一遍afterAll函數;  

```


- 舉例:http://ued.fanxing.com/javascriptdan-yuan-ce-shi-kuang-jia-jasmine/


參考資料:

- Jasmine官網:http://jasine.github.io/

- Jasmine github:https://github.com/jasmine/jasmine/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章