개요
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라는 단어가 있는 함수만 실행된다.
assert
는 뭐지?
03_가정 설정문(assert) - 핵심만 간단히, Hello World! 파이썬 3의 내용에 아주 간단하게 설명이 되어있었다.
assert는 뒤의 조건이 True가 아니면 AssertError를 발생시키는 명령어
# 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 |
Comment