通常我們設(shè)計一個應(yīng)用程序,并且快速創(chuàng)建單元測試來驗證我們的設(shè)計,在我們編寫這些測試時,這些測試也可以幫助改善了我最初的設(shè)計。隨著我們編寫越來越多的單元測試,正反饋的良性循環(huán)也會鼓勵我們盡早地編寫單元測試。當(dāng)我們設(shè)計并實現(xiàn)時,就自然地想要知道我們將會如何來測試一個類?;谶@一方法論,越來越多的開發(fā)者正從利于測試躍遷到測試驅(qū)動開發(fā)。
通過簡單例子來理解TDD
下面我們就從"保留兩位小數(shù),不能四舍五入"的例子理解什么是測試驅(qū)動開發(fā)。
問題:
編寫一個方法,輸入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)在運行這個測試用例肯定是失敗的,因為Compute.keep2Decimal()這個方法我們還沒有實現(xiàn),下面我們就要創(chuàng)建這個類和方法,并實現(xiàn)相關(guān)邏輯。
第二步:編寫實現(xiàn)
根據(jù)測試用例實現(xiàn)該方法的功能
public class Compute {
/*保留兩位小數(shù),不能四舍五入*/
public static String keep2Decimal(double arg0) {
return String.format("%.2f", arg0);
}
}
第三步:運行測試
運行單元測試,發(fā)現(xiàn)參數(shù)化測試中的第二項失敗了Compute.keep2Decimal(2.156),運行的結(jié)果是2.16,但是我們預(yù)期的結(jié)果是2.15,
第四步:改進(jìn)實現(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后則做出了一個似乎很微小但是實際上卻驚人有效的調(diào)整:測試、編碼、(重復(fù))、提交。測試推動了設(shè)計,并成為了方法的第一個客戶。