干貨|在JVM上測(cè)試Apache Kudu應(yīng)用程序
盡管Kudu服務(wù)器是用C ++編寫(xiě)的,用于提高性能和效率,但開(kāi)發(fā)人員可以用C ++,Java或Python編寫(xiě)客戶(hù)端應(yīng)用程序。為了讓Java開(kāi)發(fā)人員更容易創(chuàng)建可靠的客戶(hù)端應(yīng)用程序,我們?cè)贙udu 1.9.0中添加了新的實(shí)用程序,可以輕松使用Kudu集群編寫(xiě)測(cè)試,不需要自己構(gòu)建Kudu,不需要任何C ++知識(shí),也不需要每次測(cè)試開(kāi)始和停止Kudu集群的復(fù)雜協(xié)調(diào)。本文主要描述新的測(cè)試實(shí)用程序如何工作以及如何在應(yīng)用程序測(cè)試中使用它們。
如果您對(duì)此測(cè)試有疑問(wèn),歡迎聯(lián)系慧都大數(shù)據(jù)在線(xiàn)客服,慧都大數(shù)據(jù)提供數(shù)據(jù)采集-處理-建模-可視化分析的全方位解決方案,實(shí)現(xiàn)企業(yè)決策智能化!
話(huà)不多說(shuō),開(kāi)始我們今天的主題。
要求
要使用新的測(cè)試實(shí)用程序,必須滿(mǎn)足以下要求:
- 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測(cè)試實(shí)用程序,請(qǐng)?jiān)陬?lèi)路徑中添加兩個(gè)依賴(lài)項(xiàng):
- kudu-test-utils依賴(lài)
- kudu二進(jìn)制依賴(lài)
kudu-test-utils依賴(lài)項(xiàng)具有用于測(cè)試使用Kudu應(yīng)用的實(shí)用程序。 首先,它提供了KuduTestHarness類(lèi)來(lái)管理每個(gè)測(cè)試的Kudu集群的生命周期。 KuduTestHarness是一個(gè)JUnit TestRule,它不僅可以為每個(gè)測(cè)試啟動(dòng)和停止Kudu集群,還有方法來(lái)管理集群并獲取預(yù)先配置的KuduClient實(shí)例,以便在測(cè)試時(shí)使用。
kudu-binary依賴(lài)項(xiàng)包含指定操作系統(tǒng)的原生Kudu(服務(wù)器和命令行工具)二進(jìn)制文件。 為了正在運(yùn)行的操作系統(tǒng)下載正確的工件,最簡(jiǎn)單的方法是使用插件(例如os-maven-plugin或osdetector-gradle-plugin)來(lái)檢測(cè)當(dāng)前的運(yùn)行時(shí)環(huán)境。 KuduTestHarness將自動(dòng)在類(lèi)路徑中查找并使用kudu-binary jar。
警告:kudu-binary模塊應(yīng)僅用于運(yùn)行Kudu進(jìn)行集成測(cè)試。它永遠(yuǎn)不應(yīng)該用于在生產(chǎn)或開(kāi)發(fā)中運(yùn)行實(shí)際的Kudu服務(wù),因?yàn)閗udu-binary模塊包含已從構(gòu)建系統(tǒng)復(fù)制的本機(jī)安全相關(guān)依賴(lài)項(xiàng),當(dāng)運(yùn)行時(shí)主機(jī)上的操作系統(tǒng)打補(bǔ)丁時(shí)并不會(huì)被修補(bǔ)。
Maven配置
如果您使用Maven構(gòu)建項(xiàng)目,請(qǐng)將以下條目添加到項(xiàng)目的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)建項(xiàng)目,請(qǐng)將以下條目添加到項(xiàng)目的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}" }
測(cè)試設(shè)置
正確配置項(xiàng)目后,可以使用kudu-test-utils和kudu-binary工件開(kāi)始編寫(xiě)測(cè)試。 這一行代碼將確保每個(gè)測(cè)試自動(dòng)啟動(dòng)和停止真正的Kudu群集,并通過(guò)slf4j輸出群集日志記錄:
@Rule public KuduTestHarness harness = new KuduTestHarness();
KuduTestHarness具有獲取預(yù)配置客戶(hù)端,啟動(dòng)和停止服務(wù)器等的方法。下面是一個(gè)示例測(cè)試,展示了一些功能:
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. }
有關(guān)使用KuduTestHarness的項(xiàng)目的完整示例,請(qǐng)參閱Kudu源代碼存儲(chǔ)庫(kù)中的java-example項(xiàng)目。Kudu項(xiàng)目本身使用KuduTestHarness進(jìn)行所有自己的集成測(cè)試。對(duì)于更復(fù)雜的示例,您可以在Kudu源代碼庫(kù)中探索各種Kudu集成測(cè)試。
反饋
Kudu 1.9.0是第一個(gè)提供這些測(cè)試實(shí)用程序的版本。 雖然這些實(shí)用程序簡(jiǎn)化了Kudu應(yīng)用程序的測(cè)試,但總有改進(jìn)的余地。
歡迎撥打慧都熱線(xiàn)023-68661681或咨詢(xún),我們將幫您轉(zhuǎn)接大數(shù)據(jù)專(zhuān)業(yè)團(tuán)隊(duì),并發(fā)送相關(guān)資料給您!