從企業(yè)的運行價(jià)值鏈說(shuō)起——我眼中的測試驅動(dòng)開(kāi)發(fā)(TDD) 軟件測試
看了一期中央電視臺的《對話(huà)》欄目,節目對三星CEO尹鐘龍進(jìn)行了訪(fǎng)談。其中,現場(chǎng)一位女士的一句話(huà)令我印象深刻。她提到一個(gè)企業(yè)的運行價(jià)值鏈,共分為三步:首先是發(fā)現價(jià)值,找到目標市場(chǎng);第二步是生產(chǎn)價(jià)值,將高質(zhì)量的產(chǎn)品生產(chǎn)出來(lái);最后是保護價(jià)值或收獲價(jià)值,做好品牌。
怎么理解呢?這位女士以Nike作比喻。第一步是設計Nike鞋,這就是發(fā)現價(jià)值,可能獲得100美元的價(jià)值;然后再拿到中國來(lái)生產(chǎn),大約是10美元;最后再將生產(chǎn)好的鞋子,貼上Nike的商標送回到美國去賣(mài),又可以收獲90美元。一雙鞋售價(jià)200美元,而生產(chǎn)價(jià)值所能收獲的卻只有10美元。這一步獲取利益最低,我們中國的公司卻做得最好。而怎么去發(fā)現價(jià)值,然后又怎樣去鞏固自己的品牌和知名度,中國的公司就做得不那么好了。
據我的了解,國內的軟件開(kāi)發(fā)應用TDD相對較少,很多人認為:測試驅動(dòng)開(kāi)發(fā)是個(gè)好東東,但似乎不符合中國國情。說(shuō)到原因,最多的一條就是項目時(shí)間緊,沒(méi)有時(shí)間寫(xiě)測試代碼。在項目中,到底該不該使用TDD,大多數人持懷疑或觀(guān)望的態(tài)度。這種態(tài)度與觀(guān)點(diǎn),就讓我想起了如上《對話(huà)》中的這一段話(huà)。
再仔細分析企業(yè)運行價(jià)值鏈的三步走,我覺(jué)得和軟件開(kāi)發(fā)的TDD價(jià)值鏈很相似。第一步,是發(fā)現價(jià)值。應用到TDD中,就是測試先行,通過(guò)測試來(lái)驅動(dòng)我們編寫(xiě)代碼。第二步,生產(chǎn)價(jià)值。毋庸置疑,這正是編寫(xiě)代碼的一個(gè)階段。而第三步,就是收獲價(jià)值,在TDD中,我們收獲的不僅有開(kāi)發(fā)后完整的產(chǎn)品,同時(shí)還收獲了完整的測試套件。和Nike鞋的生產(chǎn)一樣,我們在軟件開(kāi)發(fā)中,過(guò)度地重視了第二步生產(chǎn)價(jià)值階段,而對于第一步和第三步,要么是忽略了,要么就是沒(méi)有提高到相應的高度。
一、發(fā)現價(jià)值與生產(chǎn)價(jià)值
習慣了傳統開(kāi)發(fā)模式的程序員,非常不適應寫(xiě)代碼之前,先寫(xiě)測試的方法,這其中也包括我。那么,我們一般是怎樣去發(fā)現價(jià)值的呢?首先通過(guò)需求分析,然后進(jìn)入設計階段。在設計階段期間,再?lài)@需求分析的結果,更多的是從實(shí)現的角度,而非從客戶(hù)應用的角度出發(fā)。TDD顛覆了這種模式。因為需要測試先行,就驅動(dòng)了程序員必須從功能出發(fā)、從應用出發(fā)。在寫(xiě)測試代碼的過(guò)程中,我們需要考慮要實(shí)現那些功能,相應的類(lèi)的名稱(chēng)、對象的創(chuàng )建方式,以及可能會(huì )應用到的模式和策略,如此種種,在這個(gè)過(guò)程中,如剝筍子一般逐漸地規定出來(lái)了。
在這個(gè)過(guò)程中,我們要審慎地選擇測試的步子。昂首闊步雖然顯得氣勢軒昂,行進(jìn)快速,但往往會(huì )忽略沿途的風(fēng)景。在測試驅動(dòng)開(kāi)發(fā)中,我建議你小心的規劃測試樣例,從測試樣例的逐步完善中,漸進(jìn)地驅動(dòng)出你更加完善的代碼。例如,我需要開(kāi)發(fā)一個(gè)智能的個(gè)人助理,它目前能提供的功能是:能夠讓用戶(hù)定制自己感興趣的類(lèi)別,然后個(gè)人助理根據用戶(hù)的定制進(jìn)行搜索,并將搜索得到的結果按不同的類(lèi)別進(jìn)行存儲。
我們來(lái)嘗試一下TDD的過(guò)程。根據對功能的分析,我們首先應該有一個(gè)智能助理對象,測試代碼如下:
[Test]
public void TestSmartAssistor()
{
SmartAssistor assistor = new SmartAssistor();
Assert.IsNotNull(assistor);
}
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/