1. 程式人生 > 其它 >單元測試、TDD和BDD的差別

單元測試、TDD和BDD的差別

Unit testing(單元測試)

單元測試往往只關注於一個程式碼片段,通常是一個模組或函式,測試程式碼應該比較簡單,可以快速實現和執行。這也意味著你會寫很多的單元測試用例來保證程式碼的功能正常。單元測試應該沒有什麼依賴,比如通過網路請求獲取資料庫資料。單元測試的基本原則就是:多個測試用例,每個測試不同的功能並且相互之間沒有依賴。單元測試在庫和框架的開發中比較常見。

TDD(測試驅動開發)

TDD(Test Drive Development),用測試來驅動軟體的開發,它有以下幾個步驟:

  • 開發者首先寫一些測試
  • 開發者執行這些測試,但這些測試明顯都會失敗,因為你並沒有實現程式碼細節
  • 開發者實現程式碼細節
  • 如果開發者順利實現程式碼的話,執行所有測試就會通過
  • 開發者可以重構程式碼,如果新程式碼功能不正確的話,對應的測試檔案也會失敗

從以上描述可以看出,TDD要求在寫程式碼前考慮好所有的邊界情況,然後你寫出的程式碼能夠保證通過這些測試。如果測試寫的足夠全面,當重構時會節省大量時間。

下面是一個使用TDD的示例,計算階乘的函式,測試框架使用的Mocha

測試程式碼

var assert = require('assert'),
    factorial = require('../index');
suite('Test', function (){
  suite('#factorial()', function (){
    test('equals 1 for sets of zero length', function (){
      assert.equal(1, factorial(0));
    });
    test('equals 1 for sets of length one', function (){
      assert.equal(1, factorial(1));
    });
    test('equals 2 for sets of length two', function (){
      assert.equal(2, factorial(2));
    });
    test('equals 6 for sets of length three', function (){
      assert.equal(6, factorial(3));
    });
  });
});

功能程式碼

module.exports = function (n) {
  if (n < 0) return NaN;
  if (n === 0) return 1;
  return n * factorial(n - 1);
}

並不是所有的專案都適合用TDD測試,如果專案中模組間的依賴度很高,又或者功能經常變動,那麼這種測試方式就是得不償失的

BDD 行為驅動測試

BDD(Behavior Drive Development),應該是寫業務程式碼中使用較多的一種測試方式,它強調的是根據使用者的行為得到正確的反饋,BDD需要產品確定好需求文件,然後開發人員根據文件描述完成功能實現,這是一種比較貼近自然語言的測試方式,但是這種方式可能不如TDD測試的全面

下面是使用BDD測試寫的計算階乘的函式

module.exports = function (n) {
  if (n < 0) return NaN; // 如果需求沒要求對負數進行處理,可能會忽略這行程式碼
  if (n === 0) return 1;
  return n * factorial(n - 1);
}
var assert = require('assert'),
    factorial = require('../index');
describe('Test', function (){
  describe('#factorial()', function (){
    it('should return 1 when given 0', function (){
      factorial(0).should.equal(1);
    });
    it('should return 1 when given 1', function (){
      factorial(1).should.equal(1);
    });
    it('should return 2 when given 2', function (){
      factorial(2).should.equal(2);
    });
    it('should return 6 when given 3', function (){
      factorial(3).should.equal(6);
    });
  });
});

總結一下就是,使用TDD方式時,你要站在測試工程師的角度去思考功能的實現。而BDD的方式,你要站在產品經理的角度去思考功能的實現。具體使用哪種方式要根據專案實際情況分析,BDD是一種開發人員接受度較高的測試方式。

參考文章

TDD和BDD的差別
關於TDD、BDD和DDD的一些看法
TDD 與 BDD 僅僅是語言描述上的區別麼?

部落格: https://blog.86886.wang
GitHub: https://github.com/wmui