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

Databricks JDBC ドライバーのテスト

注記

この記事は、Databricks JDBC Simba ドライバーに適用されます。 Databricks が開発した JDBC ドライバーについては、「 Databricks JDBC ドライバー (OSS)」を参照してください。

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

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

次のコード例 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など) のシミュレートされたテストを複数回実行できます。