單元測試、TDD和BDD的差別
阿新 • • 發佈:2021-09-28
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 僅僅是語言描述上的區別麼?
GitHub: https://github.com/wmui