본문 바로가기
개발/Python

[파이썬, Python] assert 활용법 총정리

by 꾀돌이 개발자 2024. 7. 17.
반응형

 

assert 활용하기

 

 

- assert는 파이썬에서 디버깅과 테스트에 자주 사용되는 키워드로, 특정 조건이 참인지 확인하고 그렇지 않으면 AssertionError를 발생시키는 역할을 합니다.

- 주로 프로그램 실행 도중에 예상하지 못한 상태가 발생했을 때 이를 잡아내기 위해 사용됩니다.

 

 

[assert 구문의 기본 형식]

assert condition, message
  • condition: 참(True)이어야 하는 조건입니다. 이 조건이 거짓(False)이면 AssertionError가 발생합니다.
  • message: (선택사항) 조건이 거짓일 때 표시할 오류 메시지입니다. 이 메시지는 디버깅에 도움이 됩니다.

 

 

[예제]

def divide(a, b):
    assert b != 0, "The divisor b cannot be zero."
    return a / b

print(divide(10, 2))  # 정상 출력: 5.0
print(divide(10, 0))  # AssertionError: The divisor b cannot be zero.
  • 위 예제에서 divide 함수는 두 숫자를 나누기 전에 나누는 수(b)가 0이 아닌지 확인합니다.
  • 만약 b가 0이라면 assert 문이 AssertionError와 함께 메시지를 출력합니다.

 

 

[assert의 용도]

  • 디버깅: 코드가 의도한 대로 동작하는지 확인하는 데 사용됩니다. 예를 들어, 함수의 입력 값이 예상 범위 내에 있는지 확인할 수 있습니다.
  • 테스트: 단위 테스트에서 특정 조건이 충족되는지 확인하는 데 사용됩니다. 예를 들어, 테스트 함수 내에서 예상 결과와 실제 결과를 비교할 때 유용합니다.
  • 문서화: 코드의 가정을 명확히 하고, 다른 개발자가 코드를 읽을 때 이해를 돕기 위해 사용될 수 있습니다.

 

 

[예제: 디버깅]

def square_root(x):
    # 입력 값이 음수가 아님을 디버깅 목적으로 확인
    assert x >= 0, "Input must be non-negative"
    return x ** 0.5

print(square_root(9))  # 출력: 3.0
print(square_root(-1)) # AssertionError: Input must be non-negative
  • assert x >= 0, "Input must be non-negative": 입력 값이 음수가 아님을 확인합니다. 만약 x가 음수라면 AssertionError가 발생하며 메시지 "Input must be non-negative"가 출력됩니다. 이는 함수가 음수 입력을 받았을 때 예상치 못한 동작을 하지 않도록 방지합니다.

 

 

[예제: 테스트]

def add(a, b):
    return a + b

def test_add():
    assert add(1, 2) == 3, "Test case 1 failed"
    assert add(-1, 1) == 0, "Test case 2 failed"
    assert add(0, 0) == 0, "Test case 3 failed"

test_add()  # 모든 테스트 케이스가 통과하면 아무 메시지도 출력되지 않음

- def test_add(): add 함수의 테스트 케이스를 정의하는 함수입니다.

  • assert add(1, 2) == 3, "Test case 1 failed": add(1, 2)의 결과가 3인지 확인합니다. 결과가 다르면 "Test case 1 failed" 메시지와 함께 AssertionError가 발생합니다.
  • assert add(-1, 1) == 0, "Test case 2 failed": add(-1, 1)의 결과가 0인지 확인합니다. 결과가 다르면 "Test case 2 failed" 메시지와 함께 AssertionError가 발생합니다.
  • assert add(0, 0) == 0, "Test case 3 failed": add(0, 0)의 결과가 0인지 확인합니다. 결과가 다르면 "Test case 3 failed" 메시지와 함께 AssertionError가 발생합니다.

 

 

[예제: 문서화]

def find_min(numbers):
    """
    주어진 숫자 리스트에서 최솟값을 찾습니다.
    리스트는 비어 있지 않아야 하며, 모든 요소는 숫자여야 합니다.
    """
    # 리스트가 비어 있지 않음을 문서화
    assert len(numbers) > 0, "The list of numbers must not be empty."
    # 모든 요소가 숫자임을 문서화
    assert all(isinstance(n, (int, float)) for n in numbers), "All elements in the list must be numbers."
    
    min_value = numbers[0]
    for number in numbers:
        if number < min_value:
            min_value = number
    return min_value

print(find_min([3, 1, 4, 1, 5, 9, 2, 6, 5]))  # 출력: 1

# 잘못된 사용: 리스트가 비어 있음
try:
    print(find_min([]))
except AssertionError as e:
    print(f"AssertionError: {e}")  # 출력: AssertionError: The list of numbers must not be empty.

# 잘못된 사용: 리스트 요소가 숫자가 아님
try:
    print(find_min([3, "a", 4]))
except AssertionError as e:
    print(f"AssertionError: {e}")  # 출력: AssertionError: All elements in the list must be numbers.
  • assert len(numbers) > 0, "The list of numbers must not be empty.": 리스트가 비어 있지 않음을 확인합니다. 리스트가 비어 있으면 AssertionError가 발생하며 메시지 "The list of numbers must not be empty"가 출력됩니다.
  • assert all(isinstance(n, (int, float)) for n in numbers), "All elements in the list must be numbers.": 리스트의 모든 요소가 숫자인지 확인합니다. 숫자가 아닌 요소가 있으면 AssertionError가 발생하며 메시지 "All elements in the list must be numbers"가 출력됩니다.

 

 

[assert 사용 시 주의사항]

  • 성능: assert 문은 기본적으로 디버깅 목적으로 사용되며, 파이썬 인터프리터를 -O (optimize) 옵션과 함께 실행하면 assert 문이 무시됩니다. 따라서 성능이 중요한 코드에서는 assert를 남용하지 않는 것이 좋습니다.
  • 예외 처리: assert는 예외를 처리하기 위한 도구가 아닙니다. 일반적인 오류 처리는 try-except 블록을 사용해야 합니다.

 

 

[결론]

  • assert는 코드의 논리를 문서화하고 디버깅을 돕는 유용한 도구입니다.
  • 올바르게 사용하면 코드의 품질을 향상시키고 유지 보수를 쉽게 할 수 있습니다.

 

반응형