tdd java_Java TDD简介–第2部分
tdd java
再次問好! 在上一篇博客文章中,我在沒有緊密引用Java的情況下總體上解釋了TDD理論 ,但是在這一部分中,我們開始進行TDD實踐。 我們的目標是遍歷TDD的所有階段:從需求分析到測試代碼的重構。 我們將在具有Java,JUnit和“ fake”需求的示例中完成所有這些工作。
需求分析
假設我們需要在一個虛構的應用程序中創(chuàng)建一個新功能。 以下用戶故事描述了此功能:
作為用戶,我希望能夠創(chuàng)建一個帳戶。 該帳戶應包含ID,狀態(tài)(有效/無效),區(qū)域和余額。 余額屬性不能為負。 默認情況下,帳戶應處于活動狀態(tài),在#1區(qū)域中且余額為0.00。
這就是抽象開發(fā)團隊中常見的用戶故事。 在實踐中,需要在前端開發(fā)人員和后端開發(fā)人員之間分離功能。 我們還假設團隊中已經(jīng)存在一些代碼約定等。
因此,在將功能分配給我作為后端開發(fā)人員之后,我需要澄清所有我不清楚的問題。 例如, 區(qū)域屬性的目的是什么?
答:在應用程序的交易中使用區(qū)域。 根據(jù)區(qū)域的不同,我們會從帳戶收取不同的費用。 目前,我們僅計劃3個區(qū)域。
好。 現(xiàn)在一切都清楚了,我們可以開始TDD了。
Java TDD:首次測試
這是我們在項目中需要具備的依賴項:
<dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><dependency><groupId>org.javamoney</groupId><artifactId>moneta</artifactId><version>1.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-library</artifactId><version>1.3</version></dependency></dependencies>我使用Maven,但是您也可以使用Gradle或任何其他依賴項管理工具。 最后,我需要執(zhí)行第一個實際的開發(fā)步驟:創(chuàng)建空的Account類和相應的測試類。 那是Intellij IDEA中的項目結構:
注意Account類的位置和AccountTest類。 它們具有相同的軟件包名稱,但目錄不同。 那是某種約定。
回顧用戶故事,我想創(chuàng)建以下單元測試:
以下是測試方法:
package com.model;import org.javamoney.moneta.Money; import org.junit.Test;import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*;public class AccountTest {@Testpublic void defaultAccountCreationTest() {Account account = new Account();assertThat(account.getId().length(), equalTo(6));assertThat(account.getStatus(), equalTo(true));assertThat(account.getZone(), equalTo(Account.Zone.ZONE_1));assertThat(account.getBalance(), equalTo(Money.of(0.00, "USD")));}@Testpublic void customAccountCreationTest() {Account account = new Account(false, Account.Zone.ZONE_3, 125.95);assertThat(account.getId().length(), equalTo(6));assertThat(account.getStatus(), equalTo(false));assertThat(account.getZone(), equalTo(Account.Zone.ZONE_3));assertThat(account.getBalance(), equalTo(Money.of(125.95, "USD")));}@Test(expected = IllegalArgumentException.class)public void negativeBalanceTest() {Account account = new Account(false, Account.Zone.ZONE_3, -200);}}測試完成后,就該看看我們在Account類中得到了什么。 因為在單元測試開發(fā)中,我還在Account類中創(chuàng)建了所需方法,構造函數(shù)和屬性的偽聲明。
業(yè)務邏輯實施
單元測試完成后,我們需要在Account類中看到以下內容:
package com.model;import org.javamoney.moneta.Money;public class Account {private String id;private boolean status;private Zone zone;private Money balance;public Account() {}public Account(boolean status, Zone zone, double balance) {}public enum Zone {ZONE_1, ZONE_2, ZONE_3}public String getId() {return id;}public boolean getStatus() {return status;}public Zone getZone() {return zone;}public Money getBalance() {return balance;}}如上所示,從功能的角度來看, Account類并不理想。 構造函數(shù)沒有用,所有屬性均未初始化。 但是測試驅動的開發(fā)意味著在單元測試創(chuàng)??建階段會出現(xiàn)這種情況。
當我們?yōu)锳ccount類運行單元測試時,將得到“紅色”結果。 因此,使它們綠色的方法是從defaultAccountCreationTest()開始 。 在此測試的上下文中,我們必須更新Account類。 更改很小,但是更改之后,單元測試變?yōu)榫G色。
package com.model;import org.apache.commons.lang3.RandomStringUtils; import org.javamoney.moneta.Money;public class Account {private String id = RandomStringUtils.randomAlphanumeric(6);private boolean status = true;private Zone zone = Zone.ZONE_1;private Money balance = Money.of(0.00, "USD");public Account() {} //next code is omitted, it was not affected by the first changes 您可以運行更新的AccountTest類。 運行的結果是:一個測試通過,兩個失敗。
然后,我們需要對每個單元測試重復此操作,直到它們全部變?yōu)椤熬G色”為止。
那是Account類的最終版本:
package com.model;import org.apache.commons.lang3.RandomStringUtils; import org.javamoney.moneta.Money;public class Account {private String id = RandomStringUtils.randomAlphanumeric(6);private boolean status = true;private Zone zone = Zone.ZONE_1;private Money balance = Money.of(0.00, "USD");public Account() {}public Account(boolean status, Zone zone, double balance) {this.status = status;this.zone = zone;if (balance < 0)throw new IllegalArgumentException("The balance can not be negative");this.balance = Money.of(balance, "USD");}public enum Zone {ZONE_1, ZONE_2, ZONE_3}public String getId() {return id;}public boolean getStatus() {return status;}public Zone getZone() {return zone;}public Money getBalance() {return balance;}}這是運行測試的屏幕截圖:
經(jīng)過測試重構
可能在更復雜的示例中,測試變成綠色后,我將進行一些重構。 但是在這種簡單情況下,我們不需要這個。 如果您對提高代碼的可讀性或樣式有任何建議,請隨時發(fā)表評論。
摘要
在本教程中,我們研究了如何使用Java使用TDD進行開發(fā) ,從功能分析開始,以“綠色”單元測試和重構結束。 我試圖在示例中解釋TDD方法,該方法雖然不太瑣碎,但也不太復雜。 無論如何,我希望它對您有所幫助并提供有益的信息。
翻譯自: https://www.javacodegeeks.com/2015/11/introduction-java-tdd-part-2.html
tdd java
總結
以上是生活随笔為你收集整理的tdd java_Java TDD简介–第2部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux编程语言排行榜(linux 编
- 下一篇: 金辉城备案价(金辉城备案)