备注
本文适用于 Databricks JDBC Simba 驱动程序。 有关 Databricks 开发的 JDBC 驱动程序,请参阅 Databricks JDBC 驱动程序(OSS)。
本文介绍如何测试使用 Databricks JDBC 驱动程序的代码。
若要测试使用 Databricks JDBC 驱动程序和一组连接属性的代码,可以使用支持 JDBC 的编程语言的任何测试框架。 例如,以下 Java 代码示例使用 JUnit 和 Mockito 来针对一组连接属性自动执行 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 INTO
、UPDATE
和 DELETE FROM
。