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]
関数のパラメーター:
schema
:生成されるSnowparkデータフレームが一致すべき列、データタイプ、チェックを定義するスキーマ。スキーマは次のようになります:
:code:`snowpark-checkpoints-collectors`パッケージの :code:`collect_dataframe_checkpoint`関数によって生成された JSONスキーマファイルへのパス。
`pandera.api.pandas.containerDataFrameSchema <https://pandera.readthedocs.io/en/stable/reference/generated/pandera.api.pandas.container.DataFrameSchema.html>`_のインスタンス 。
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 データ型 |
サポート対象 |
---|---|
有り |
|
有り |
|
無し |
|
有り |
|
無し |
|
無し |
|
無し |
|
無し |
|
有り |
|
有り |
|
無し |
|
有り |
|
有り |
|
無し |
|
無し |
次の表は、DataFrameSchema オブジェクトが:code:schema
引数として渡された場合に、dataframe_strategy
関数によってサポートされる Pandera データ型と、それらがマッピングされる Snowpark データ型を示しています。
Panderaデータタイプ |
Snowparkデータタイプ |
---|---|
int8 |
|
int16 |
|
int32 |
|
int64 |
|
float32 |
|
float64 |
|
string |
|
bool |
|
datetime64[ns, tz]。 |
|
datetime64[ns] |
|
date |
例¶
次の手順は、Hypothesisライブラリを使用してSnowpark DataFrames を生成する典型的なワークフローを示しています。
Python の標準的なテスト関数を作成し、あなたのコードがすべての入力に対して満たすべきさまざまなアサーションや条件を指定します。
Hypothesis
@given
デコレーターをテスト関数に追加し、dataframe_strategy
関数を引数として渡します。@given
デコレーターの情報については、 仮説.given を参照してください。テスト関数を実行します。
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
...
**例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
...
詳しくは 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
...
詳しくは 仮説の設定 を参照してください。