對Salary類(lèi)進(jìn)行重構之后,所有測試都可以通過(guò)了,這樣也就實(shí)現了用測試來(lái)驅動(dòng)開(kāi)發(fā)。當然,我們這里只是對設計中的第一個(gè)功能進(jìn)行了足夠的測試,完成了第一個(gè)功能的開(kāi)發(fā)。我們還可以在這個(gè)基礎上編寫(xiě)更多的測試,進(jìn)入下一個(gè)以測試驅動(dòng)開(kāi)發(fā)的迭代。我們可以按照上面的過(guò)程以測試來(lái)驅動(dòng)第二個(gè)功能的實(shí)現:
[TestMethod]
void TestInvalidInput()
{
std::unique_ptr pClass(new Salary(2003));
// 測試第二個(gè)功能點(diǎn):能夠對錯誤的輸入年份返回相應的錯誤代碼
Assert::AreEqual(-1, pClass->GetSalary(2001));
// 測試臨界輸入是否返回正確結果
Assert::AreEqual(1000, pClass->GetSalary(2003));
};
為了讓這個(gè)測試通過(guò),我們必須對Salary進(jìn)行重構,讓它對錯誤的輸入進(jìn)行處理并返回相應的錯誤代碼:
class Salary
{
public:
Salary(int nBaseYear)
:m_nBaseYear(nBaseYear)
{};
public:
int GetSalary(int nNow)
{
int nYears = nNow - m_nBaseYear;
// 對錯誤的輸入進(jìn)行處理并返回相應的錯誤代碼
if( nYears < 0 )
{
return -1;
}
else
{
// 正確的輸入返回相應的計算結果
return 300*(nNow - m_nBaseYear) + 1000;
}
}
private:
int m_nBaseYear;
};
經(jīng)過(guò)重構之后,測試項目中的所有測試都可以順利通過(guò),這也宣告了我們這一次的代代已經(jīng)順利完成。而通過(guò)不斷地進(jìn)行這樣的迭代,我們可以實(shí)現設計中的所有功能。
經(jīng)過(guò)簡(jiǎn)單的幾次迭代,我們就以測試驅動(dòng)了Salary的實(shí)現。整個(gè)過(guò)程完美地體現了測試驅動(dòng)開(kāi)發(fā)的強大優(yōu)勢:這種從使用者角度對代碼進(jìn)行的設計通常更符合后期開(kāi)發(fā)的需求。因為關(guān)注用戶(hù)反饋,可以及時(shí)響應需求變更,同時(shí)因為從使用者角度出發(fā)的簡(jiǎn)單設計,也可以更快地適應變化。同時(shí),測試驅動(dòng)開(kāi)發(fā)將測試工作提到編碼之前,并頻繁地運行所有測試,可以盡量地避免和盡早地發(fā)現錯誤,極大地降低了后續測試及修復的成本,提高了代碼的質(zhì)量。在測試的保護下,不斷重構代碼,以消除重復設計,優(yōu)化設計結構,提高了代碼的重用性,從而提高了軟件產(chǎn)品的質(zhì)量。
測試驅動(dòng)開(kāi)發(fā)的優(yōu)勢自不待言,從整個(gè)過(guò)程中我們也可以體會(huì )到,有了Visual C++ 2010的支持,面向C++的測試驅動(dòng)開(kāi)發(fā)也可以同樣的快捷而簡(jiǎn)便。測試驅動(dòng)開(kāi)發(fā)的優(yōu)勢如此誘人,而我們又有了Visual C++ 2010這個(gè)工具的強力支持,我們不妨一試,讓測試驅動(dòng)開(kāi)發(fā)使得我們的生活更加輕松。
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/