單元測試:通過簡單例子理解測試驅(qū)動(dòng)開發(fā)(TDD)

通常我們?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è)客戶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評(píng)論 25 709
  • 1.測試與軟件模型 軟件開發(fā)生命周期模型指的是軟件開發(fā)全過程、活動(dòng)和任務(wù)的結(jié)構(gòu)性框架。軟件項(xiàng)目的開發(fā)包括:需求、設(shè)...
    Mr希靈閱讀 22,405評(píng)論 7 278
  • 1.測試與軟件模型 軟件開發(fā)生命周期模型指的是軟件開發(fā)全過程、活動(dòng)和任務(wù)的結(jié)構(gòu)性框架。軟件項(xiàng)目的開發(fā)包括:需求、設(shè)...
    宇文臭臭閱讀 6,870評(píng)論 5 101
  • 本文結(jié)構(gòu): 什么是 TDD 為什么要 TDD 怎么 TDD FAQ 學(xué)習(xí)路徑 延伸閱讀 什么是 TDD TDD 有...
    李浪溪_WaterLee閱讀 76,778評(píng)論 16 168
  • 轉(zhuǎn)自http://www.07net01.com/2016/10/1687441.html 我之前在《前端搭環(huán)境之...
    JasonQiao閱讀 811評(píng)論 0 1

友情鏈接更多精彩內(nèi)容