背景
從使用hadoop的第一天開始,就一直沒有離開過對Hadoop自身功能的開發(fā)以及hadoop本身bug的修復的相關開發(fā)。這樣的開發(fā)模式已經(jīng)持續(xù)了好幾年,但是可以從中發(fā)現(xiàn)的一個現(xiàn)象:對于我們修復的bug或者開發(fā)的功能,一直都沒有一種很規(guī)范,很統(tǒng)一,高效,好管理,并且一目了然的測試的方式。常常的現(xiàn)象是:開發(fā)了一個功能或修復了一個bug后,就針對該修改進行一些人為手動的環(huán)境模擬和測試,然后測試確認沒有問題以后,就合入基線版本進行打包上線。這種模式的缺點是:
- 1. 沒有統(tǒng)一的測試框架和測試規(guī)范,很容易導致做一次修改,就需要認為的搭建或模擬一些針對該修改的現(xiàn)象進行測試,而這次測試完成后,環(huán)境撤掉,又沒有形成相應的文檔,導致后續(xù)進行版本發(fā)布的時候,無法進行回歸測試。
- 2. 測試環(huán)境的模擬取決于進行測試的人員自身的考慮。所以對同一個修改的測試,隔一段時間以后換一個人測,方式和結果可能大相徑庭。
- 3. 對于一些性能相關的測試,沒有相應的性能測試工具,這樣很容易導致對于運行了很長時間的集群,沒有人能夠準確的說出集群的各種性能指標。對于以后的改進和優(yōu)化,也無法量化優(yōu)化和改進的效果數(shù)據(jù),很難進行評估。
- 4. 開發(fā)人員跟測試人員通常是同一個人。
其實,hadoop每個版本都包含有很多功能和改進所對應的測試代碼,每個版本發(fā)布,或者每個patch合入的時候,都會將所有的測試用例進行一次完整的回歸,這樣可以確保修改不會影響到其他的模塊或其他的功能。所以對hadoop測試相關的了解其實跟對hadoop本身代碼的了解以及后續(xù)的開發(fā),其實同樣重要。
本文接下來的部分會對目前hadoop中測試相關的框架和結構進行簡單介紹,并會在介紹后提供一些例子,以展示如何對hadoop的內核開發(fā)進行測試代碼的編寫。
0.21以前的版本
目錄結構
在hadoop 0.21以前的版本中(這里拿0.20為例,其他版本可能有少許不同),所有的測試相關代碼都是放置在${HADOOP_HOME}/src/test下,在該目錄下,是按照不同的目錄來區(qū)分針對不同模塊的測試代碼。這里需要了解的是:對于相應的hadoop代碼和class的包結構,在test中也是以相同的包結構來管理。比如,對于org.apache.hadoop.hdfs.server.namenode中的代碼,其源碼在src/hdfs/org/apache/hadoop/hdfs/server/namenode中,其測試用例的代碼就位于:/src/test/org/apache/hadoop/hdfs/server/namenode內。其他模塊以此類推。
測試用例結構
以hdfs為例,對于不需要集群環(huán)境的測試,其測試代碼就跟尋常的單元測試代碼一樣,無非是程序級別的一些驗證和assert,跟一般的測試用例代碼沒有什么區(qū)別。
MiniDFSCluster
若需要模擬HDFS集群環(huán)境,但有沒有真是的集群情況下,hadoop測試代碼中提供了一個MiniDFSCluster的類,這個類提供了一個本機單進程的hdfs集群環(huán)境,用來模擬對hdfs集群環(huán)境的模擬。在對該類進行初始化時,程序會根據(jù)構造函數(shù)參數(shù)來設置集群環(huán)境下相應的關鍵配置和參數(shù)設置,比如:dfs.name.dir,dfs.data.dir,fs.checkpoint.dir,fs.default.name(這里會設置為hdfs://localhost:port,相當于一個一臺機器的hdfs分布式環(huán)境),同時會根據(jù)從參數(shù)獲取的datanode數(shù)來初始化一些datanode,這樣一個真實的分布式環(huán)境就能構建出來,如果對某項功能的測試中需要設置相應的namenode或datanode配置參數(shù),只需對構造函數(shù)參數(shù)中的conf對象進行set即可。
Example
這里拿TestDFSRename用例來做example:
- 構建MiniDFSCluster環(huán)境,所以在testcase的setup()中如下初始化hdfs cluster
- 獲取DistributeFileSystem實例:
- 編寫自己的testRename()方法。
運行testcase
在IDE中調試運行
通常對于這種單元測試的testcase,都是可以在開發(fā)環(huán)境的IDE中直接運行,如下如所示:
更多詳細信息,請您微信關注“計算網(wǎng)”公眾號: