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 関数は、データ行の内容を画面に出力します。

// 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 INTOUPDATEDELETE FROMなど、テーブルの状態を変更する可能性のある関数に対して、シミュレートされたテストを複数回実行できます。