TIL

Assertion 개념과 사용 w/ Playwright

아람2 2025. 2. 19. 22:40
반응형

 

Assertion 이 프로그래밍에서 어떤 의미일까? 

1. 주장 Claim → 이 조건이 반드시 참이어야 한다 

Assert 를 사용하면 이 조건이 True 라고 단언 (assert) 한다는 의미, 

프로그램이 예상대로 동작하지 않으면, "이건 틀렸다!" 라고 강하게 주장하며 실행을 중단하는 역할을 한다 

assert 2 + 2 == 4  # ✅ 이건 항상 참이므로 오류 없음
assert 2 + 2 == 5  # ❌ AssertionError 발생 (틀린 주장)

2. 권리 행사 Exercise of a Right → 잘못된 걸 방지한다 

Assertion 은 프로그램이 잘못된 상태로 실행되지 않도록 보호하는 역할을 한다 

def withdraw(amount, balance):
    assert amount <= balance, "잔액 부족!"  # 출금액이 잔액보다 크면 오류 발생
    return balance - amount

print(withdraw(50, 100))  # ✅ 정상 실행 (출금 가능)
print(withdraw(150, 100))  # ❌ AssertionError 발생 ("잔액 부족!")

 

Assertion 을 쉽게 설명하면, 내가 기대한 결과가 실제로 맞는지 확인하는 코드 이다 

만약 예상이 틀리면 AssertionError 가 발생하여 프로그램 실행을 멈춘다 

 

컴퓨터 과학에서의 Assertion 은, 특정 조건이 True 인지 확인하는 명령 
ex. An assertion is used to ensure that program behaves as expected. 

 

Assertion 이 없으면? → 버그 발생 가능 

def divide(a, b):
    return a / b  # 0으로 나누면 에러 발생

print(divide(10, 2))  # ✅ 정상 출력 → 5.0
print(divide(10, 0))  # ❌ ZeroDivisionError 발생 (런타임 에러)

 

Assertion 을 사용하면? → 사전 방지 

def divide(a, b):
    assert b != 0, "0으로 나눌 수 없습니다!"  # 0이면 강제 종료
    return a / b  

print(divide(10, 2))  # ✅ 정상 출력 → 5.0
print(divide(10, 0))  # ❌ AssertionError: 0으로 나눌 수 없습니다!

 

Playwright 에서 Assertion 

기대한 결과가 실제 웹에서 보이는지 확인하기 위해 expect() 를 사용하여 Assertion 을 한다 

AssertionError 가 발생하면 Playwright 가 자동으로 테스트 실패로 처리한다 

expect() 는 내부적으로 자동 재시도 retry 기능을 제공하여, 웹 요소가 일정 시간 동안 나타나기를 기다릴 수 있다 

 

아래 코드는 Playwright 가 Installation 제목이 나타날 때까지

기본 타임아웃 (5초) 동안 기다리므로 일시적인 로딩 문제로 인해 테스트가 바로 실패하지 않는다 

expect(page.get_by_role("heading", name="Installation")).to_be_visible()

#Example1 웹사이트 제목 확인 

from playwright.sync_api import Page, expect

def test_has_title(page: Page):
    page.goto("https://playwright.dev/")

    # "Playwright"라는 단어가 제목에 포함되어 있어야 한다 
    expect(page).to_have_title(re.compile("Playwright"))
    
# 페이지 제목에 "Playwright"이 포함되어 있으면 → 테스트 통과
# 페이지 제목이 다르면 → AssertionError 발생 (테스트 실패)

🐣 참고로 re.compile("Playwright", re.IGNORECASE) 이렇게 쓰면 대소문자 구분 없이 모두 매칭된다 🐣

#Example2 버튼 선택 후 페이지 이동 확인 

def test_get_started_link(page: Page):
    page.goto("https://playwright.dev/")
    
    # "Get started" 버튼 선택 
    page.get_by_role("link", name="Get started").click()
    
    # "Installation" 제목이 보여야 한다 
    expect(page.get_by_role("heading", name="Installation")).to_be_visible()

# "Get started" 를 선택했을 때 "Installation" 페이지가 보이면 테스트 통과
# 페이지가 이동하지 않거나, 제목이 다르면 AssertionError 발생

 

Assertion 은 주로 디버깅 목적으로 사용되며, 일반적인 런타임 오류 처리를 위한 수단이 아니다 

Assert 문은 Build 된 Production Code 에서는 -O (optimize) 옵션을 주면 비활성화된다 < 숫자 0 아님 알파벳 대문자 O

python -O script.py  # Assert 문이 비활성화됨

따라서 ❗️ Input Validation 용도로 Assert 문을 사용하는 것은 권장되지 않는다 ❗️

🐣 Input Validation 은 if 문/ raise Exception 을 사용하여 예외를 명확하게 처리하는 것이 바람직하다 🐣

 

Assertion 을 사용하면 버그를 조기에 발견할 수 있어 개발이 훨씬 안전해진다 

반응형