[pytest] 01. 시작하기

개요

pytest은 작고 읽기 쉬운 테스트를 작성할 수 있도록 지원하는 프레임워크
애플리케이션 및 라이브러리에 대한 복잡한 기능도 테스트를 지원하도록 확장할 수 있다.

나는 라이브러리를 제작하고 있는데, 라이브러리의 기능을 테스트를 해야해서 pytest을 이용하여 테스트를 진행하고자 한다.
이를 위해 pytest 공식 문서의 내용을 정리하여 블로그에 작성하였다.

환경 구성

  • python 버전 : 3.9.7
  • pytest 버전 : 6.2.5

환경 구성

$ mkdir pytestStudy
$ cd pytestStudy
$ python3 -m pip install pytest

나는 pytestStudy 디렉터리 안에서 pytest를 연습을 할 거라서 따로 디렉터리를 생성하였다.

$ pytest --version
pytest 6.2.5

아무 이상 없이 설치가 되었는지 확인하기 위해 --version 옵션을 이용하여 버전을 출력하였다.

사용 예시

위 사진은 pytest를 어떻게 사용되는지 보여주기 위해 참고용으로 넘은 사진이다.
pytest를 사용할 때 지정된 파일이 없다면 호출된 디렉토리의 여러 파일을 테스트할 수 있다.

여러 파일을 테스트할 필요가 없다면 위 사진처럼 pytest 옆에 파일명을 넣어주면 된다.
또한 파일명을 test_*으로 넣어주면 test_로 시작되는 파일들을 테스트를 해주는 기능도 있다.

이 밖에 여러 기능이 있지만, 실습을 통해 알아보도록 하겠다.

첫번째 테스트 만들기

# test_sample.py

# 테스트할 함수
def func(x):
    return x + 1

# 테스트 함수 설정
def test_answer():
    assert func(3) == 5

테스트 기능을 실행하기 위해 간단한 코드를 작성하였다.

func 함수는 인자값 x를 입력 받아서 x+1 반환하는 함수이다.
test_answer 함수는 func 함수에 3을 넘겨주고, 결과값을 5와 비교하였다.
결과는 False가 나오는 것이 맞다.

 

pytest를 실행했더니, 테스트를 진행한 파일명 옆에 F가 출력되었다.
그리고 밑엔 자세하게 에러가 발생된 이유가 출력되었다.

나는 위 예제를 보고 궁금한 것이 생겨서 궁금한 내용의 답을 찾아서 정리하였다.

  • 테스트를 실행시키는 방법은 test_answer 명을 가진 함수에서 설정하면 되는 건가?
    궁금해서 해본 결과 그렇지 않다는 것을 알 수 있었다.
# test_sample.py

def func():
    assert 4 == 5

여기서 주의할 점은 pytest는 함수명에 test라는 단어가 있는 함수만 실행된다.

# test_sample.py

def func():
    return 4 == 5

func()

assert 명령문이 없으니, Error를 발견하지 못하였다.
이는 당연한 결과이다. 왜냐하면 False은 파이썬의 Bool이고, Error가 아니기 때문이다.

# test_sample.py

def test_one():
    assert [1][1]

IndexError가 나오도록 코드를 작성해 본 결과 pytest에서 Error가 발생했다고 아주 친절하게 출력했다.
이처럼 pytest는 Error를 수집하여 테스트 기대치화 시키는 것으로 보인다.

특정 예외 발생

일부 코드에서 예외가 발생하는지 확인하려면 raises 헬퍼를 사용하면 된다.

# test_sysexit.py
import pytest

# 테스트할 함수
def func():
    raise SystemExit(1)

def test_mytest():
    with pytest.raises(SystemExit):
        func()

실행한 결과 종료 예외(SystemExit(1))가 잘 작동하는 지 확인해봤다.
위 사진의 첫번째 pytest 실행은 -q 옵션으로 quiet reporting mode로 실행시키는 옵션이다.
-q옵션을 사용 안 한 결과와 차이점을 보여주고 싶어서 위 사진을 첨부한다.

클래스에서 여러 테스트 그룹화

# test_class.py
class TestClass:
    def test_one(self):
        x = 'hello'
        assert 'h' in x

    def test_two(self):
        assert hasattr(TestClass, 'test_three')

이처럼 클래스에서도 아주 잘 작동하는 것을 볼 수 있다.
주의할 점은 클래스명과 메소드 명에도 test 접두사가 필요하다는 것이다.

# test_class.py
class Class:
    def test_one(self):
        x = 'hello'
        assert 'h' in x

    def test_two(self):
        assert hasattr(TestClass, 'test_three')

test 접두사가 빠지니, pytest가 찾지 못하는 모습을 볼 수 있다.
그래서 꼭 클래스명에는 Test, 메소드는 test 접두사를 넣어야 한다.

'Development > 내용 정리' 카테고리의 다른 글

[pytest] 03. pytest201  (0) 2021.10.06
[pytest] 02. pytest101  (0) 2021.10.06