Freigeben über


Ausführen von Tests mit pytest mithilfe der Databricks-Erweiterung für Visual Studio Code

In diesem Artikel wird beschrieben, wie Sie Tests mit pytest mithilfe der Databricks-Erweiterung für Visual Studio Code ausführen. Weitere Informationen finden Sie unter Was ist die Databricks-Erweiterung für Visual Studio Code?.

Sie können pytest für lokalen Code ausführen, der keine Verbindung mit einem Cluster in einem Azure Databricks-Remotearbeitsbereich benötigt. Sie können beispielsweise pytest verwenden, um Ihre Funktionen zu testen, die PySpark-DataFrames im lokalen Arbeitsspeicher akzeptieren und zurückgeben. Informationen zu den ersten Schritten mit pytest und zur lokalen Ausführung finden Sie unter Erste Schritte sowie in der pytest-Dokumentation.

Gehen Sie zum Ausführen von pytest für Code in einem Azure Databricks-Remotearbeitsbereich in Ihrem Visual Studio Code-Projekt folgendermaßen vor:

Schritt 1: Erstellen der Tests

Fügen Sie eine Python-Datei mit dem folgenden Code hinzu, der die auszuführenden Tests enthält. In diesem Beispiel wird davon ausgegangen, dass diese Datei den Namen spark_test.py trägt und sich im Stammverzeichnis Ihres Visual Studio Code-Projekts befindet. Diese Datei enthält eine pytest-Fixture, die den Tests die SparkSession des Clusters (den Einstiegspunkt zu Spark-Funktionen im Cluster) zur Verfügung stellt. Diese Datei enthält einen einzelnen Test, der überprüft, ob die angegebene Zelle in der Tabelle den angegebenen Wert enthält. Sie können dieser Datei bei Bedarf eigene Tests hinzufügen.

from pyspark.sql import SparkSession
import pytest

@pytest.fixture
def spark() -> SparkSession:
  # Create a SparkSession (the entry point to Spark functionality) on
  # the cluster in the remote Databricks workspace. Unit tests do not
  # have access to this SparkSession by default.
  return SparkSession.builder.getOrCreate()

# Now add your unit tests.

# For example, here is a unit test that must be run on the
# cluster in the remote Databricks workspace.
# This example determines whether the specified cell in the
# specified table contains the specified value. For example,
# the third column in the first row should contain the word "Ideal":
#
# +----+-------+-------+-------+---------+-------+-------+-------+------+-------+------+
# |_c0 | carat | cut   | color | clarity | depth | table | price | x    | y     | z    |
# +----+-------+-------+-------+---------+-------+-------+-------+------+-------+------+
# | 1  | 0.23  | Ideal | E     | SI2     | 61.5  | 55    | 326   | 3.95 | 3. 98 | 2.43 |
# +----+-------+-------+-------+---------+-------+-------+-------+------+-------+------+
# ...
#
def test_spark(spark):
  spark.sql('USE default')
  data = spark.sql('SELECT * FROM diamonds')
  assert data.collect()[0][2] == 'Ideal'

Schritt 2: Erstellen des pytest-Runners

Fügen Sie eine Python-Datei mit dem folgenden Code hinzu, der pytest anweist, Ihre Tests aus dem vorherigen Schritt auszuführen. In diesem Beispiel wird davon ausgegangen, dass die Datei den Namen pytest_databricks.py trägt und sich im Stammverzeichnis Ihres Visual Studio Code-Projekts befindet.

import pytest
import os
import sys

# Run all tests in the connected directory in the remote Databricks workspace.
# By default, pytest searches through all files with filenames ending with
# "_test.py" for tests. Within each of these files, pytest runs each function
# with a function name beginning with "test_".

# Get the path to the directory for this file in the workspace.
dir_root = os.path.dirname(os.path.realpath(__file__))
# Switch to the root directory.
os.chdir(dir_root)

# Skip writing .pyc files to the bytecode cache on the cluster.
sys.dont_write_bytecode = True

# Now run pytest from the root directory, using the
# arguments that are supplied by your custom run configuration in
# your Visual Studio Code project. In this case, the custom run
# configuration JSON must contain these unique "program" and
# "args" objects:
#
# ...
# {
#   ...
#   "program": "${workspaceFolder}/path/to/this/file/in/workspace",
#   "args": ["/path/to/_test.py-files"]
# }
# ...
#
retcode = pytest.main(sys.argv[1:])

Schritt 3: Erstellen einer benutzerdefinierten Ausführungskonfiguration

Um pytest anzuweisen, Ihre Tests auszuführen, müssen Sie eine benutzerdefinierte Ausführungskonfiguration erstellen. Verwenden Sie die vorhandene clusterbasierte Databricks-Ausführungskonfiguration, um Ihre eigene benutzerdefinierte Ausführungskonfiguration wie folgt zu erstellen:

  1. Klicken Sie im Hauptmenü auf Ausführen > Konfiguration hinzufügen.

  2. Wählen Sie in der Befehlspalette die Option Databricks aus.

    Visual Studio Code fügt Ihrem Projekt eine Datei .vscode/launch.json hinzu, wenn diese Datei noch nicht vorhanden ist.

  3. Ändern Sie die Startausführungskonfiguration wie folgt, und speichern Sie die Datei dann:

    • Ändern Sie den Namen dieser Ausführungskonfiguration von Run on Databricks in einen eindeutigen Anzeigenamen für diese Konfiguration (in diesem Beispiel Unit Tests (on Databricks)).
    • Ändern Sie program von ${file} in den Pfad im Projekt, der den Testrunner enthält (in diesem Beispiel ${workspaceFolder}/pytest_databricks.py).
    • Ändern Sie args von [] in den Pfad im Projekt, der die Dateien mit Ihren Tests enthält (in diesem Beispiel ["."]).

    Ihre Datei launch.json sollte wie folgt aussehen:

    {
      // Use IntelliSense to learn about possible attributes.
      // Hover to view descriptions of existing attributes.
      // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
      "version": "0.2.0",
      "configurations": [
        {
          "type": "databricks",
          "request": "launch",
          "name": "Unit Tests (on Databricks)",
          "program": "${workspaceFolder}/pytest_databricks.py",
          "args": ["."],
          "env": {}
        }
      ]
    }
    

Schritt 4: Ausführen der Tests

Vergewissern Sie sich zunächst, dass pytest bereits auf dem Cluster installiert ist. Führen Sie beispielsweise bei geöffneter Einstellungsseite des Clusters in Ihrem Azure Databricks-Arbeitsbereich die folgenden Schritte aus:

  1. Wenn pytest auf der Registerkarte Bibliotheken angezeigt wird, ist pytest bereits installiert. Wenn pytest nicht angezeigt wird, klicken Sie auf Neu installieren.
  2. Klicken Sie unter Bibliotheksquelle auf PyPI.
  3. Geben Sie unter Paket anschließend pytest ein.
  4. Klicken Sie auf Installieren.
  5. Warten Sie, bis sich der Status von Ausstehend in Installiert ändert.

Führen Sie zum Ausführen der Tests in Ihrem Visual Studio Code-Projekt die folgenden Schritte aus:

  1. Klicken Sie im Hauptmenü auf Ansicht > Ausführen.
  2. Klicken Sie in der Liste Ausführen und debuggen auf Komponententests (in Databricks), sofern noch nicht ausgewählt.
  3. Klicken Sie auf den grünen Pfeil (Debuggen starten).

Die pytest-Ergebnisse werden in der Debugging-Konsole angezeigt (Ansicht > Debugging-Konsole im Hauptmenü). Diese Ergebnisse zeigen beispielsweise, dass mindestens ein Test in der Datei spark_test.py gefunden wurde, und ein Punkt (.) bedeutet, dass ein einzelner Test gefunden und bestanden wurde. (Ein fehlerhafter Test zeigt F an.)

<date>, <time> - Creating execution context on cluster <cluster-id> ...
<date>, <time> - Synchronizing code to /Workspace/path/to/directory ...
<date>, <time> - Running /pytest_databricks.py ...
============================= test session starts ==============================
platform linux -- Python <version>, pytest-<version>, pluggy-<version>
rootdir: /Workspace/path/to/directory
collected 1 item

spark_test.py .                                                          [100%]

============================== 1 passed in 3.25s ===============================
<date>, <time> - Done (took 10818ms)