장고로 테스트 코드를 작성하기 위해 선정한 도구들을 소개한다.
우선 테스트 코드 작성을 할 때 가장 중요했던 건 뭐로 테스트를 할지였다.
python은 내장 테스트 라이브러리가 존재하고 그걸 장고에서도 훌륭하게 사용할 수 있다.
다만 내장 테스트 라이브러리의 경우 테스트 코드가 많아질수록 동일하게 중복 작성되는 부분이 많아졌다.
그래서 테스트 라이브러리를 도입했고 pytest를 사용해서 기본적인 테스트 작성을 시작했다.
pytest는 기본적으로 python에서 unittest로 작성한 테스트 코드가 호환이 된다.
그래서 그 작성된 테스트 코드들도 문제없이 작동되면서 추후 수정이 가능했다.
그다음은 fixture들을 잘 활용하면 효율적으로 중복 코드 제거가 가능했다.
fixture를 사용하면 마치 레고 조각들처럼 내가 사용하고 싶은 테스트 코드에 넣어서 적용이 가능했다.
기본적으로 여러 테스트에 사용되는 코드가 존재한다고 했을 때
@fixture
def example():
return
형태로 적용하고 테스트 코드에
def test1(example):
return
이와 같은 형태로 적용이 가능하다.
그다음 강력한 장점은 해당 함수가 scope을 정할 수 있다는 점이다.
테스트를 하다 보면 unit 단위의 테스트도 하지만 여러 단계를 거치면서 진행하는 테스트를 진행할 수 있다.
이때 특정 데이터는 한 번의 사용만으로 목적을 다하지만 어떤 데이터는 해당 테스트가 끝날 때까지 사용될 수 있다.
이때 fixture에 scope을 지정하면 그 scope 영역까지 계속 활성화 상태로 존재하게 된다.
물론 해당 scope이 끝나게 되면 재생성된다.
마지막으로 fixture끼리 호출이 가능하다.
만약 B 데이터가 A 데이터 생성 후 생성이 가능하다면
A 데이터를 fixture로 만들고 B 데이터 fixture 함수에 파라미터로 넣게 되면 해당 함수의 데이터를 활용하여 B 데이터를 완성할 수 있다.
이러한 장점으로 코드 단위를 잘 개 쪼개고 중복 코드를 최소화할 수 있다.
이밖의 pytest의 장점이 있지만 아직은 전부다 활용하고 있지 않아 추후 더 사용하게 된다면 추가할 예정이다.
그다음 장고로 테스트를 진행하다 보면 테스트 데이터 생성을 위해 모델 구조에서 랜덤으로 데이터를 넣고 생성하게 된다.
이때 문제가 모델 즉, 스키 미가 변경되거나 데이터를 넣는 게 까다로운 경우 테스트 코드 작성하는 거보다 테스트 세팅하는데
더 많은 코드를 작성하는 경우가 많았다.
이때 이것을 도와주는 라이브러리로 factoryboy를 사용하였다.
factoryboy는 장고의 모델을 상속받고 의존 라이브러리인 faker를 사용해서 모델 구조에 따라 랜덤으로 데이터를 생성할 수 있다.
단순히 모델 구조만 상속받고 데이터를 생성하는 게 아니라 몇 가지 함수를 활용해서 데이터 셋을 만들 수 있다.
post_generate를 사용하면 데이터 생성 작업에서 특정 파라미터가 들어오게 될 시 정해놓은 액션을 수행하게 만들 수 있다.
그리고 단건 데이터 생성뿐 아니라 다 건 생성도 가능한 게 장점이다.
의존 라이브러리로 있는 faker 또한 유용한데
단순하게 데이터 덩어리가 아니라 특정 목적에 맞는 데이터 셋이 정말 많이 들어있다.
생각나는 것만 나열해도 이름, 번호, 주소, 도로명 주소, 건물명, 우편번호, 한국 성씨 모음 등등
로컬화된 데이터들이 국가별로 다양하게 있다.
이런 장점이 있어 단순히 테스트가 아니라 mock 데이터를 만들 때도 유용하게 쓸 수 있고 다국어 관련 테스트 시 도움이 된다.
이번에 장고로 테스트 코드 작성 시 큰 도움이 된 2가지 라이브러리를 소개했다.
다음 글은 테스트 작성을 위한 구조에 대해서 적겠다.