深入淺出nodejs學習筆記--第十、十一章 測試 產品化

單元測試

我們知道後端都有單元測試,比如學習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監控。報警一般都是通過短信或者郵件來執行。


穩定性

爲保證應用的穩定性,可以採用多機器、多機房、多備份的方式來保證。


異構共存

主要是指與其他語言的兼容性,協同作爲。


前端新手,弱雞一枚,如有錯誤,請指正,謝謝!

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