#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/