Выполнение тестов с помощью расширения Databricks для Visual Studio Code
В этой статье описывается, как выполнять тесты с помощью pytest
расширения Databricks для Visual Studio Code. См. раздел "Что такое расширение Databricks для Visual Studio Code?".
Вы можете запустить pytest в локальном коде, который не требует подключения к кластеру в удаленной рабочей области Azure Databricks. Например, можно использовать pytest
для тестирования функций, которые принимают и возвращают Кадры данных PySpark в локальной памяти. Чтобы приступить к работе с pytest
и запустить его локально, см. раздел в документации по pytest
.
Чтобы запустить pytest
код в удаленной рабочей области Azure Databricks, выполните следующие действия в проекте Visual Studio Code:
Шаг 1. Создание тестов
Добавьте файл Python со следующим кодом, который содержит тесты для выполнения. В этом примере предполагается, что этот файл называется spark_test.py
и находится в корне проекта Visual Studio Code. Этот файл содержит pytest
средство, которое делает кластер SparkSession
(точку входа в функцию Spark в кластере) доступными для тестов. Этот файл содержит один тест, который проверяет, содержит ли указанная ячейка в таблице указанное значение. При необходимости можно добавить собственные тесты в этот файл.
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'
Шаг 2. Создание runner pytest
Добавьте файл Python со следующим кодом, который указывает pytest
на выполнение тестов на предыдущем шаге. В этом примере предполагается, что файл называется pytest_databricks.py
и находится в корне проекта 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:])
Шаг 3. Создание настраиваемой конфигурации запуска
Чтобы выполнить pytest
тесты, необходимо создать настраиваемую конфигурацию запуска. Используйте существующую конфигурацию запуска на основе кластера Databricks , чтобы создать собственную настраиваемую конфигурацию запуска, как показано ниже.
В главном меню нажмите кнопку "Выполнить > добавление конфигурации".
В палитре команд выберите Databricks.
Visual Studio Code добавляет
.vscode/launch.json
файл в проект, если этот файл еще не существует.Измените конфигурацию запуска начального запуска следующим образом, а затем сохраните файл:
- Измените имя конфигурации запуска на
Run on Databricks
некоторое уникальное отображаемое имя для этой конфигурации в этом примереUnit Tests (on Databricks)
. - Измените
program
путь к пути в проекте, содержающем средство выполнения теста, в этом примере${file}
.${workspaceFolder}/pytest_databricks.py
- Перейдите
args
с[]
пути в проекте, который содержит файлы с тестами, в этом примере["."]
.
Файл
launch.json
должен выглядеть следующим образом:{ // 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": {} } ] }
- Измените имя конфигурации запуска на
Шаг 4. Выполнение тестов
Сначала убедитесь, что pytest
он уже установлен в кластере. Например, при открытии страницы параметров кластера в рабочей области Azure Databricks сделайте следующее:
- На вкладке "Библиотеки" , если pytest отображается,
pytest
то он уже установлен. Если pytest не отображается, нажмите кнопку "Установить новую". - Для источника библиотеки щелкните PyPI.
- Для пакета введите
pytest
. - Щелкните Установить.
- Подождите до тех пор, пока состояние не изменится в ожиданииустановки.
Чтобы выполнить тесты, выполните следующие действия из проекта Visual Studio Code:
- В главном меню нажмите кнопку "Просмотреть > запуск".
- В списке Запуск и Отладка щелкните Модульные Тесты (в Databricks), если он еще не выбран.
- Щелкните значок зеленой стрелки (начать отладку).
pytest
Результаты отображаются в консоли отладки (просмотр > консоли отладки в главном меню). Например, эти результаты показывают, что в spark_test.py
файле найден хотя бы один тест, а точка (.
) означает, что был найден и передан один тест. (Неудачный тест будет отображать F
.)
<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)