Assertion 개념과 사용 w/ Playwright
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 을 사용하면 버그를 조기에 발견할 수 있어 개발이 훨씬 안전해진다