오예남

pytest 로 예외처리하는 방법 try/except 대신 pytest.raises 사용하기 본문

Pytest

pytest 로 예외처리하는 방법 try/except 대신 pytest.raises 사용하기

오예남 2025. 2. 1. 23:12

 

 

이전 글에서는 pytest를 설치하고 샘플 코드로 간단하게 실행하는 방법을 알아보았습니다.

 

 

QA 엔지니어를 위한 테스트 자동화 python pytest 독학

Pytest 소개 https://docs.pytest.org/en/stable/ Pytest는 Python의 강력한 테스트 프레임워크로, 코드의 품질을 유지하고 버그를 조기에 발견하는 데 도움을 줍니다. 단위 테스트(Unit Test), 기능 테스트(Functional

ohyenam.tistory.com

 

 

작성한 테스트 코드가 성공할 경우, 테스트 결과로 '.' 이 표시되고,

의도적으로 실패하는 코드를 실행시키면 에러 메세지와 함께 테스트 결과는 F로 표시되는 것을 확인하였습니다.

 

그렇다면 우리가 의도적으로 '예외를 발생시키는 코드'를 테스트 해야할 때는 어떻게 할까요?

 


Pytest 예외 처리

 

예를 들어보겠습니다.

아래는 숫자를 0으로 나누어 ZeroDivisionError 가 발생하는 코드입니다.

def test_divide_by_zero():
    num = 1 / 0

 

 

위 코드를 그대로 사용한다면, 아래와 같이 ZeroDivisionError가 발생하며 실패한 테스트로 처리됩니다.

======================================== test session starts =========================================
platform win32 -- Python 3.10.2, pytest-8.3.4, pluggy-1.5.0
rootdir: C:\Python\pytest
collected 1 item                                                                                      

test_add.py F                                                                                   [100%]

============================================== FAILURES ============================================== 
________________________________________ test_divide_by_zero _________________________________________ 

    def test_divide_by_zero():
>       num = 1 / 0
E       ZeroDivisionError: division by zero

test_add.py:5: ZeroDivisionError
====================================== short test summary info ======================================= 
FAILED test_add.py::test_divide_by_zero - ZeroDivisionError: division by zero
========================================= 1 failed in 0.08s ==========================================

 

 

pytest.raises 로 예외처리하기

 

이런 예외를 테스트하기 위해 pytest에서는 pytest.raises 라는 기능을 제공합니다.

위에서 사용했던 코드에 pytest.raises 코드를 추가하였습니다.

import pytest

def test_divide_by_zero():
    with pytest.raises(ZeroDivisionError) as e:
        num = 1 / 0
    
    assert 'division by zero' in str(e.value)

 

위에 추가된 코드에 대한 설명은 아래와 같습니다.

  • with pytest.raises(ZeroDivisionError) as e:
    -> "이 블록 안에서 ZeroDivisionError가 발생할 거야"라고 pytest에게 알려줍니다.
    -> 만약 예상한 예외가 발생하면 테스트는 성공합니다.
    -> 만약 예외가 발생하지 않거나 다른 종류의 예외가 발생하면 테스트는 실패합니다.
    -> 발생한 예외 객체를 변수 e에 저장합니다.
  • assert 'division by zero' in str(e.value)
    -> e.value 의 예외 메시지를 확인하고, 해당 메세지에 'division by zero' 문구가 포함되어있는지 확인합니다.

 

이렇게 pytest.raises 구문을 사용하면, try/except 구문을 작성할 필요가 없어 코드를 깔끔하게 작성할 수 있습니다.

그리고 예외 발생 여부와 예외 메시지에 특정 구문이 포함되어있는지도 한번에 테스트할 수 있습니다