Snowparkチェックポイントライブラリ:Hypothesis

仮説単体テスト

仮説 は Python 用の強力なテストライブラリで、さまざまな入力データを自動的に生成することで、従来のユニットテストを強化するように設計されています。Hypothesisはプロパティベースのテストを使用し、個々のテストケースを指定する代わりに、コードの期待される動作をプロパティまたは条件で記述し、Hypothesisがそれらのプロパティを徹底的にテストする例を生成します。このアプローチは、エッジケースや予期せぬ動作を発見するのに役立ち、複雑な関数に特に効果的です。詳しくは 仮説 を参照してください。

snowpark-checkpoints-hypothesis パッケージは Hypothesis ライブラリを拡張し、テスト用に合成 Snowpark DataFrames を生成します。多様でランダムなテストデータを生成するHypothesisの機能を活用することで、さまざまなスキーマと値を持つSnowpark DataFramesを作成し、実世界のシナリオをシミュレートして、ロバストなコードを保証、複雑な変換の正しさを確認することができます。

Snowparkの仮説戦略は、合成データの生成にPanderaを利用しています。dataframe_strategy 関数は、指定されたスキーマを使用して、それに準拠した Pandas DataFrame を生成し、それを Snowpark DataFrame に変換します。

関数の署名:

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

関数のパラメーター:

  • schema:生成されるSnowparkデータフレームが一致すべき列、データタイプ、チェックを定義するスキーマ。

    スキーマは次のようになります:

  • session: snowflake.snowpark.Session のインスタンスで、Snowpark DataFrames の作成に使用されます

  • size:各Snowpark DataFrameの生成行数

    このパラメーターが提供されない場合、ストラテジーは異なるサイズの DataFrames を生成します。

関数出力:

Snowpark DataFramesを生成する`HypothesisSearchStrategy<https://github.com/HypothesisWorks/hypothesis/blob/904bdd967ca9ff23475aa6abe860a30925149da7/hypothesis-python/src/hypothesis/strategies/_internal/strategies.py#L221>`_ を返します。

サポートされているデータ型とサポートされていないデータ型

その dataframe_strategy 関数は、異なるデータ型を使用してSnowparkDataFramesの生成をサポートします。これは、関数に渡されるスキーマ引数の型によって異なります。ストラテジーがサポートされていないデータ型を見つけた場合、例外が発生することに注意してください。

次の表は、JSONファイルが:code:`schema`引数として渡された場合に、:code:`dataframe_strategy`関数によってサポートされるPySparkデータタイプとサポートされないデータタイプを示しています。

PySpark データ型

サポート対象

配列

有り

ブール値

有り

Char

無し

日付

有り

DayTimeIntervalType

無し

10進数

無し

マップ

無し

Null

無し

Byte, Short, Integer, Long, Float, Double

有り

文字列

有り

Struct

無し

タイムスタンプ

有り

TimestampNTZ

有り

Varchar

無し

YearMonthIntervalType

無し

次の表は、DataFrameSchema オブジェクトが:code:schema 引数として渡された場合に、dataframe_strategy 関数によってサポートされる Pandera データ型と、それらがマッピングされる Snowpark データ型を示しています。

Panderaデータタイプ

Snowparkデータタイプ

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

次の手順は、Hypothesisライブラリを使用してSnowpark DataFrames を生成する典型的なワークフローを示しています。

  1. Python の標準的なテスト関数を作成し、あなたのコードがすべての入力に対して満たすべきさまざまなアサーションや条件を指定します。

  2. Hypothesis @given デコレーターをテスト関数に追加し、 dataframe_strategy 関数を引数として渡します。

    @given デコレーターの情報については、 仮説.given を参照してください。

  3. テスト関数を実行します。

    Hypothesisは生成された入力をテストの引数として自動的に提供します。

例1: JSON ファイルから Snowpark DataFrames を生成します。

この例では、:code:`snowpark-checkpoints-collectors`パッケージの:code:`collect_dataframe_checkpoint`関数によって生成されたJSONスキーマファイルからDataFrames が生成されています。

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

**例2:Pandera DataFrameSchema オブジェクトから SnowparkDataFrameを生成します。

この例では、SnowparkDataFramesがPanderaDataFrameSchema のインスタンスから生成されています。

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

詳しくは Pandera DataFrameSchema を参照してください。

例3: 仮説動作のカスタマイズ

仮説 @settings デコレーターを使って、テストの動作をカスタマイズすることもできます。このデコレーターを使うと、さまざまな構成パラメーターをカスタマイズして、テストの動作をニーズに合わせて調整することができます。

@settings デコレーターを使うことで、テストケースの最大数や各テストの実行期限、冗長性のレベルを制御できます。

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

詳しくは 仮説の設定 を参照してください。