メインコンテンツまでスキップ

Databricks JDBC ドライバー (Simba) のテスト

注記

この記事は、バージョン 3 未満の Databricks JDBC ドライバーに適用されます。最新の Databricks JDBC ドライバー (バージョン 3 以上) については、 「Databricks JDBC ドライバー」を参照してください。

この記事では、 Databricks JDBC ドライバーを使用するコードをテストする方法について説明します。

Databricks JDBC ドライバーと接続プロパティのコレクションを使用するコードをテストするには、JDBC をサポートするプログラミング言語用の任意のテスト フレームワークを使用できます。たとえば、次の Java コード例では、 JUnitMockitoを使用して、接続プロパティのコレクションに対して Databricks JDBC ドライバーを自動化およびテストします。このサンプル コードは、Databricks JDBC ドライバー (Simba) の認証設定のサンプル コードに基づいています。

次のコード例 Helpers.java には、接続プロパティのコレクションに対して Databricks JDBC ドライバーを自動化するいくつかの関数が含まれています。

  • CreateConnect 関数は、接続プロパティのコレクションを使用して、 Databricks コンピュート リソースを介して接続を開きます。
  • SelectNYCTaxis 関数は、接続を使用して、samples カタログの nyctaxi スキーマの trips テーブルから指定された数のデータ行を選択します。
  • PrintResultSet 関数は、データ行の内容を画面に出力します。
Java
// Helpers.java

import java.sql.*;
import java.util.Properties;

public class Helpers {
static Connection CreateConnection(
String url,
Properties p
) throws SQLException {
Connection conn = DriverManager.getConnection(url, p);
return conn;
}

static ResultSet SelectNYCTaxis(
Connection conn,
long rows
) throws SQLException {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM samples.nyctaxi.trips LIMIT " + rows);
return rs;
}

static void PrintResultSet(ResultSet rs) throws SQLException {
ResultSetMetaData md = rs.getMetaData();
String[] columns = new String[md.getColumnCount()];
for (int i = 0; i < columns.length; i++) {
columns[i] = md.getColumnName(i + 1);
}
while (rs.next()) {
System.out.print("Row " + rs.getRow() + "=[");
for (int i = 0; i < columns.length; i++) {
if (i != 0) {
System.out.print(", ");
}
System.out.print(columns[i] + "='" + rs.getObject(i + 1) + "'");
}
System.out.println(")]");
}
}
}

次の Main.class fileという名前のコードファイルの例は、Helpers.class ファイル内の関数を呼び出します。

Java
package org.example;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class Main {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.databricks.client.jdbc.Driver");
String url = "jdbc:databricks://" + System.getenv("DATABRICKS_SERVER_HOSTNAME") + ":443";
Properties p = new Properties();
p.put("httpPath", System.getenv("DATABRICKS_HTTP_PATH"));
p.put("AuthMech", "3");
p.put("UID", "token");
p.put("PWD", System.getenv("DATABRICKS_TOKEN"));

Connection conn = Helpers.CreateConnection(url, p);
ResultSet rs = Helpers.SelectNYCTaxis(conn, 2);
Helpers.PrintResultSet(rs);
}
}

次の HelpersTest.class という名前のサンプル コード ファイルでは、JUnit を使用して Helpers.class ファイル内の SelectNYCTaxis 関数をテストします。実際のコンピュート リソースの時間とコストを使用して Helpers.class ファイル内の関数を呼び出す代わりに、次のコード例では Mockito を使用してこの呼び出しをシミュレートします。 このようなシミュレートされた呼び出しは、通常、わずか数秒で完了するため、既存の Databricks アカウントやワークスペースの状態を変更しずに、コードの品質に対する信頼性を高めることができます。

Java
package org.example;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class HelpersTest {
@Test
public void testSelectNYCTaxis() throws SQLException {
Connection mockConnection = Mockito.mock(Connection.class);
Statement mockStatement = Mockito.mock(Statement.class);
ResultSet mockResultSet = Mockito.mock(ResultSet.class);

Mockito.when(mockConnection.createStatement()).thenReturn(mockStatement);
Mockito.when(mockStatement.executeQuery(Mockito.anyString())).thenReturn(mockResultSet);

ResultSet rs = Helpers.SelectNYCTaxis(mockConnection, 2);
assertEquals(mockResultSet, rs);
}
}

SelectNYCTaxis 関数には SELECT ステートメントが含まれているため、trips テーブルの状態は変更されないため、この例ではモックは絶対に必要ではありません。ただし、モックを使用すると、コンピュート リソースとの実際の接続を待たずに、テストをすばやく実行できます。 また、モックを使用すると、テーブルの状態を変更する可能性のある関数 ( 、 、 INSERT INTOUPDATEDELETE FROMなど) のシミュレートされたテストを複数回実行できます。