iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
Software Development

用30天介紹 open source 專案 Ohara 系列 第 26

Day 26 關於 Ohara 的測試程式 (二)

  • 分享至 

  • xImage
  •  

昨天已經介紹了 Ohara 單元測試程式的部份了,單元測試的目的就是要確認程式方法內的邏輯是正確的,符合預期的結果。今天要介紹 Ohara 的另外一個測試,就是整合測試, Ohara 整合測試主要的目的如下:

  1. 測試模組和模組之間的呼叫是否會有問題,例如測試 ohara-configurator 模組的 Restful API 呼叫 ohara-agent 的模組來建立 Zookeeper、Broker 和 Worker cluster 的 container,主要目的用來測試資料的傳遞是否會有問題。

  2. 連到真實的環境上,測試開發的程式是否會有問題,例如測試 JDBC Source Connector 就會連接到外部的資料庫,像是 Oracle Database、Postrgresql....等等的資料庫做測試,主要目的是測試連到外部系統是否會遇到設定的問題,最常見的就是時區的問題,造成資料查詢的結果是非預期的結果。

Ohara 整合測試程式放在 ohara-it 的模組下面,在 build.gradle 的檔案會做以下的設定:

test { 
  def keywords = [ 
    "ohara.it.docker", 
    "ohara.it.hostname", 
    "ohara.it.port", 
    "ohara.it.k8s", 
    "ohara.it.k8s.nodename", 
    "ohara.it.container.prefix", 
    "ohara.it.db.url", 
    "ohara.it.db.username", 
    "ohara.it.db.password", 
    "ohara.it.jar.folder" 
  ] 

  keywords.forEach { 
    keyword -> 
      if(project.hasProperty(keyword)) environment keyword, project.getProperty(keyword) 
  } 
} 

以上的設定主要目的就是要在執行 gradle test 指令的時侯可以指定參數,連到外部系統做測試,例如要執行連到 postgresql 的 database 做測試可以使用以下的指令:

$ gradle clean ohara-it:test --tests ${TEST_CLASS_NAME} -Pohara.it.db.url=jdbc:postgresql://localhost:1521 -Pohara.it.db.username=user –Pohara.it.db.password=password  

以上的指令就可以通過設定參數的方式讓測試程式可以取得以上的設定參數,然後來連到外部系統,這有個好處就是程式碼在其它的環境上只要指定不同的環境的連線方式就可以執行整合測試的部份。 像是 Ohara 的 QA Server 就會使用以上的參數來指定外部環境的連線資訊, 這樣開發和 QA Server 就可以使用不同的外部系統來做測試,避免互相的干擾。

如果沒有指定外部環境的參數 Ohara 的整合測試會做什麼處理?
沒有指定參數在執行 Ohara 的測試程式,就會 skipTest。如果沒有 skipTest 有可能因為測試無法連到外部環境而測試程式一直在 retry ,過一段時間就會收到連線失敗的 Exception,但這樣有點浪費測試的時間。

所以要先去檢查設定的參數是否存在如果不存在就直接跳過測試,以下就是一段簡單的 sample code :

  import org.junit.AssumptionViolatedException 
  private[this] val K8S_NODES_KEY: String = "ohara.it.k8s.nodename" 

  def k8sNodes(): Seq[Node] = sys.env 
    .get(K8S_NODES_KEY) 
    .map( 
      _.split(",") 
        .map(node => 
          Node( 
            hostname = node, 
            port = Some(22), 
            user = Some("fake"), 
            password = Some("fake"), 
            services = Seq.empty, 
            lastModified = CommonUtils.current(), 
            validationReport = None, 
            tags = Map.empty 
        )) 
        .toSeq) 
    .getOrElse(throw new AssumptionViolatedException(s"$K8S_NODES_KEY does not exists!!!")) 

以上這一段程式碼在 EnvTestingUtils.scala 裡,當 ohara.it.k8s.nodename 沒有設定 node 的列表就會 skipTest,然後收到 ohara.it.k8s.nodename does not exists !!! 的訊息,提醒開發者沒有輸入連到外部系統的參數。

如果對以上程式碼有興趣,可以參考以下的連結:
https://github.com/oharastream/ohara/blob/master/ohara-it/src/test/scala/com/island/ohara/it/EnvTestingUtils.scala

Ohara 目前在建立 zookeeper、broker 和 worker cluster 的 container 有分為 SSH 和 Kubernetes 二種的模式,它們雖然是不同的系統,但是程式在執行所要求的邏輯行為是一樣的,因此在整合測試程式的撰寫的話會先建立一個 BaseTest4Collie 的抽像化類別,把所有的測試情境都寫上去,像是要建立一 個 Node 之後,再新增一個 Node 然後再把 Node 刪除…等等的情境都寫上去,這樣就等於是定義了一個規格,SSH 和 Kubernetes 的整合測試實作都會繼承 BaseTest4Collie 抽像化類別, 如果有跑過 BaseTest4Collie 定義的測試,就代表符合 Ohara 所要求建立 cluster 的規定。

這樣未來如果 Ohara 要整合 Apache Mesos 的 cluster 管理,在整合測試的撰寫上也需要繼承BaseTest4Collie,來執行整合測試確認實作是否符合 Ohara 所要求建立 cluster 的規定。

如果對 BaseTest4Collie 的測試程式有興趣可以參考以下的連結:
https://github.com/oharastream/ohara/blob/master/ohara-it/src/test/scala/com/island/ohara/it/agent/BasicTests4Collie.scala

Ohara 在撰寫整合測試時還有一個值得分享的情境就是,在撰寫 JDBC Source Connector 的整合測試,因為 JDBC Source Connector 會連到資料庫裡,所以需要有 JDBC Driver 的 jar 檔才能連到資料庫,但是有很多 JDBC Driver 的 jar 檔都會有 license 的問題,像是:Oracle、MySQL…等等的 JDBC Driver 的 jar 檔,所以不可能直接包到要執行 Connector 程式的 Worker Docker Image 裡面,後來的解法就是透過 Configurator 的 Akka Http 服務啟動後,把 JDBC Driver 的 jar 檔 Upload 到 http 的服務上,然後再啟動 Worker 服務,再把上傳到 Cofigurator 的 JDBC Driver 的 jar 檔下載到 Worker 裡面,這樣在 Worker 上執行 JDBC Source Connector 程式就可以順利的連到 Oracle Database。

如果對這一段程式碼有興趣的話,可以參考以下的連結:
https://github.com/oharastream/ohara/blob/master/ohara-it/src/test/scala/com/island/ohara/it/connector/BasicTestConnectorCollie.scala

今天已經分享了 Ohara 整合測試程式的撰寫方法了,明天會介紹要如何的把測試程式整合到 QA 的環境上。


上一篇
Day 25 關於 Ohara 的測試程式 (一)
下一篇
Day 27 關於 Ohara 的 QA
系列文
用30天介紹 open source 專案 Ohara 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言