Snowpark Checkpoints 라이브러리: 가설

Hypothesis 단위 테스트

Hypothesis는 다양한 입력 데이터를 자동으로 생성하여 기존 단위 테스트를 개선하도록 설계된 강력한 Python용 테스트 라이브러리입니다. 개별 테스트 케이스를 지정하는 대신 속성 또는 조건으로 코드의 예상 동작을 설명하면 Hypothesis가 예를 생성하여 해당 속성을 철저하게 테스트하는 속성 기반 테스트를 사용합니다. 이 접근 방식은 에지 케이스와 예기치 않은 동작을 발견하는 데 도움이 되므로 복잡한 함수에 특히 효과적입니다. 자세한 내용은 Hypothesis 섹션을 참조하십시오.

snowpark-checkpoints-hypothesis 패키지는 Hypothesis 라이브러리를 확장하여 테스트 목적으로 합성 Snowpark DataFrames 를 생성합니다. 다양하고 무작위화된 테스트 데이터를 생성하는 Hypothesis의 기능을 활용하여 다양한 스키마와 값을 사용하여 실제 시나리오를 시뮬레이션하고 에지 케이스를 발견하여 강력한 코드를 보장하고 복잡한 변환의 정확성을 검증할 수 있는 Snowpark DataFrames 를 만들 수 있습니다.

Snowpark의 Hypothesis 전략은 합성 데이터 생성을 위해 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: Snowpark DataFrames 를 생성하는 데 사용되는 snowflake.snowpark.Session 의 인스턴스입니다.

  • size: 각 Snowpark DataFrame 에 대해 생성할 행 수입니다. 이 매개 변수를 제공하지 않으면 전략은 크기가 다른 DataFrames 를 생성합니다.

함수 출력:

Snowpark DataFrames 를 생성하는 Hypothesis SearchStrategy 를 반환합니다.

지원 및 지원되지 않는 데이터 타입

dataframe_strategy 함수는 다양한 데이터 타입의 Snowpark DataFrames 생성을 지원합니다. 함수에 전달된 스키마 인자의 유형에 따라 전략에서 지원하는 데이터 타입이 달라집니다. 전략에서 지원되지 않는 데이터 타입을 발견하면 예외가 발생한다는 점에 유의하십시오.

다음 표는 JSON 파일을 schema 인자로 전달할 때 dataframe_strategy 함수에 의해 지원되는 PySpark 데이터 타입과 지원되지 않는 타입을 보여줍니다.

PySpark 데이터 타입

지원됨

Array

Boolean

Char

아니요

Date

DayTimeIntervalType

아니요

Decimal

아니요

Map

아니요

Null

아니요

Byte, Short, Integer, Long, Float, Double

String

Struct

아니요

Timestamp

TimestampNTZ

Varchar

아니요

YearMonthIntervalType

아니요

다음 표는 DataFrameSchema 오브젝트를 schema 인자로 전달할 때 dataframe_strategy 함수가 지원하는 Pandera 데이터 타입과 이들이 매핑되는 Snowpark 데이터 타입을 보여줍니다.

Pandera 데이터 타입

Snowpark 데이터 타입

int8

ByteType

int16

ShortType

int32

IntegerType

int64

LongType

float32

FloatType

float64

DoubleType

문자열

StringType

bool

BooleanType

datetime64[ns, tz]

TimestampType(TZ)

datetime64[ns]

TimestampType(NTZ)

날짜

DateType

Hypothesis 라이브러리를 사용하여 Snowpark DataFrames 를 생성하는 일반적인 워크플로는 다음과 같습니다.

  1. 코드가 모든 입력에 대해 충족해야 하는 다양한 어설션 또는 조건이 포함된 표준 Python 테스트 함수를 만듭니다.

  2. 테스트 함수에 Hypothesis @given 데코레이터를 추가하고 dataframe_strategy 함수를 인자로 전달합니다. @given 데코레이터에 대한 자세한 내용은 hypothesis.given 섹션을 참조하십시오.

  3. 테스트 함수를 실행합니다. 테스트가 실행되면 Hypothesis는 생성된 입력을 자동으로 테스트의 인자로 제공합니다.

예 1: JSON 파일에서 Snowpark DataFrames 생성하기

다음은 snowpark-checkpoints-collectors 패키지의 collect_dataframe_checkpoint 함수에 의해 생성된 JSON 스키마 파일에서 Snowpark 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 오브젝트에서 Snowpark DataFrame 생성하기

아래는 Pandera DataFrameSchema 인스턴스에서 Snowpark DataFrames 를 생성하는 방법의 예시입니다. 자세한 내용은 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

예 3: Hypothesis 동작 사용자 지정하기

Hypothesis @settings 데코레이터를 사용하여 테스트의 동작을 사용자 지정할 수도 있습니다. 이 데코레이터를 사용하면 다양한 구성 변수를 사용자 지정하여 테스트 동작을 필요에 맞게 조정할 수 있습니다. @settings 데코레이터를 사용하면 최대 테스트 케이스 수, 각 테스트 실행 기한, 상세도 수준 등 다양한 측면을 제어할 수 있습니다. 자세한 내용은 Hypothesis 설정 섹션을 참조하십시오.

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