我的理解是這樣的:BDD和TDD,什麼是正確的工作流程?
BDD是評估軟件如何行爲,然後編寫驗收測試的過程,以此爲基礎編寫代碼。您可以使用TDD方法編寫代碼,編寫方法的單元測試並在單元測試(代碼,測試,重構)周圍構建您的類。在編寫代碼時,您會測試它是否符合原始驗收測試。
任何人都可以對我的解釋有全面的評論經驗,並可以通過使用這些敏捷原則的簡單應用程序漫步嗎?我發現在單獨的出版物中有很多關於BDD和TDD的文本,但我正在研究這兩個過程如何在現實世界的發展中相互補充。
我的理解是這樣的:BDD和TDD,什麼是正確的工作流程?
BDD是評估軟件如何行爲,然後編寫驗收測試的過程,以此爲基礎編寫代碼。您可以使用TDD方法編寫代碼,編寫方法的單元測試並在單元測試(代碼,測試,重構)周圍構建您的類。在編寫代碼時,您會測試它是否符合原始驗收測試。
任何人都可以對我的解釋有全面的評論經驗,並可以通過使用這些敏捷原則的簡單應用程序漫步嗎?我發現在單獨的出版物中有很多關於BDD和TDD的文本,但我正在研究這兩個過程如何在現實世界的發展中相互補充。
試着把它們當成例子而不是測試。
對於整個應用程序,我們想出了一個用戶如何使用該應用程序的例子。該示例是一個說明該行爲的特定行爲實例。所以,舉例來說,我們可能會說,直到申請允許退款。一直到運營商誰使用了,直到將熟悉弗雷德帶回一臺微波爐退款方案:
鑑於弗雷德買了一臺微波爐$ 100
當他帶來的微波向後一退
然後他應該將100美元退還給他的信用卡。
現在很容易想到其他場景太;例如,弗雷德獲得折扣,只能獲得90美元的折扣,或弗雷德自己破壞微波爐並拒絕退款等等。
當我們真正開始編寫到期軟件時,我們會打破我們的代碼分成小塊;類,函數,模塊等。我們可以描述一段代碼的行爲,並舉例說明。因此,舉例來說,我們可能會說退款計算器應該考慮折扣。這只是退款場景的一小部分。我們有一門課,RefundCalculator
,以及一個說shouldTakeDiscountsIntoAccount
的方法的單元測試。
我們不妨把步驟,我們的例子意見,例如:
// Given a microwave was sold at 10% discount for $100
...
// When we calculate the refund due
...
// Then the calculator should tell us it's $90.
...
然後我們填寫的代碼把它變成一個單元測試,寫這使得它通過代碼。
通常情況下,「BDD」是指描述整個應用程序的場景,但這些想法實際上是在單元層面開始的,原理是相同的。唯一的區別是一個是使用應用程序的用戶的示例,另一個是使用另一個類(或函數,或您有什麼)的類的示例。因此,BDD在應用程序的外部就像ATDD(Acceptance-Test-Driven Development),類的BDD就像TDD。希望這可以幫助您瞭解這些概念如何結合在一起。
唯一的區別是,我們擺脫了「測試」一詞,因爲我們發現它更容易讓人們比測試的例子,它有助於保持人們思考他們是否理解這個問題,而不是思考關於如何測試解決方案。
This answer「自上而下」(或外部進入)與「自下而上」也可能對您有所幫助。
您的總結基本正確。這些標籤可能會產生誤導:調用他們做'BDD'的人將寫入驗收測試和單元測試,那些稱他們做'TDD'的人會寫驗收測試和單元測試。對我而言,兩者之間的區別是毫無意義的。你會閱讀很多人對這個基本過程的不同口味的體驗。嘗試在您的情況下看起來有意義的方法,並始終準備根據哪些方法可行,哪些方面不適合您進行調整 - 這就是敏捷的本質。
BDD故事有兩種方法,imperative and declarative。開發人員可能會發現編寫更容易的命令式故事,特別是在用於腳本單元測試時。
但是,當從敏捷測試首先/測試驅動開發方法接近這個聲明式方法導致BDD敘述是cogent with the development stories。這是因爲BDD的敘述繼續反映domain language of the business而不是編程領域。
How do you capture requirements with declarative acceptance tests?
謝謝Mike。 – Alex
關於「測試」這個詞有點太過分了。對於開發人員來說,這可能並不意味着很多,特別是如果我們習慣了TDD,但是如果您正在與商業人士交談,這一點非常重要。 「你可以給我一個例子嗎?」比「你能給我一個驗收測試嗎?」要容易得多嗎? – Lunivore
@Lunivore好點,我是一個小騎士。 –