测试 Databricks JDBC 驱动程序

注释

本文适用于 Databricks JDBC Simba 驱动程序。 有关 Databricks 开发的 JDBC 驱动程序,请参阅 Databricks JDBC 驱动程序(OSS)。

本文介绍如何测试使用 Databricks JDBC 驱动程序的代码。

若要测试使用 Databricks JDBC 驱动程序以及连接属性集合的代码,可以将任何测试框架用于支持 JDBC 的编程语言。 例如,以下 Java 代码示例使用 JUnitMockito 来自动执行 Databricks JDBC 驱动程序,并针对连接属性的集合测试 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