Playwright Fixture와 Closure 학습

학습 자료는 공식 문서를 기반으로 합니다: https://playwright.dev/python/docs/auth

기본 지식 수준은 Java는 약간 다루지만 Python은 거의 모르고 사용도 거의 없는 상태입니다. Playwright는 입문하기 매우 쉬우며 Selenium도 그리 어렵지 않습니다.

학습 전에 pytest.fixture와 closure(nested function)의 개념을 이해해야 합니다.

개인적인 해석:

Fixture: (면접에서 '夹具'라고 불리는 것) 테스트 실행 전에 수행할 작업과 실행 후에 수행할 작업을 의미합니다. 예를 들어 데이터베이스 연결 설정이나 로그인 세션 정보 획득 등이 해당됩니다.

하나의 테스트에는 여러 fixture를 사용할 수 있으며, 각각의 fixture는 다른 fixture를 사용할 수도 있습니다. 하나의 fixture는 동일한 테스트 내에서 여러 번 요청될 수 있습니다. 아래 예제가 흥미롭습니다.

# test_append.py 내용
import pytest

# 준비 단계
@pytest.fixture
def first_entry():
    return "a"

# 준비 단계
@pytest.fixture
def order():
    return []

# 실행 단계
@pytest.fixture
def append_first(order, first_entry):
    return order.append(first_entry)

def test_string_only(append_first, order, first_entry):
    # 검증 단계
    assert order == [first_entry]

이 코드가 이상하게 보일 수 있습니다. 일반적으로 order는 [], [first_entry]는 ["a"]로 같을 수 없는데요?

Fixture는 동일한 테스트 내에서 여러 번 요청될 수 있으며, pytest는 해당 테스트에서는 다시 실행하지 않습니다. 즉, 의존하는 여러 fixture들에서 같은 fixture를 요청하거나 테스트 자체에서도 요청해도 해당 fixture는 한 번만 실행됩니다.

-- https://docs.pytest.org/en/6.2.x/fixture.html

결론: 같은 fixture가 여러 번 요청되더라도 테스트 내에서는 한 번만 호출됩니다. test_string_only 실행 시, append_first가 먼저 요청되면 order 변수는 ['a']로 설정되며, 이후에도 order fixture가 요청되더라도 다시 실행되지 않습니다. 따라서 이 테스트는 통과됩니다.

Fixture에는 어떤 추가 설정이 가능한가요?

  1. autouse: 이름 그대로 모든 테스트 실행 전에 자동으로 실행되는 설정입니다.
@pytest.fixture(autouse=True)
  1. scope 설정: function, class, module, package, session
  • function: 기본 스코프로, 테스트 종료 시 fixture가 파괴됩니다.
  • class: 클래스의 마지막 테스트 종료 시 fixture가 파괴됩니다.
  • module: 모듈의 마지막 테스트 종료 시 fixture가 파괴됩니다.
  • package: 패키지의 마지막 테스트 종료 시 fixture가 파괴됩니다.
  • session: 테스트 세션 종료 시 fixture가 파괴됩니다.

Closure: 함수 내부에 함수를 정의하는 방식입니다. 내부 함수는 외부 함수의 변수에 접근할 수 있습니다. 외부 함수는 내부 함수의 이름을 반환값으로 제공합니다.

def outer_func(x):
    def inner_func(y):
        return x + y
    return inner_func

태그: Playwright Pytest fixture Closure python

10월 11일 21:56에 게시됨