若是你一直在關注最新的軟件開發,你必定聽過測試驅動開發(Test-driven development TDD)和行爲驅動開發(Behavior-driven development BDD)。這篇文章說明比較了這兩種不一樣的開發模式,並提供了例子。git
Test Drive Development,測試驅動開發github
當我第一次據說TDD,就以爲它是一個很簡單的概念,TDD是使用測試案例等來驅動你的軟件開發。npm
若是咱們想要更深刻點了解TDD,咱們能夠將它分紅五個不一樣的階段:框架
1.首先,開發人員編寫一些測試方法。函數
2.其次,開發人員使用這些測試,可是很明顯的,測試都沒有經過,緣由是尚未編寫這些功能的代碼來實際執行。grunt
3.接下來,開發人員實現測試中的代碼。學習
4.若是開發人員寫代碼很優秀,那麼在下一階段會看到他的測試經過。測試
5.而後開發人員能夠重構本身的代碼,添加註釋,使其變得整潔,開發人員知道,若是新添加的代碼破壞了什麼,那麼測試會提醒他失敗。ui
這種週期不斷的循環下去,只要開發者有更多的功能須要開發。流程圖以下:spa
Test-driven development flowchart
例子:
咱們來看看一個開發人員是怎麼來作着幾個步驟的。這篇文章的完整的代碼在:https://github.com/jdavis/tdd-vs-bdd,代碼免費下載,你可使用如下命令來運行:npm install && grunt。
比方說,開發人員但願寫一個簡單的函數來極端階乘(這個例子很簡單,但它會告訴咱們TDD和BDD之間的差別)。TDD的常規作法是使用這個方法(function),而後斷言(assert)計算結果符合條件。
在這個例子中,咱們將使用Javascript的測試框架中的Mocha。測試應該和下面這個差很少:
var assert = require('assert'), factorial = require('../index');
suit('Test', function(){ setup(function(){ //Create any objects that we might need }); suit('#factorial()', function(){ test('equals 1 for sets of zero length', function(){ assert.equal(1, factorial(0)); }); test('equals 1 for sets of lengrh one', function(){ assert.equal(1, factorial(1)); }); test('equals 2 for sets of lengrh 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)); } |
如今咱們運行這個測試,就能夠經過了。下面咱們看看BDD是怎樣工做的。
Behavior-Driven Development ,行爲驅動開發
好啦,如今你可能要問什麼是BDD呢?這個定義呢,就有一點模糊了。有些人會說,它和TDD很像;還有人會說,這就是有着更好的指導的TDD。
無論它實際的定義是什麼,這沒有那麼重要。最主要的是你要知道BDD能夠消除TDD可能存在的問題。
和TDD比起來,BDD是須要咱們先寫行爲規範(功能明細),在進行軟件開發。功能明細和測試看起來很是類似,可是功能明細更加含蓄一些。
例子:
讓咱們繼續看一下上面那個例子用BDD如何實現:
var assert=require('assert'), factorial = require('../index');
describe('Test', function(){ before(function(){ //Stuff to do before the tests, like imports, what not });
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', funcrion(){ factorial(3).should.equal(6); }); });
after(function(){ //Anything after the tests have finished }); }); |
最主要的區別在於描述的不一樣。BDD採用了更詳細的方式使得它看起來就像是一句話。
這就是我所說的BDD能夠解決一些TDD可能致使的問題。讓你的測試看起來更像一個句子,是一種認知上的轉變,你會更多的去考慮如何寫你的測試。有一種說法是,若是你能夠毫無障礙的閱讀你的測試,你天然會寫出更好的、更全面的測試。
這個例子很簡單,咱們不須要對其作過多的說明。BDD測試應該注重功能而不是實際的結果。你經常會據說BDD是幫助設計軟件,而不是像TDD那樣的測試軟件。
TDD VS BDD
在TDD和BDD之間作選擇是比較複雜的事情。這取決於你使用的語言是否有一個合適的測試框架,你的同事們是否熟悉他等等因素。
有些人認爲BDD總比TDD要好。由於它可以消除TDD帶來的問題。
BDD的關鍵在於,他並非總可以保證阻止問題的發生。就像那些糟糕的代碼組織或者是糟糕的設計的問題依然存在。使用測試讓你寫糟糕代碼的可能性下降,從而有更強大的功能。
結論
哪種測試方案會更好,這徹底取決於我的。一個知道如何寫優秀的TDD測試的人可能和另外一個寫優秀的BDD測試的人所寫出代碼的bug同樣少。若是你發現你本身使用TDD寫了不完整的測試,並但願設計更好的軟件,那麼不妨使用下BDD。若是你是一個學習TDD和BDD的新手,我建議你先學習TDD。這兩種風格最重要的部分就是強制你寫你代碼的測試樣例。若是你從不測試你的代碼,你會須要他們的。
我不是一個研究TDD和BDD的專家。我只是知道他們之間的一點區別,並研究瞭如下。再次說明,文中的代碼位於:https://github.com/jdavis/tdd-vs-bdd。
若是您對這篇文章有建議或錯誤改正。或者只是提出你的不一樣意的觀點,我很樂意聽到這一切。請隨時與我聯繫。感謝您的閱讀!
原文連接:
https://joshldavis.com/2013/05/27/difference-between-tdd-and-bdd/