干貨|在JVM上測試Apache Kudu應用程序
盡管Kudu服務器是用C ++編寫的,用于提高性能和效率,但開發(fā)人員可以用C ++,Java或Python編寫客戶端應用程序。為了讓Java開發(fā)人員更容易創(chuàng)建可靠的客戶端應用程序,我們在Kudu 1.9.0中添加了新的實用程序,可以輕松使用Kudu集群編寫測試,不需要自己構(gòu)建Kudu,不需要任何C ++知識,也不需要每次測試開始和停止Kudu集群的復雜協(xié)調(diào)。本文主要描述新的測試實用程序如何工作以及如何在應用程序測試中使用它們。
如果您對此測試有疑問,歡迎聯(lián)系慧都大數(shù)據(jù)在線客服,慧都大數(shù)據(jù)提供數(shù)據(jù)采集-處理-建模-可視化分析的全方位解決方案,實現(xiàn)企業(yè)決策智能化!
話不多說,開始我們今天的主題。
要求
要使用新的測試實用程序,必須滿足以下要求:
- OS
macOS El Capitan (10.11) 或以上
CentOS 6.6+, Ubuntu 14.04+, 或其它Kudu支持的最新Linux發(fā)行版
- JVM
Java 8+
注:Java 7+已棄用,但仍支持
- 構(gòu)建工具
Maven 3.1或以上,要求支持os-maven-plugin
Gradle 2.1或以上,要求支持osdetector-gradle-plugin
任何其他可以從Maven下載正確jar的構(gòu)建工具
構(gòu)建配置
要使用Kudu測試實用程序,請在類路徑中添加兩個依賴項:
- kudu-test-utils依賴
- kudu二進制依賴
kudu-test-utils依賴項具有用于測試使用Kudu應用的實用程序。 首先,它提供了KuduTestHarness類來管理每個測試的Kudu集群的生命周期。 KuduTestHarness是一個JUnit TestRule,它不僅可以為每個測試啟動和停止Kudu集群,還有方法來管理集群并獲取預先配置的KuduClient實例,以便在測試時使用。
kudu-binary依賴項包含指定操作系統(tǒng)的原生Kudu(服務器和命令行工具)二進制文件。 為了正在運行的操作系統(tǒng)下載正確的工件,最簡單的方法是使用插件(例如os-maven-plugin或osdetector-gradle-plugin)來檢測當前的運行時環(huán)境。 KuduTestHarness將自動在類路徑中查找并使用kudu-binary jar。
警告:kudu-binary模塊應僅用于運行Kudu進行集成測試。它永遠不應該用于在生產(chǎn)或開發(fā)中運行實際的Kudu服務,因為kudu-binary模塊包含已從構(gòu)建系統(tǒng)復制的本機安全相關依賴項,當運行時主機上的操作系統(tǒng)打補丁時并不會被修補。
Maven配置
如果您使用Maven構(gòu)建項目,請將以下條目添加到項目的pom.xml文件中:
kr.motd.maven os-maven-plugin 1.6.2 org.apache.kudu kudu-test-utils 1.9.0 test org.apache.kudu kudu-binary 1.9.0 ${os.detected.classifier} test
Gradle配置
如果您使用Gradle構(gòu)建項目,請將以下條目添加到項目的build.gradle文件中:
plugins { // Used to find the right kudu-binary artifact with the Gradle // property ${osdetector.classifier} id "com.google.osdetector" version "1.6.2" } dependencies { testCompile "org.apache.kudu:kudu-test-utils:1.9.0" testCompile "org.apache.kudu:kudu-binary:1.9.0:${osdetector.classifier}" }
測試設置
正確配置項目后,可以使用kudu-test-utils和kudu-binary工件開始編寫測試。 這一行代碼將確保每個測試自動啟動和停止真正的Kudu群集,并通過slf4j輸出群集日志記錄:
@Rule public KuduTestHarness harness = new KuduTestHarness();
KuduTestHarness具有獲取預配置客戶端,啟動和停止服務器等的方法。下面是一個示例測試,展示了一些功能:
import org.apache.kudu.*; import org.apache.kudu.client.*; import org.apache.kudu.test.KuduTestHarness; import org.junit.*; import java.util.Arrays; import java.util.Collections; public class MyKuduTest { @Rule public KuduTestHarness harness = new KuduTestHarness(); @Test public void test() throws Exception { // Get a KuduClient configured to talk to the running mini cluster. KuduClient client = harness.getClient(); // Some of the other most common KuduTestHarness methods include: AsyncKuduClient asyncClient = harness.getAsyncClient(); String masterAddresses= harness.getMasterAddressesAsString(); ListmasterServers = harness.getMasterServers(); List tabletServers = harness.getTabletServers(); harness.killLeaderMasterServer(); harness.killAllMasterServers(); harness.startAllMasterServers(); harness.killAllTabletServers(); harness.startAllTabletServers(); // Create a new Kudu table. String tableName = "myTable"; Schema schema = new Schema(Arrays.asList( new ColumnSchema.ColumnSchemaBuilder("key", Type.INT32).key(true).build(), new ColumnSchema.ColumnSchemaBuilder("value", Type.STRING).key(true).build() )); CreateTableOptions opts = new CreateTableOptions() .setRangePartitionColumns(Collections.singletonList("key")); client.createTable(tableName, schema, opts); KuduTable table = client.openTable(tableName); // Write a few rows to the table KuduSession session = client.newSession(); for(int i = 0; i < 10; i++) { Insert insert = table.newInsert(); PartialRow row = insert.getRow(); row.addInt("key", i); row.addString("value", String.valueOf(i)); session.apply(insert); } session.close(); // ... Continue the test. Read and validate the rows, alter the table, etc. }
有關使用KuduTestHarness的項目的完整示例,請參閱Kudu源代碼存儲庫中的java-example項目。Kudu項目本身使用KuduTestHarness進行所有自己的集成測試。對于更復雜的示例,您可以在Kudu源代碼庫中探索各種Kudu集成測試。
反饋
Kudu 1.9.0是第一個提供這些測試實用程序的版本。 雖然這些實用程序簡化了Kudu應用程序的測試,但總有改進的余地。
歡迎撥打慧都熱線023-68661681或咨詢慧都在線客服,我們將幫您轉(zhuǎn)接大數(shù)據(jù)專業(yè)團隊,并發(fā)送相關資料給您!