[spark 3] 5. 유닛테스트

data_hamster·2023년 8월 4일
0


보통 함수의 인풋과 아웃풋 테스트.
정해진 입력 주고 -> 출력 잘 나오는지.
네트워크라던지, 리소스가 부족한 상황에서도 잘 나오게 테스트.
유닛 테스트가 충분히 작성되서, 가능한 실행 경로의 70% 이상은 보장되어야 함.

실리콘벨리에서 QA 엔지니어가 따로 있지 않고 자기가 만든 코드를 스스로 테스트함.
75% 이상 커버리지 보장. CI/CD를 항상 신경쓰다보니 테스트 실패는 눈총받는 일이었음.
좋은 개발자는 내 코드에 어떤문제가 있을지 고민하는 습관을 들여야 함.

언어별로 정해진 테스트 프레임 워크 있음.
pyspark로 코딩하기에 unittest를 사용해볼 예정.

콜랩에서 테스트 해보고,
로컬 스탠드얼론을 대상으로 유닛테스트 돌려볼 예정.

파이스파크 코드를 유닛테스트로 어떻게 다룰지만 알려줄 예정.
실제 프로덕션 코드에 테스트를 붙일 때는, 어떻게 테스트하기가 쉬울까 input,output 생각해보기. 내가 어떻게 테스트를 했으면 그것을 미연에 방지할 수 있었을까 생각해보기.

TDD
테스트 코드부터 만들어보고, 거기에 맞춰 함수를 채워나가기. 유튜브 같은데서 비디오 봐보기.



테스트해볼 함수들을 만들어본다.

from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import *
import pandas as pd

# Define the UDF
@pandas_udf(StringType())
def upper_udf_f(s: pd.Series) -> pd.Series:
    return s.str.upper()

upperUDF = spark.udf.register("upper_udf", upper_udf_f)

def load_gender(spark, file_path):
    return spark.read.option("header", True).csv(file_path)

def get_gender_count(spark, df, field_to_count):
    df.createOrReplaceTempView("namegender_test")
    return spark.sql(f"SELECT {field_to_count}, COUNT(1) count FROM namegender_test GROUP BY 1")
    
df = load_gender(spark, "name_gender.csv")
get_gender_count(spark, df, "gender").show()
df.select(upperUDF("name").alias("NAME")).show()    

load_gender는 두개의 인풋을 받음 하나는 스파크세션오브젝트, 데이터프레임으로 로딩할 csv의 패스.
데이터 프레임으로 받아서 리털을 함.

get_gender_count는 스파크세션, 데이터프레임, 그룹바이할 컬럼이름을 받아 먼저 데이터프레임을 테이블로 바꾸고, 그걸 sql을 통해 그룹바이를 해서 주어진 필드별로 카운트해서 리턴해줌.

3가지 테스트 케이스.

gender 수가 100개
이 데이터 프레임에서 gender 기준으로 카운트 했을 때, 잘 나오는지
UDF 함수를 테스트 해볼껀데, 몇개의 문자열을 입력으로 주고 대문자로 잘 나오는지.

collect로도 받아본다

일반적으로 구글 콜랩에서 돌리진 않음. 테스트 코드를 따로 만들고, 그 코드로 내가 테스트하고 싶은 함수들을 임포트해서 쓰는게 일반적임. 이렇게 한 몸뚱아리에 다 코드가 있지는 않음.

그래서 CLI에서 보여주려고 함.

spark라는 전역변수를 하나 만들고
setUpclass라는 메소드가 있어서, 테스트 준비를 하기위해 호출되는 함수, 계속해서 사용할 리소스들이 있으면 저기 넣어놓음. 스파크 세션을 만들어서 계속 쓸 예정.
self.spark으로 지칭할 수 있음.

반대되는게 tearDownClass -> 마지막에 호출.
테스트 자원이 있다면 여기서 분해함.

함수를 3개 만들었는데 다 이게 테스트 케이스가 됨.
assertEqual 같으면 성공. 다르면 실패.

데이터프레임이 잘 되고 있는지 카운트. 의미가 있는건 아니지만 어떻게 테스트를 작성할 수 있는지 보여주는 예가 될 것임.

get_gender_count를 불러가지고 성별로 몇개으 레코드가 있는지 데이터프레임으로 row타입의 리스트로 받아옴.

assertCountEqual은 sort해서 같으면 성공.

unittest는 CLI에서 돌리기에 적합.

구글 콜랩에서 테스트, CLI도 돌려봤다.

ls -tl

메인 엔트리 포인트를 보면,
스파크 세션 오브젝트 만들고, 판다스 UDF 등록

애플리케이션 코드인 것을 알 수 있음

테스트 코드의 경우 별도로 모듈을 임포트해서 테스트하는 것을 볼 수 있음. 별도의 파일로 있다보니. 임포트를 해야함. 스파크세션만 가져오는 것을 확인할 수 있다. 임의의 세션을 만들어서 테스트하는 것 같음.

python -m unittest test_df.py

테스트가 성공적으로 돌았음을 확인.

profile
반갑습니다 햄스터 좋아합니다

0개의 댓글