Databricks JDBC ドライバーのテスト
この記事では、Databricks JDBC ドライバーを使用するコードをテストする方法について説明します。
Databricks JDBC ドライバーと接続プロパティのコレクションを使用するコードをテストするには、JDBC をサポートするプログラミング言語用の任意のテスト フレームワークを使用できます。 たとえば、次の Java コード例では、 JUnitとMockitoを使用して、接続プロパティのコレクションに対して Databricks JDBC ドライバーを自動化し、テストします。 このサンプル コードは、Databricks JDBC ドライバーの認証設定のサンプル コードに基づいています。
次のHelpers.java
という名前のサンプル コード ファイルには、接続プロパティのコレクションに対して Databricks JDBC ドライバーを自動化するいくつかの関数が含まれています。
CreateConnect
関数は、接続プロパティのコレクションを使用して、 Databricksコンピュートリソースを介して接続を開きます。SelectNYCTaxis
関数は、接続を使用して、samples
カタログのnyctaxi
スキーマのtrips
テーブルから指定された数のデータ行を選択します。PrintResultSet
関数は、データ行の内容を画面に出力します。
// 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
ファイル内の関数を呼び出します。
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 アカウントまたはワークスペースの状態を変更せずに、コードの品質に対する信頼を高めることができます。
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 INTO
、 UPDATE
、 DELETE FROM
など、テーブルの状態を変更する可能性のある関数に対して、シミュレートされたテストを複数回実行できます。