[파이썬] pytest와 코드 보안

코드 보안은 모든 프로그래머가 염두에 두어야 할 중요한 요소입니다. 악성 코드나 취약점이 있는 코드는 해커의 침입을 허용할 수 있으며, 그로 인해 소프트웨어 시스템은 큰 위험에 빠질 수 있습니다. Python에서는 pytest를 사용하여 코드 보안을 강화할 수 있습니다.

pytest란?

pytest는 파이썬에서 단위 테스트를 작성하고 실행하기 위한 간편하고 확장 가능한 테스트 프레임워크입니다. pytest는 테스트 케이스 작성을 위해 간단하고 직관적인 문법을 제공하며, 자동으로 테스트를 수행하여 결과를 제공합니다.

코드 보안을 강화하는 pytest 기능

pytest는 코드 보안을 강화하는 다양한 기능을 제공합니다. 몇 가지 예를 살펴보겠습니다.

1. 테스트 케이스에서 예외 테스트

pytest는 예외 테스트 케이스를 작성하는 데 유용합니다. 코드에서 발생할 수 있는 예외 상황을 명시적으로 테스트하여 예외 처리가 올바르게 이루어지는지 확인할 수 있습니다.

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("Divisor cannot be zero")
    return a / b


def test_divide_by_zero():
    with pytest.raises(ZeroDivisionError):
        divide(10, 0)

2. 파라미터화된 테스트

pytest의 @pytest.mark.parametrize 데코레이터를 사용하면 테스트 케이스를 다양한 입력값으로 실행할 수 있습니다. 이를 통해 다양한 케이스를 포괄적으로 테스트할 수 있으며, 예기치 않은 동작을 방지할 수 있습니다.

def is_odd(number):
    return number % 2 != 0


@pytest.mark.parametrize("number, expected", [
    (1, True),
    (2, False),
    (3, True),
    (4, False),
])
def test_is_odd(number, expected):
    assert is_odd(number) == expected

3. 모의 객체(Mocking)

pytest-mock 라이브러리를 사용하면 모의 객체(Mock)를 생성하여 외부 의존성을 테스트에서 격리할 수 있습니다. 이를 통해 코드 보안을 강화하고 의도하지 않은 네트워크 요청이나 데이터 누출을 방지할 수 있습니다.

import requests

def get_data_from_api():
    response = requests.get("https://api.example.com/data")
    return response.json()


def test_get_data_from_api(mocker):
    expected_data = {"key": "value"}
    mocker.patch("requests.get", return_value=expected_data)
    
    data = get_data_from_api()
    
    assert data == expected_data

마무리

pytest는 코드 보안을 강화하는 강력한 도구입니다. 예외 테스트, 파라미터화된 테스트, 모의 객체를 사용하여 코드의 견고성을 검증하고 코드 보안을 개선할 수 있습니다. pytest를 통해 안전하고 신뢰성 있는 파이썬 코드를 작성하고 유지보수할 수 있습니다.