單元測試
我們知道後端都有單元測試,比如學習Java用到的Junit,很好用,那麼前端有沒有單元測試呢?答案當然是有的。這裏就簡單總結一下前端單元測試的內容和一些常用的測試框架。
單元測試編寫原則:
我們都知道做單元測試可以有很多好處,但是在瞭解單元測試之前,先來看一下單元測試的編寫規則,在編寫可測試的代碼需要注意以下3個問題:
- 單一職責: 儘量細分代碼的職責,不要給一段代碼附加太多而邏輯從而使代碼變得不可控。
- 接口抽象: 對於大的項目,業務邏輯比較複雜,要記得寫接口,針對接口進行測試。
- 層次分離: MVC就是最好的例子。
斷言
單元測試的核心應用就是斷言,用一個最簡單的例子介紹一下什麼是斷言:
var assert = require('assert')
assert.equal(Math.max(1, 100), 100)
equal()是斷言模塊的內置方法,用於判斷實際值與期望值是否相等。類似的方法還有ok()、notEqual()等。上句代碼的意思是判斷 Math.max(1, 100) 的輸出結果是不是100,如果不是,就拋出異常。
測試框架
單元測試很簡單,下面介紹兩個常用的單元測試庫,jasmine 和 mocha
jasmine
Jasmine的開發團隊來自PivotalLabs,他們一開始開發的JavaScript測試框架是JsUnit,來源於著名的JAVA測試框架JUnit。JsUnit是xUnit的JavaScript實現。但是JsUnit在2009年後就已經停止維護了,他們推出了一個新的BDD框架Jasmine。Jasmine不依賴於任何框架,所以適用於所有的Javascript代碼。
下面直接放一個官方的使用案例:
describe("A spec", function() {
var foo;
beforeEach(function() {
foo = 0;
foo += 1;
});
afterEach(function() {
foo = 0;
});
it("is just a function, so it can contain any code", function() {
expect(foo).toEqual(1);
});
it("can have more than one expectation", function() {
expect(foo).toEqual(1);
expect(true).toEqual(true);
});
describe("nested inside a second describe", function() {
var bar;
beforeEach(function() {
bar = 1;
});
it("can reference both scopes as needed", function() {
expect(foo).toEqual(bar);
});
});
});
jasmine單元測試有二個核心的部分:describe 函數塊和it函數塊
describe和it函數都有二個參數:
第一個參數:測試描述;
第二個參數:測試用的具體邏輯
mocha
mocha的使用和jasmine類似,這裏也直接放一個例子:
var assert = require('assert');
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -1 when the value is not present', function() {
assert.equal(-1, [1,2,3].indexOf(4));
});
});
});
describe塊稱爲”測試套件”(test suite),表示一組相關的測試。它是一個函數,第一個參數是測試套件的名稱(隨便起,能讓別人看懂就好),第二個參數是一個實際執行的函數。
it塊稱爲”測試用例”(test case),表示一個單獨的測試,是測試的最小單位。它也是一個函數,第一個參數是測試用例的名稱(隨便起,能讓別人看懂就好),第二個參數是一個實際執行的函數。
這裏只簡單介紹,具體使用可以看阮一峯的mocha實例教程: http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
性能測試
性能測試主要包括基準測試、壓力測試、和負載測試:
- 基準測試: 基準測試的目的是統計在多少時間內執行了多少方法。
- 壓力測試:壓力測試就是模擬請求測試網絡接口,查看吞吐率,響應時間和併發數。常用的工具是ab、siege、http_load,使用很簡單,直接看文檔就可以使用,這裏不多贅述
- 負載測試: 負載測試和壓力測試很像,主要是測試數據在超負荷環境中運行,程序是否能夠承擔。
產品化
產品化的內容很簡單,重點在於實踐和工程化中的運用。主要包括以下:
項目工程化
目前現有的一些項目工程管理,不如webpack,gulp等,用起來都很方便。
性能優化
以下是幾個常見的提升性能的方法:
- 動靜分離: 動態請求和靜態請求分離開來
- 啓用緩存: 適當利用緩存,但是不可以過分利用緩存
- 多線程架構:具體可以參照第九章的筆記
- 讀寫分離:主要針對數據庫,因爲讀寫操作速度是不一樣的,讀的速度是高於寫入的速度的,所以對於不同的業務,可以對數據庫做讀寫分離處理,具體可以查看博客:https://my.oschina.net/candiesyangyang/blog/203425
日誌
對於程序來說,寫日誌是十分重要的,對於異常日誌的捕捉都是對日後程序維護的利器,一般情況推薦把日誌存爲文件,不推薦存入數據庫。
監控報警
所謂監控主要包括對 日誌監控、響應時間、進程監控、磁盤監控、內存監控、CPU佔用監控、CPU load監控、I/O負載、網絡監控、應用狀態監控、DNS監控。報警一般都是通過短信或者郵件來執行。
穩定性
爲保證應用的穩定性,可以採用多機器、多機房、多備份的方式來保證。
異構共存
主要是指與其他語言的兼容性,協同作爲。
前端新手,弱雞一枚,如有錯誤,請指正,謝謝!