测试 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 函数使用一组连接属性通过 Azure Databricks 计算资源打开连接。
  • SelectNYCTaxis 函数使用连接从 trips 目录 samples 架构中的 nyctaxi 表中选择指定数量的数据行。
  • 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 的示例代码文件调用 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 在 SelectNYCTaxis 文件中测试 Helpers.class 函数。 以下示例代码使用 Mockito 来模拟对 Helpers.class 文件中的函数的调用,而不是使用实际计算资源的时间和成本来调用该函数。 此类模拟调用通常在几秒钟内完成,增加了你对代码质量的信心,同时不会更改现有 Azure 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