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 und Hypothesis erzeugt 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, um robusten Code zu gewährleisten und die Korrektheit komplexer Transformationen zu überprüfen.

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 des 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. Je nach dem Typ des an die Funktion übergebenen Schema-Arguments variieren die von der Strategie unterstützten Datentypen. Beachten Sie, dass die Strategie eine Ausnahme auslöst, wenn sie einen nicht unterstützten Datentyp findet.

Die folgende Tabelle zeigt die von der Funktion dataframe_strategy unterstützten und nicht unterstützten PySpark Datentypen, 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

Der typische Workflow für die Verwendung der Hypothesis-Bibliothek zur Erstellung eines Snowpark-DataFrames ist wie folgt:

  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. Wenn der Test ausgeführt wird, stellt Hypothesis automatisch die generierten Eingaben als Argumente für den Test bereit.

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

Im Folgenden finden Sie ein Beispiel für die Generierung von Snowpark DataFrames aus einer JSON Schemadatei, die mit der Funktion collect_dataframe_checkpoint des snowpark-checkpoints-collectors-Pakets erstellt 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

Nachfolgend finden Sie ein Beispiel für die Generierung von Snowpark-DataFrames aus einer Instanz eines Pandera-DataFrameSchema. Weitere Informationen finden Sie unter Pandera-DataFrameSchema.

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

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, die Ausführlichkeitsstufen und viele andere steuern. Weitere Informationen finden Sie unter Hypothesis-Einstellungen.

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