semtax의 개발 일지

pytest로 파이썬 유닛테스팅 수행하기 본문

개발/Python

pytest로 파이썬 유닛테스팅 수행하기

semtax 2020. 1. 27. 01:02
반응형

개요

 

이번 포스팅에서는 파이썬 테스팅 도구인 pytest에 대해서 알아보도록 하겠습니다.

 

테스트 코드의 중요성

 

 

맨 처음 프로그램을 짜는 사람의 입장이나, 크기가 그렇게 크지 않은 서비스를 제작할때에는,

테스트의 중요성이 크게 중요하지 않다고 느껴진다.

 

 

 

사실, 코드의 크기가 별로 크지 않은 경우에는 그냥 직접 돌려보면서 테스트하는게 더 빠를 수도 있다.

 

하지만, 프로젝트의 크기가 점점 커지고 요구사항들이 추가되어 기능이 고도화가 되는 경우,

코드의 크기도 그에 맞춰서 증가하게 되고 각 모듈간 참조하는 경우의 수가 늘어나게 되어,

특정부분에서 에러가 났을때 버그를 해결하기가 정말로 힘들어지게 된다.

 

 

 

특히, 한 부분을 고쳤는데 그 고친 부분때문에 다른 부분에서 에러가 나는 일도

프로그램의 크기가 큰 경우 매우 빈번하게 발생한다.

 

이러한 상황에 직면했을때, 테스트 코드가 있는 경우에는 어느 모듈에서 문제가 생겼는지를

조기에 테스트 코드를 이용해서 많은 경우를 잡아내게 되므로 많은 시간을 절약 할 수 있다.

 

 

반면에, 테스트 코드나 테스트 케이스가 없는 경우 프로젝트(또는 서비스)의 코드를 수정하는 일이 매우 부담스럽게 되고, 결국 코드를 전혀 수정하지 못해서 변화에 대응하지 못해 서비스가 없어지거나, 다시 바닥부터 짜야되는 일이 발생하게 된다.

 

 

더 나아가서, 요즘에는 테스트 코드를 먼저 작성하고 그 다음에 실제 코드를 작성하는 TDD라는 방식도 많이 사용되고 있다.

(사실 국내 실정, 특히 SI 프로젝트의 경우에는 맞지 않는 경우가 많다.)

 

 

따라서 유닛테스트의 중요성 때문에 많은 언어에서 이러한 유닛테스팅 도구들을 제공하고 있다.

이번 시간에는, python에서 주로 사용하는 유닛 테스트 도구인 pytest에 대해서 알아보도록 하겠다.

 

 

설치

 

먼저 아래와 같이 pytest를 설치 해준다.

 

$ pip install -U pytest

 

 

예제

 

먼저 테스트를 위해 test_sample.py 라는 파일을 만들어 주자.

(이때, 테스트 코드 파일은 무조건 test라는 단어가 맨 앞이나 맨 뒤에 들어가야 된다.)

 

 

그리고 아래와 같이 작성을 해주자.

 

def sums(x):
  return 1 + x*(x+1) / 2

def test_answer():
    assert sums(4) == 10

 

 

그리고 작성한 파일과 같은 경로에서 아래와 같이 실행해주자.

 

$ pytest
(또는)
$ python3 -m pytest

 

 

실행한 경우, 우리가 의도한 값과 다르게 나오기 때문에 아래와 같이 테스트가 실패했다.

 

============================= test session starts ==============================
platform darwin -- Python 3.7.6, pytest-5.3.4, py-1.8.1, pluggy-0.13.1
rootdir: /Users/semtax/Desktop/메가박스 영화알리미
plugins: celery-4.4.0
collected 1 item

test_samples.py F                                                        [100%]

=================================== FAILURES ===================================
_________________________________ test_answer __________________________________

    def test_answer():
>       assert sums(4) == 10
E       assert 11.0 == 10
E        +  where 11.0 = sums(4)

test_samples.py:5: AssertionError
============================== 1 failed in 0.04s ===============================

 

 

다시 코드를 수정해보자.

 

def sums(x):
  return x*(x+1) / 2

def test_answer():
    assert sums(4) == 10

 

 

실행한 경우, 우리가 의도한 대로 값이 나오기 때문에 아래와 같이 테스트가 성공했다고 나온다.

 

============================= test session starts ==============================
platform darwin -- Python 3.7.6, pytest-5.3.4, py-1.8.1, pluggy-0.13.1
rootdir: /Users/semtax/Desktop/메가박스 영화알리미
plugins: celery-4.4.0
collected 1 item

test_samples.py .                                                        [100%]

============================== 1 passed in 0.01s ===============================
반응형
Comments