通常我們?cè)O(shè)計(jì)一個(gè)應(yīng)用程序,并且快速創(chuàng)建單元測試來驗(yàn)證我們的設(shè)計(jì),在我們編寫這些測試時(shí),這些測試也可以幫助改善了我最初的設(shè)計(jì)。隨著我們編寫越來越多的單元測試,正反饋的良性循環(huán)也會(huì)鼓勵(lì)我們盡早地編寫單元測試。當(dāng)我們?cè)O(shè)計(jì)并實(shí)現(xiàn)時(shí),就自然地想要知道我們將會(huì)如何來測試一個(gè)類?;谶@一方法論,越來越多的開發(fā)者正從利于測試躍遷到測試驅(qū)動(dòng)開發(fā)。
通過簡單例子來理解TDD
下面我們就從"保留兩位小數(shù),不能四舍五入"的例子理解什么是測試驅(qū)動(dòng)開發(fā)。
問題:
編寫一個(gè)方法,輸入double參數(shù),返回保留兩位小數(shù),不能四舍五入的String。
第一步:編寫測試用例
按照我們預(yù)期的結(jié)果,編寫參數(shù)化的單元測試用例
@RunWith(value = Parameterized.class)
public class keep2DecimalParameterizedTest {
private String expected;
private double param0;
@Parameterized.Parameters
public static Collection<Object[]> getTestParameters() {
return Arrays.asList(new Object[][]{
{"1.00", 1.002},
{"2.15", 2.156},
{"3.14", 3.141}
});
}
public keep2DecimalParameterizedTest(String expected, double param0) {
this.expected = expected;
this.param0 = param0;
}
@Test
public void add() throws Exception {
Assert.assertEquals(expected, Compute.keep2Decimal(param0));
}
}
我們現(xiàn)在運(yùn)行這個(gè)測試用例肯定是失敗的,因?yàn)镃ompute.keep2Decimal()這個(gè)方法我們還沒有實(shí)現(xiàn),下面我們就要?jiǎng)?chuàng)建這個(gè)類和方法,并實(shí)現(xiàn)相關(guān)邏輯。
第二步:編寫實(shí)現(xiàn)
根據(jù)測試用例實(shí)現(xiàn)該方法的功能
public class Compute {
/*保留兩位小數(shù),不能四舍五入*/
public static String keep2Decimal(double arg0) {
return String.format("%.2f", arg0);
}
}
第三步:運(yùn)行測試
運(yùn)行單元測試,發(fā)現(xiàn)參數(shù)化測試中的第二項(xiàng)失敗了Compute.keep2Decimal(2.156),運(yùn)行的結(jié)果是2.16,但是我們預(yù)期的結(jié)果是2.15,
第四步:改進(jìn)實(shí)現(xiàn)
public class Compute {
/*保留兩位小數(shù),不能四舍五入*/
public static String keep2Decimal(double arg0) {
return String.format("%.2f", (int) (arg0 * 100) /100.0);
}
}
第五步:重新測試
測試通過
上述例子分析
傳統(tǒng)的開發(fā)周期是由以下環(huán)節(jié)組成的:編碼、測試、(重復(fù))、提交。開發(fā)者使用TDD后則做出了一個(gè)似乎很微小但是實(shí)際上卻驚人有效的調(diào)整:測試、編碼、(重復(fù))、提交。測試推動(dòng)了設(shè)計(jì),并成為了方法的第一個(gè)客戶。