天天看點

《Storm實時資料處理》一1.8 對Bolt進行單元測試

本節書摘來華章計算機《storm實時資料處理》一書中的第1章 ,第1.8節,(澳)quinton anderson 著 盧譽聲 譯更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

對于任何産品傳遞來說,單元測試都是其重要組成部分,我們也必須對bolt中實作的邏輯進行單元測試。

step01 在src/test/java目錄下建立storm.cookbook包,然後建立stormtestcase類。該類是一些初始化代碼的抽象類:

《Storm實時資料處理》一1.8 對Bolt進行單元測試

step02 建立testrepeatvisitbolt類,并繼承stormtestcase,然後使用參數化執行器注解來标記它:

《Storm實時資料處理》一1.8 對Bolt進行單元測試

step03 execute方法中涵蓋了類的測試用例邏輯:

《Storm實時資料處理》一1.8 對Bolt進行單元測試

step04 接下來,我們還需要定義一些參數:

《Storm實時資料處理》一1.8 對Bolt進行單元測試

step05 在使用redis進行測試之前,必須初始化一些基本配置的值:

《Storm實時資料處理》一1.8 對Bolt進行單元測試

保留測試完成後棧中的資料總是有用的,這樣便于複查和調試邏輯。我們隻要在下一次測試執行時清理棧中的資料就好了。

首先,單元測試是由一組測試資料驅動的測試。這就是說我們能在測試不同用例的時候免去許多無謂和重複的操作。在測試運作之前會将靜态資料寫入redis 資料庫中,保證了測試的正确運作。接着測試程式就會一行一行地執行參數化的測試資料,并驗證許多不同的用例。

jmock負責mock收集器及bolt發送的tuple。然後通過mock的對象與對象之間的互動來定義我們預期執行的操作:

《Storm實時資料處理》一1.8 對Bolt進行單元測試

我們應該把expectations對象内的代碼當做描述性的語言來了解。比如方法體第一行的意思就是:希望tuple的getstringbyfield方法被精确地調用一次(必須隻被調用一次),而且必定會傳回一個值給被測試的對象。

這種機制能夠讓我們準确地測試bolt。

還有很多種不同的單元測試方法,我們通常會利用資料庫來實作測試。除非萬不得已,還是建議mock所有類的依賴項,這樣才能實作真正意義上的單元測試。對于“地理位置資訊bolt”的resolver抽象結構來說,我們完全可以mock所有成員。