• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Poang,基于Node.js的自動化測試范例

    發表于:2013-11-26來源:InfoQ作者:李湃點擊數: 標簽:Node.js
    Poang,基于Node.js的自動化測試范例.Poang主要業務邏輯是使用Everyauth做本地身份認證,并將用戶身份信息通過Mongoose-Auth持久化到MongoDB中去(Mongoose做對象建模),利用Connect-Mongo做會話保存。Poang中的認證代碼auth.js大部分取自Mongoose-Auth docs。

      Poang主要業務邏輯是使用Everyauth做本地身份認證,并將用戶身份信息通過Mongoose-Auth持久化到MongoDB中去(Mongoose做對象建模),利用Connect-Mongo做會話保存。Poang中的認證代碼auth.js大部分取自Mongoose-Auth docs。

      測試代碼使用了多種技術框架,Mocha做單元測試,should做斷言,Sinon.JS監測以及制造mock數據,Zombie.js做基于瀏覽器的輕量級集成測試。

      單元測試

      寫一個基于web/數據庫的單元測試比較麻煩,有很多配置項需要添加,這里舉一個簡單例子來闡述如何使用Mocha框架做單元測試

      describe('index', function() {

      describe('#timesTwo()', function() {

      it('should multiply by two', function() {

      var x = 5;

      var xTimesTwo = index.timesTwo(x);

      xTimesTwo.should.equal(10);

      });

      });

      });

      注:前三行表述了單元測試的目標類和目標函數(一個乘二函數),單元測試的代碼體輸入參數為5,利用should斷言來校驗返回值是否為10

      功能測試

      1) Case1

      創建mock請求對象mock_req,來驗證服務端的身份認證功能。使用Sinon.JS的spy功能監測mock響應對象mock_res是否有做重定向,如果沒有做重定向,則將mock響應對象的http狀態碼設置為200

      var mock_req = {session: {}};

      var mock_res = {redirect: function() {}, end: function() {}};

      sinon.spy(mock_res,"redirect");

      middleware.require_auth_browser(mock_req, mock_res, function() {

      mock_res.statusCode = 200;

      });

      服務端會驗證mock請求對象是否包含用戶信息,因為我們mock請求不包含用戶對象,所以服務端會返回http 401狀態碼(未授權),并跳轉到login頁面

      mock_res.statusCode.should.eql(401);

      mock_res.redirect.getCall(0).args[0].should.equal('/login');

      2) Case2

      重新創建一個mock對象,包含用戶信息,此時我們斷定,mock響應對象的狀態碼被設置為200

      mock_req = {user: {}};

      middleware.require_auth_browser(mock_req, mock_res, function() {

      mock_res.statusCode = 200;

      });

      mock_res.statusCode.should.eql(200);

      集成測試

      接下來使用Zombie.js做輕量級基于瀏覽器的集成測試,步驟如下:

      首先啟動Poang應用實例,隨機選擇一個服務端口號(當然也可以自己指定一個端口號,但要保證該端口號沒有被占用)

      var TEST_PORT = Math.floor(Math.random()*61439 + 4096);

      before(function() {

      var server = app.init(config);

      // should check to see if something is listening on the port first

      server.listen(TEST_PORT);

      console.log('Server is listening on port %s', TEST_PORT);

      });

      確認下這個服務是可用的,并且頁面的標題是”Poang”

      var browser = new zombie();

      browser.visit(base_url, function () {

      browser.success.should.be.ok;

      if (browser.error) {

      console.dir('errors reported:', browser.errors);

      }

      done();

      });

      browser.text("title").should.eql("Poang");

      注冊一個用戶,校驗注冊流程是否成功

      var browser = new zombie();

      browser.visit(base_url + "register", function () {

      browser.query("#register").should.be.ok;

      // Fill email, password and submit form

      browser.fill("email", test_email).fill("password", "secret").

      pressButton("register", function() {

      // Form submitted, new page loaded.

      browser.success.should.be.ok;

      browser.location.pathname.should.eql("/");

      done();

      });

      });

      因為每次集成測試,都會注冊同樣的帳號,為了避免困擾,我們在跑完集成測試的時候可以將帳號從數據庫中刪掉(這個取決于測試的具體策略,可以靈活調整)

      after(function(done) {

      var db_uri = process.env.MONGOLAB_URI || process.env.MONGODB_URI || config.default_db_uri;

      mongoose.connect(db_uri);

      // drop database

      mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function() {

      console.log("Dropped test database");

      done();

      });

      })

      Strider持續集成

      Strider是一個基于Node.js和Python的持續集成平臺,Strider本身可以集成任意的測試框架,唯一的要求是應用必須支持”NPM Test”命令,而Strider對測試用具TAP有很好的集成性,所以Poang應用的描述文件Package.json會添加如下命令:

      "test": "mocha -R tap --globals o,section,data,m,k,i"

      “--globals o,section,data,m,k,I”指定全局變量,不然會報全局變量遺漏錯誤

      Strider還在內測階段,讀者可以申請邀請碼試用

      以下是開發部署應用過程中,總結的最佳實踐

      MongoDB的配置

    原文轉自:http://www.infoq.com/cn/news/2012/06/nodejs-mongo-app-autotest?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_articles_clk

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>