Snowpark Checkpoints-Bibliothek: Hypothese

Hypothesis Unit-Testing

Hypothesis ist eine leistungsstarke Testbibliothek für Python, die traditionelle Unit-Tests durch die automatische Generierung einer Vielzahl von Eingabedaten verbessert. Es verwendet eigenschaftsbasiertes Testen. Anstatt einzelne Testfälle zu spezifizieren, können Sie die erwartete Verhaltensweise Ihres Codes mit Eigenschaften oder Bedingungen beschreiben. Hypothesis erzeugt dann Beispiele, um diese Eigenschaften gründlich zu testen. Dieser Ansatz hilft, Grenzfälle und unerwartete Verhaltensweisen aufzudecken, und ist daher besonders effektiv bei komplexen Funktionen. Weitere Informationen finden Sie unter Hypothese.

Das snowpark-checkpoints-hypothesis-Paket erweitert die Hypothese-Bibliothek, um synthetische Snowpark-DataFrames für Testzwecke zu erzeugen. Indem Sie die Möglichkeit von Hypothesis nutzen, vielfältige und zufällige Testdaten zu generieren, können Sie Snowpark-DataFrames mit unterschiedlichen Schemas und Werten erstellen, um reale Szenarios zu simulieren und Grenzfälle aufzudecken.Das sorgt für robusten Code und ermöglicht die Überprüfung komplexer Transformationen auf Korrektheit.

Die Hypothesis-Strategie für Snowpark basiert auf Pandera zur Erzeugung synthetischer Daten. Die Funktion dataframe_strategy verwendet das angegebene Schema, um einen Pandas-DataFrame zu generieren, der dem Schema entspricht, und konvertiert ihn dann in einen Snowpark-DataFrame.

Funktionssignatur:

def dataframe_strategy(
  schema: Union[str, DataFrameSchema],
  session: Session,
  size: Optional[int] = None
) -> SearchStrategy[DataFrame]
Copy

Funktionsparameter:

  • schema: Das Schema, das die Spalten, Datentypen und Prüfungen definiert, denen der generierte Snowpark-Datenframe entsprechen soll.

    Das Schema kann Folgendes sein:

  • session: Eine Instanz von snowflake.snowpark.Session, die für die Erstellung der Snowpark-DataFrames verwendet wird

  • size: Die Anzahl der zu erzeugenden Zeilen für jeden Snowpark-DataFrame

    Wenn dieser Parameter nicht angegeben wird, generiert die Strategie DataFrames in unterschiedlichen Größen.

Funktionsausgabe:

Gibt eine Hypothesis-SearchStrategy zurück, die Snowpark-DataFrames erzeugt

Unterstützte und nicht unterstützte Datentypen

Die Funktion dataframe_strategy unterstützt die Erstellung von Snowpark-DataFrames mit verschiedenen Datentypen, die je nach dem Typ des an die Funktion übergebenen Schema-Arguments variieren. Beachten Sie, dass die Strategie eine Ausnahme auslöst, wenn sie einen nicht unterstützten Datentyp findet.

Die folgende Tabelle enthält die PySpark-Datentypen, die von der Funktion dataframe_strategy unterstützt bzw. nicht unterstützt werden, wenn eine JSON-Datei als schema-Argument übergeben wird:

Datentyp PySpark

Unterstützt

-Array

Ja

Boolesch

Ja

Char

Nein

Datum

Ja

DayTimeIntervalType

Nein

Dezimalzahl

Nein

Zuordnung

Nein

Null

Nein

Byte, Kurz, Ganzzahl, Lang, Gleitkommazahl, Doppelt

Ja

Zeichenfolge

Ja

Struktur

Nein

Zeitstempel

Ja

TimestampNTZ

Ja

Varchar

Nein

YearMonthIntervalType

Nein

Die folgende Tabelle zeigt die Pandera-Datentypen, die von der Funktion dataframe_strategy unterstützt werden, wenn ein DataFrameSchema-Objekt als schema-Argument übergeben wird, sowie die Snowpark-Datentypen, denen sie zugeordnet sind:

Pandera-Datentyp

Snowpark-Datentyp

int8

ByteType

int16

ShortType

int32

IntegerType

int64

LongType

float32

FloatType

float64

DoubleType

string

StringType

bool

BooleanType

datetime64[ns, tz]

TimestampType(TZ)

datetime64[ns]

TimestampType(NTZ)

date

DateType

Beispiele

Die folgende Prozedur stellt den typischen Workflow für die Verwendung der Hypothesis-Bibliothek zur Erstellung eines Snowpark-DataFrames vor:

  1. Erstellen Sie eine Standard-Python-Testfunktion mit den verschiedenen Assertionen oder Bedingungen, die Ihr Code für alle Eingaben erfüllen sollte.

  2. Fügen Sie den Hypothesis-@given-Decorator zu Ihrer Testfunktion hinzu und übergeben Sie die Funktion dataframe_strategy als Argument.

    Weitere Informationen über den Decorator @given finden Sie unter hypothesis.given.

  3. Führen Sie die Testfunktion aus.

    Hypothesis stellt die generierten Eingaben automatisch als Argumente für den Test bereit.

Beispiel 1: Generieren von Snowpark-DataFrames aus einer JSON-Datei

In diesem Beispiel werden Snowpark-DataFrames aus einer JSON-Schemadatei generiert, die wiederum von der Funktion collect_dataframe_checkpoint des Pakets snowpark-checkpoints-collectors generiert wurde:

from hypothesis import given

from snowflake.hypothesis_snowpark import dataframe_strategy
from snowflake.snowpark import DataFrame, Session


@given(
    df=dataframe_strategy(
        schema="path/to/file.json",
        session=Session.builder.getOrCreate(),
        size=10,
    )
)
def test_my_function_from_json_file(df: DataFrame):
    # Test a particular function using the generated Snowpark DataFrame
    ...
Copy

Beispiel 2: Generieren eines Snowparks-DataFrame aus einem Pandera-DataFrameSchema-Objekt

In diesem Beispiel werden Snowpark-DataFrames aus einer Instanz eines Pandera-DataFrameSchema generiert:

import pandera as pa

from hypothesis import given

from snowflake.hypothesis_snowpark import dataframe_strategy
from snowflake.snowpark import DataFrame, Session


@given(
    df=dataframe_strategy(
        schema=pa.DataFrameSchema(
            {
                "boolean_column": pa.Column(bool),
                "integer_column": pa.Column("int64", pa.Check.in_range(0, 9)),
                "float_column": pa.Column(pa.Float32, pa.Check.in_range(10.5, 20.5)),
            }
        ),
        session=Session.builder.getOrCreate(),
        size=10,
    )
)
def test_my_function_from_dataframeschema_object(df: DataFrame):
    # Test a particular function using the generated Snowpark DataFrame
    ...
Copy

Weitere Informationen finden Sie unter Pandera-DataFrameSchema.

Beispiel 3: Anpassen der Hypothesis-Verhaltensweise

Sie können die Verhaltensweise Ihres Tests auch mit dem Hypothesis-Decorator @settings anpassen. Mit diesem Decorator können Sie verschiedene Konfigurationsparameter anpassen, um das Testverhalten auf Ihre Bedürfnisse zuzuschneiden.

Mit dem @settings-Decorator können Sie Aspekte wie die maximale Anzahl von Testfällen, die Frist für jede Testausführung und die Ausführlichkeitsstufen steuern.

from datetime import timedelta

from hypothesis import given, settings
from snowflake.snowpark import DataFrame, Session

from snowflake.hypothesis_snowpark import dataframe_strategy


@given(
    df=dataframe_strategy(
        schema="path/to/file.json",
        session=Session.builder.getOrCreate(),
    )
)
@settings(
    deadline=timedelta(milliseconds=800),
    max_examples=25,
)
def test_my_function(df: DataFrame):
    # Test a particular function using the generated Snowpark DataFrame
    ...
Copy

Weitere Informationen finden Sie unter Hypothesis-Einstellungen.