Aller au contenu principal

Testez le Driver ODBC Databricks

Cette page décrit comment tester le code qui utilise le Driver ODBC Databricks.

Utilisez n'importe quel framework de test pour les langages compatibles ODBC. Les exemples suivants utilisent pyodbc, pytest et unittest.mock pour tester les connexions des pilotes ODBC. Ce code est basé sur l'exemple de Connexion de Python et pyodbc à Databricks.

Fonctions d'aide

Le fichier helpers.py contient des fonctions utilitaires pour travailler avec les connexions ODBC :

  • connect_to_dsn: Ouvre une connexion à une ressource de compute Databricks.
  • get_cursor_from_connection: Obtient un curseur pour l'exécution des queries.
  • select_from_nyctaxi_trips: Interroge le nombre spécifié de lignes depuis samples.nyctaxi.trips.
  • print_rows: Affiche le contenu du jeu de résultats dans la console.
Python
# helpers.py

from pyodbc import connect, Connection, Cursor

def connect_to_dsn(
connstring: str,
autocommit: bool
) -> Connection:

connection = connect(
connstring,
autocommit = autocommit
)

return connection

def get_cursor_from_connection(
connection: Connection
) -> Cursor:

cursor = connection.cursor()
return cursor

def select_from_nyctaxi_trips(
cursor: Cursor,
num_rows: int
) -> Cursor:

select_cursor = cursor.execute(f"SELECT * FROM samples.nyctaxi.trips LIMIT {num_rows}")
return select_cursor

def print_rows(cursor: Cursor):
for row in cursor.fetchall():
print(row)

Classe principale

Le fichier main.py appelle les fonctions d'assistance pour se connecter aux données et les query :

Python
# main.py

from helpers import *

connection = connect_to_dsn(
connstring = "DSN=<your-dsn-name>",
autocommit = True
)

cursor = get_cursor_from_connection(
connection = connection)

select_cursor = select_from_nyctaxi_trips(
cursor = cursor,
num_rows = 2
)

print_rows(
cursor = select_cursor
)

Tests unitaires avec simulation

Le fichier test_helpers.py utilise pytest et unittest.mock pour tester la fonction select_from_nyctaxi_trips. La simulation (mocking) simule les connexions à la base de données sans utiliser de Ressources de compute réelles, ainsi les tests s'exécutent en quelques secondes sans affecter vos Workspaces Databricks.

Python
# test_helpers.py

from pyodbc import SQL_DBMS_NAME
from helpers import *
from unittest.mock import patch
import datetime

@patch("helpers.connect_to_dsn")
def test_connect_to_dsn(mock_connection):
mock_connection.return_value.getinfo.return_value = "Spark SQL"

mock_connection = connect_to_dsn(
connstring = "DSN=<your-dsn-name>",
autocommit = True
)

assert mock_connection.getinfo(SQL_DBMS_NAME) == "Spark SQL"

@patch('helpers.get_cursor_from_connection')
def test_get_cursor_from_connection(mock_connection):
mock_cursor = mock_connection.return_value.cursor
mock_cursor.return_value.rowcount = -1

mock_connection = connect_to_dsn(
connstring = "DSN=<your-dsn-name>",
autocommit = True
)

mock_cursor = get_cursor_from_connection(
connection = mock_connection
)

assert mock_cursor.rowcount == -1

@patch('helpers.select_from_nyctaxi_trips')
def test_select_from_nyctaxi_trips(mock_connection):
mock_cursor = mock_connection.return_value.cursor
mock_get_cursor = mock_cursor.return_value.execute
mock_select_cursor = mock_get_cursor.return_value.arraysize = 1

mock_connection = connect_to_dsn(
connstring = "DSN=<your-dsn-name>",
autocommit = True
)

mock_get_cursor = get_cursor_from_connection(
connection = mock_connection
)

mock_select_cursor = select_from_nyctaxi_trips(
cursor = mock_get_cursor,
num_rows = 2
)

assert mock_select_cursor.arraysize == 1

@patch('helpers.print_rows')
def test_print_rows(mock_connection, capsys):
mock_cursor = mock_connection.return_value.cursor
mock_get_cursor = mock_cursor.return_value.execute
mock_select_cursor = mock_get_cursor.return_value.fetchall.return_value = [
(datetime.datetime(2016, 2, 14, 16, 52, 13), datetime.datetime(2016, 2, 14, 17, 16, 4), 4.94, 19.0, 10282, 10171),
(datetime.datetime(2016, 2, 4, 18, 44, 19), datetime.datetime(2016, 2, 4, 18, 46), 0.28, 3.5, 10110, 10110)
]

mock_connection = connect_to_dsn(
connstring = "DSN=<your-dsn-name>",
autocommit = True
)

mock_get_cursor = get_cursor_from_connection(
connection = mock_connection
)

mock_select_cursor = select_from_nyctaxi_trips(
cursor = mock_get_cursor,
num_rows = 2
)

print_rows(
cursor = mock_select_cursor
)

captured = capsys.readouterr()
assert captured.out == "(datetime.datetime(2016, 2, 14, 16, 52, 13), datetime.datetime(2016, 2, 14, 17, 16, 4), 4.94, 19.0, 10282, 10171)\n" \
"(datetime.datetime(2016, 2, 4, 18, 44, 19), datetime.datetime(2016, 2, 4, 18, 46), 0.28, 3.5, 10110, 10110)\n"

Puisque select_from_nyctaxi_trips n'exécute qu'une SELECT instruction, la simulation n'est pas strictement requise ici. Cependant, le mocking est particulièrement utile lors du test de fonctions qui modifient les données (INSERT INTO, UPDATE, DELETE FROM), car vous pouvez exécuter des tests à plusieurs reprises sans affecter l'état de la table.