Partager via


Exécuter des tests avec pytest à l’aide de l’extension Databricks pour Visual Studio Code

Cet article explique comment exécuter des tests à l’aide de pytest à l’aide de l’extension Databricks pour Visual Studio Code. Consultez Présentation de l’extension Databricks pour Visual Studio Code.

Vous pouvez exécuter pytest sur du code local qui n’a pas besoin d’une connexion à un cluster dans un espace de travail Azure Databricks distant. Par exemple, vous pouvez utiliser pytest pour tester vos fonctions qui acceptent et retournent des DataFrames PySpark dans la mémoire locale. Pour bien démarrer avec pytest et l’exécuter localement, consultez la section Get Started dans la documentation pytest.

Pour exécuter pytest sur du code dans un espace de travail Azure Databricks distant, effectuez les étapes suivantes dans votre projet Visual Studio Code :

Étape 1 : Créer les tests

Ajoutez un fichier Python avec le code suivant qui contient vos tests à exécuter. Cet exemple suppose que ce fichier est nommé spark_test.py et se trouve à la racine de votre projet Visual Studio Code. Ce fichier contient une fixture pytest qui rend disponible pour les tests le SparkSession du cluster (le point d’entrée de la fonctionnalité Spark sur le cluster). Ce fichier contient un seul test qui vérifie si la cellule spécifiée dans le tableau contient la valeur spécifiée. Si nécessaire, vous pouvez ajouter vos propres tests à ce fichier.

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'

Étape 2 : Créer l’exécuteur pytest

Ajoutez un fichier Python avec le code suivant, qui indique à pytest d’exécuter vos tests de l’étape précédente. Cet exemple suppose que le fichier est nommé pytest_databricks.py et se trouve à la racine de votre projet Visual Studio Code.

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:])

Étape 3 : Créer une configuration de série de tests personnalisée

Pour demander à pytest d’exécuter vos tests, vous devez créer une configuration de série de tests personnalisée. Pour cela, utilisez la configuration de série de tests existante basée sur cluster Databricks de la façon suivante :

  1. Dans le menu principal, cliquez sur Exécuter > Ajouter une configuration.

  2. Dans la palette de commandes, sélectionnez Databricks.

    Visual Studio Code ajoute un fichier .vscode/launch.json à votre projet, si ce fichier n’existe pas déjà.

  3. Modifiez la configuration de série de tests de démarrage de la façon suivante, puis enregistrez le fichier :

    • Remplacez le nom de cette configuration de série de tests (Run on Databricks) par un nom d’affichage unique, en l’occurrence dans cet exemple Unit Tests (on Databricks).
    • Remplacez ${file} par program dans le chemin du projet qui contient le Test Runner, en l’occurrence dans cet exemple ${workspaceFolder}/pytest_databricks.py.
    • Remplacez [] par args dans le chemin du projet qui contient les fichiers avec vos tests, en l’occurrence dans cet exemple ["."].

    Votre fichier launch.json doit se présenter ainsi :

    {
      // 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": {}
        }
      ]
    }
    

Étape 4 : Exécuter les tests

Assurez-vous que pytest est déjà installé sur le cluster. Par exemple, avec la page des paramètres du cluster ouverte dans votre espace de travail Azure Databricks, effectuez les étapes suivantes :

  1. Sous l’onglet Bibliothèques, si pytest est visible, cela signifie que pytest est déjà installé. Si pytest n’est pas visible, cliquez sur Installer.
  2. Pour Library Source (Source de la bibliothèque), cliquez sur PyPI.
  3. Pour Package, entrez pytest.
  4. Cliquez sur Installer.
  5. Attendez que l’état passe de Pending (En attente) à Installed (Installé).

Pour exécuter les tests, effectuez les étapes suivantes à partir de votre projet Visual Studio Code :

  1. Dans le menu principal, cliquez sur Afficher > Exécuter.
  2. Dans la liste Exécuter et déboguer, cliquez sur Unit Tests (on Databricks) (Tests unitaires (sur Databricks)) s’il n’est pas déjà sélectionné.
  3. Cliquez sur la flèche verte (Démarrer le débogage).

Les résultats pytest s’affichent dans la console de débogage (Afficher > Console de débogage dans le menu principal). Par exemple, ces résultats indiquent qu’au moins un test a été trouvé dans le fichier spark_test.py, et un point (.) signifie qu’un seul test a été trouvé et a réussi (si le test avait échoué, F serait affiché).

<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)