相关文章推荐
近视的充电器  ·  下載 - JDBC Driver for ...·  3 月前    · 
逼格高的西瓜  ·  测试 Databricks JDBC ...·  1 月前    · 
阳光的手套  ·  python - Stop ...·  2 年前    · 
会开车的煎饼果子  ·  package.json ...·  2 年前    · 
大方的长颈鹿  ·  python - Large File ...·  2 年前    · 
瘦瘦的柚子  ·  node.js - Sequelize ...·  2 年前    · 

本文适用于低于版本 3 的 Databricks JDBC 驱动程序。 有关最新的 Databricks JDBC 驱动程序版本 3 及更高版本,请参阅 Databricks JDBC 驱动程序

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

若要测试使用 Databricks JDBC 驱动程序以及连接属性集合的代码,可以将任何测试框架用于支持 JDBC 的编程语言。 例如,以下 Java 代码示例使用 JUnit Mockito 来自动执行 Databricks JDBC 驱动程序,并针对连接属性的集合测试 Databricks JDBC 驱动程序。 此示例代码基于 Databricks JDBC 驱动程序 (Simba) 的身份验证设置 中的示例代码。

名为 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