回歸
當(dāng)要發(fā)布版本,或者編譯新的hadoop版本的時候,可以在編譯的同時進(jìn)行回歸測試,將所有相關(guān)的testcase全部運行一遍,看某些改動會不會影響到其他的模塊的邏輯。這種情況下,可以通過ant來運行相應(yīng)的target,以運行所有的用例測試。如下圖所示:
這樣,對target為test-core的所有用例,就會進(jìn)行一次全部的回歸,當(dāng)所有的用例全部通過,就至少能夠保證在已經(jīng)預(yù)料到的情形下,目前的代碼版本不會有什么問題了。每個case都會記錄其全部的日志,日志記錄的路徑在: ${HADOOP_HOME}/build/test中,如下圖所示:
這樣對于出錯的testcase,就可以找到相應(yīng)的出錯日志,查看為什么case會失敗,進(jìn)而發(fā)現(xiàn)代碼修改引發(fā)的其他問題。
隨著testcase的增多,運行一次完整的回歸可能需要花費很長的時間,長的話可能需要好幾個小時。所以如果希望在ant模式下運行單獨的testcase,也是可以的,可以通過
ant –Dtestcase=${casename} test-core
就可以了,其中casename為測試用例的name,例如TestDFSRename。
一些測試工具
我們常常需要對HDFS或者mapreduce進(jìn)行一些性能方面的測試,比如測試rpc的性能,測試DFS的IO讀寫性能,測試DFS的吞吐率性能,測試namenode的benchmark性能,mapreduce的sort性能等等。在hadoop的發(fā)行版中,其實已經(jīng)提供了許多類似的工具,并已經(jīng)打包成jar,供我們使用。以下是0.20.2中自帶的一系列工具列表:
單獨運行每個工具,都會有詳細(xì)的幫助信息輸出到命令行,根據(jù)命令行提示,就可以對很多想要進(jìn)行性能測試的模塊進(jìn)行壓力和性能測試。每個工具最終都會輸出一個統(tǒng)計結(jié)果。若要定制自定義的壓力測試工具,可以自己動手編寫相應(yīng)的壓力測試程序,然后注冊到org.apache.hadoop.test.AllTestDriver中。如想要了解每個benchmark工具的細(xì)節(jié),可以從AllTestDriver中找到相應(yīng)的測試工具的代碼。
總結(jié)
可以看出,hadoop發(fā)行版中的測試環(huán)境已經(jīng)非常豐富,對于模擬集群環(huán)境的類,工具等都已經(jīng)有不少了。這些代碼和工具對于程序開發(fā)者來說,非常有用。要編寫新的測試代碼,添加新的測試用例,也都非常方便。對于避免程序修改引起其他的相關(guān)問題等,都非常有效。
但是,可以看出,除了一些測試工具外,很多的測試用例都是運行在模擬環(huán)境中,并沒有針對真實的集群環(huán)境進(jìn)行的相關(guān)測試框架。這種缺陷的原因在于,許多的測試用例是需要對hadoop集群的daemon進(jìn)程進(jìn)行個性化的設(shè)置,這樣就造成對集群需要個性化的啟停,重啟操作,而0.20之前還沒有通過java API來實現(xiàn)在測試用例中方便的對真實的集群進(jìn)行reconfiguration,restart的功能,必須要有外圍的人工和腳本的介入。而一旦需要外圍人工和腳本的介入,許多的測試就無法達(dá)到自動化的效果。所以,從0.21開始,hadoop發(fā)行版中引入了一個新的Large-Scale Automated Test Framework(HADOOP-6332)。
0.21開始的版本
從0.21開始,hadoop發(fā)行版中引入了一個新的測試框架,Large-Scale Automated Test Framework,該框架跟以前的測試框架不同之處在于,基于它之上的測試的開發(fā)是基于真正的集群環(huán)境的系統(tǒng)層面的,取名叫做Herriot。
Herriot測試框架最大的特點在于,可以通過Herriot中提供的對HDFS或者M(jìn)R系統(tǒng)的API,來直接啟動,停止,重啟一個真實的hadoop集群,并能夠保證每次case的運行都是在一個全新的集群執(zhí)行環(huán)境中。這樣能夠達(dá)到的效果就是,通過java代碼的testcase,就能夠完成所有真實集群環(huán)境的自動化測試,而不需要額外的人工和外圍腳本的介入。
目錄結(jié)構(gòu)
Herriot使用的是JUnit4的框架,JUnit關(guān)鍵的一些fixtures都會在Herriot框架中被用到。如@Before, @After等。所以對于測試的開發(fā)人員而言,Herriot測試框架其實就是JUnit的測試用例編程。所以,熟悉JUnit測試用例開發(fā)的人,使用Herriot框架都不存在問題。
更多詳細(xì)信息,請您微信關(guān)注“計算網(wǎng)”公眾號: