딥상어동의 딥한 생각

[pytest] TDD, 초간단 pytest 실행해보기

by 딥상어동의 딥한생각
가짜연구소 내 Python - Data Engineering 스터디를 위해 작성했습니다. 

https://www.notion.so/chanrankim/PseudoLab-c42db6652c1b45c3ba4bfe157c70cf09

(가짜연구소 링크)

https://www.notion.so/chanrankim/Data-Engineer-Python-83c206a662004120a8211a800581e124

(스터디상세 링크)

- 테스트를 실패하지 않는 가장 좋은 방법! 

- 테스트를 하지 않는것!

 

0. TDD란?

- Test-Driven-Development의 약자(=테스트 주도 개발) 

- 테스트 코드를 먼저 작성(실패할 확률이 높음)

- 테스트 통과 목적의 코드 작성

- 테스트 통과후 코드 성능 향상(재사용성, 가독성, 기능 성능 향상)

- 왜 하는가?

  - 기능 단위의 피드백 루프를 거친다. 

  - 테스트 단계를 통해 서비스 전 코드가 가진 불확실성 개선

  - 쓸데 없는 기능 추가하는 것 방지(테스트 통과가 목적이기 때문에)

  - 구현하고자 하는 코드 기능에 부담없이 친숙해질 수 있음

- 단점은?

  - 괜히 코드 구현 초기 비용만 늘어나는거 아닌가?(EX_그냥 바로 개발하면 되는데)

  - TDD 자체가 목적이 되는경우(테스트만 하다가 끝나버림)

 

1. Pytest 구현 기능

python에서 코드 test를 해주는 라이브러리들은 다양하다. 그 중 가장 간단하고 사용이 쉬운 pytest를 사용해보려 한다. 우선, 구현하기 전에 개발하고자 하는 기능을 먼저 정의하겠다.

특정 분포에서 여러번 샘플링을 했을 때, 각 샘플 집단들은 얼마나 유사할까?(상관관계 이용)

뭐 대충 이런 작업을 해본다고 가정하자. 어떤 기능들이 필요할까?

 

2. Pytest 구현 내용

- array를 생성했을 때 numpy module을 이용했는지 check

 

우선 위 한가지만 테스트 해볼 것이다.

 

3. Pytest 구현

pip3 install pytest

우선 해당 명령어로 pytest를 설치해준다.

 

파일 구조는 위와 같은데, func라는 폴더에 본 파일을 작성하기전 테스트 폴더에서 TDD를 하는 상황을 가정했다. first_test.py 안 코드 구조는 다음과 같다.

import pytest

def get_array(mean: int, std: int, size: tuple):
    return np.random.normal(mean, std, size)
def test_module_name():
    assert type(get_array(0, 1, (2, 10))).__module__ = 'numpy'

 

한번 pytest를 실행해보자.

pytest test/first_test.py

이런 굉장히 호러블한...메시지가 나오는데, 일단 에러 내용을 살펴보니 syntax 에러라고 해서 문법에 뭔가 잘못된 부분이 있는 것 같다. 에러 수정 전에 directory 구조를 한번 더 살펴보자.

 

이렇게, pytest_cache라는 폴더가 동일 디렉토리 레벨에 생겼다. 

 

일단 이점 참고하고, 다시 내부 코드를 살펴보니 ==이 아니고.. =이라고 입력해서 에러가 생긴것을 발견했다.

 

해당 부분을 수정하고 다시 실행했더니

이번에는 라이브러리가 제대로 설치되지 않은 것 같다. 다시.. 라이브러리까지 제대로 설치해주고 나면

 

import pytest
import numpy as np 


def get_array(mean: int, std: int, size: tuple):
    return np.random.normal(mean, std, size)
    
    
def test_module_name():
    assert type(get_array(0, 1, (2, 10))).__module__ == 'numpy'

 

최종 코드는 위와 같이 된다. 한번 더 실행해보자.

 

테스트가 잘되면 위와 같이 표기된다. 

 

아주 간단하게만, pytest를 해봤는데 다음 글에서는 pytest 내부 구성 요소에 대해 조금 더 살펴볼 예정이다. 이상

블로그의 정보

딥상어동의 딥한생각

딥상어동의 딥한생각

활동하기