2012年2月21日 星期二

HBase-0.90.4 本機測試

上一篇takeshi談到如何在Hadoop上作本機測試,這次takeshi要談的是如何在HBase作本機測試,這也是takeshi目前專案正在使用的解決方案

此解決方案的採用,幫助團隊在複雜的mapReduce演算法研究和開發上,帶來相當大的效益;接下來,takeshi打算把原本相依於外部HBase環境和相關測試資料的功能性測試程式,重構成此解決方案的版本

 廢話不多說,接下來就介紹HBase本機測試的作法吧!

前提
1. 環境是HBase-0.90.4
2. 本解法參考的資料來源在這裡,此篇blog介紹了如何使用HBaseTestingUtility類別來初始local mini-cluster instance和使用ImportTsv類別來建構測試資料的方法;另外也參考了HBase的source code

準備工作
1. 誠如上一篇所講,如果是Windows環境的朋友,請先安裝cygwin

2. takeshi已把sample code整理成maven專案,檔案在這裡
2.1 要運行此專案需要使用maven, 請參考maven官網,或者也可以參考takeshi的文章ㄛ(打一下廣告^^)
2.2 假如朋友們要把maven專案 import到eclispe的話,要先在eclispe裝上m2eclispe plug-in

執行測試程式
把zip檔載下來後,解壓縮到你想放置的路徑(假設是$PROJECT_HOME),接著進入命令列模式(Command Line Interface, CLI),進入$PROJECT_HOME路徑執行mvn clean test,接著maven便會開始啟動HBase本機測試程式囉!

測試程式簡介
專案裡有三支測試程式,分別簡介如下...

AbstractHBaseMiniClusterTest
從名稱也看得出來,是一支抽象類別(Abstract Class),它把啟動和關閉HBaseTestingUtility類別的工作封裝在裡面,並另外提供一些工具方法(utility methods),另外兩支測試程式的super-class,程式碼如下...

public abstract class AbstractHBaseMiniClusterTest {

  //a static constant property for HBaseTestingUtility instance
  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
 
  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
    //start mini-cluster instance for 3 datanodes
    TEST_UTIL.startMiniCluster(3);
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
    //shutdown mini-cluster instance
    TEST_UTIL.shutdownMiniCluster();
  }

  //following are utility methods...


FromClientSideTest
從HBase專案的測試程式借過來的,可以確認mini-cluster的可用性,這支測試程式提供了相當多的方法,如果在developer的本機環境都測過的話,表示mini-cluster是沒有問題的囉~


HBaseMiniClusterTest
這支測試程式是為了驗證ImportTsv類別的正確性所寫的,朋友們可以借由此測試程式來了解如何把測試資料倒入本機的mini-cluster,程式碼如下...

public class HBaseMiniClusterTest extends AbstractHBaseMiniClusterTest {

  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
    //start mini-cluster
    AbstractHBaseMiniClusterTest.setUpBeforeClass();
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
    //shutdown mini-cluster
    AbstractHBaseMiniClusterTest.tearDownAfterClass();
  }

  @Test //a test method for test data dumping
  public void testImportCompanyInfo() throws Exception {
    //prepare parameters
    //...
    //dump test data into mini-cluster
    importLocalFile2Table(conf, args, INPUT_FILE, INPUT_FILE_PATH);
    //...
    //validate the test data
    //...
  } 

心得分享
這次takeshi為了要找到本機測試解決方案,花了不少時間在trace HBase的source code,takeshi要跟大家分享的是,現在的opensource專案都遵守測試先行開發(Test Driven Development,TDD),除了對於開發團隊來說是程式品質的保證之外,對於takeshi這種「體制外的路人甲 XD」來說,這些測試程式也是「重要的文件ㄛ」!

例如,takeshi在研究HBaseTestingUtility和ImportTsv類別時,就是藉由它們的單元測試程式中的輸出入值和斷言(Assertion) ,來推導出它們的使用方法的,這也是takeshi提倡TDD的主要因素之一啦~

希望這些東東能幫助到正在看這篇文章的你/妳囉 ^^

沒有留言:

張貼留言