관리 메뉴

ITGeine

Pytest fixture 에 대한 정리 본문

Study/Python

Pytest fixture 에 대한 정리

Nick9 2024. 2. 26. 14:00

 Pytest 를 사용하다 보면 테스트 모듈마다 반복되는 기본 작업이 있는 경우가 있는데, 이 때 pytest 의 fixture 를 사용하여 리소스를 정의하고, 재사용할 수 있다. 

 

 fixture를 테스트 자동화에 사용하다 개념 정리의 필요성을 느껴서 아래 문서 기반으로 정리해보고자 한다.

(*의역 많음 주의)

 

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

 

pytest fixtures: explicit, modular, scalable — pytest documentation

Software test fixtures initialize test functions. They provide a fixed baseline so that tests execute reliably and produce consistent, repeatable, results. Initialization may setup services, state, or other operating environments. These are accessed by tes

docs.pytest.org

 


0. Fixture 간단 정리

  •  테스트 function을 initialize 하는 것
    • initialize : 서비스, 특정한 상태, 또는 실행 환경에서의 setup
  • 테스트가 안정적으로 실행되고, 일관되고 반복 가능한 결과를 생성할 수 있도록 함

 

pytest fixture 와 기존 setup/teardown function 과의 차이점 

  • fixture는 특정한 이름을 가지고, 테스트 function, 모듈, 클래스나 전체 프로젝트 범위에서 활성화됨
    • fixture scope로 지정 가능한 값들 : functionclassmodulepackage or session. (기본값 : function)
@pytest.fixture(scope='module')
  • 관리상의 이점 : 단순한 unit 부터 복잡한 기능 테스팅까지 가능하며, 설정 및 컴포넌트 옵션에 따라 fixture 를 파라미터처럼 사용할 수 있고, 함수, 클래스, 모듈 또는 전체 테스트 세션에서 fixture를 재사용 할 수 있음 

 


1. Fixture 가 무엇인지 정의하기 전에..

 

fixture 가 무엇인지 보기 전에, 먼저 테스트가 무엇인지 정리해보자.

  • 테스트 = 특정 동작의 결과를 확인하고 그 결과가 기대값과 같은지를 확인하는 것

이때 "동작"은 어떤 시스템이 특정 상황/자극에 대해 행동하는 방식으로 이 동작이 이루어지는 방법(how) 이나 왜 동작이 이루어지는지 (why) 는 중요하지 않다.

 

테스트를 4단계로 나누어보면 : 

  1. Arrange : 테스트를 위한 준비단계
    • ex) 객체 생성, 데이터베이스에 레코드 입력, URL 정의, 자격 증명 생성, 어떤 프로세스가 완료될 때까지 대기하기 등
  2. Act : the singular, state-changing action that kicks off the behavior we want to test.
    • 테스트하고자 하는 "동작" 을 시작하는 단일 작업
    • 이 동작은 System Under Test (SUT)의 상태 변경을 포함함
      • System Under Test : 테스트의 대상이 되는 시스템
    • 일반적으로 function / method call 의 형태를 띰
  3. Assert : 결과가 기대한 것과 같은지 확인하는 단계
    • assert 는 테스트가 기대와 같은지 측정하고 판단함
    • ex) 무엇인가가 green 이어야 한다면, 이것을 assert thing == "green" 과 같이 말할 수 있음
  4. Cleanup : 다른 테스트가 영향받지 않도록 자체 정리

다시 돌아가서, 핵심적으로 테스트는 Act 와 Assert 단계로 이루어져 있다. (우리가 테스트하고자 하는 특정 "동작" 은 이 두 단계에 포함됨) Arrange 단계는 테스트하기 위한 context 만 제공한다. 

 


2. Fixture 로 돌아가서 

 

"Fixture" 란 각각의 단계와 데이터를 Arrange 하는 것으로, 테스트가 필요로 하는 모든 것이다.

  • 기본적으로 테스트 함수는 fixture 를 함수의 인자로 사용하는 방식으로 사용된다. 
    • ex) def test_function(fixture1, fixture2) : 와 같은 형식
  • pytest 에서 fixture는 Arrange 스텝에만 제한되지 않고 Act 단계에서도 사용될 수 있다.
  • @pytest.fixture 라는 데코레이션을 사용한다.
  • 테스트는 원하는 만큼 다수의 fixture 를 사용할 수 있으며, 픽스처 또한 다른 픽스처를 사용할 수 있다.

 

3. Requesting fixture

 

  1. fixture는 다른 fixture를 호출할 수 있다
  2. fixture는 재사용가능하다
  3. 테스트/fixture는 한번에 하나 이상의 fixture를 호출할 수 있다
  4. fixture는 한 테스트에서 여러 번 요청될 수 있다 (return 값은 캐시됨)
  5. autouse fixture : 호출할 필요가 없는 fixture 도 존재한다. 아래와 같이 autouse = true 로 선언
@pytest.fixture(autouse=True)

 


 

4. Fixture scope 

fixture는 테스트에서 처음으로 요청될 때 생성되며, 생명 주기는 scope 에 따라 결정된다:

  • function: 기본 스코프로, 테스트 종료 시에 파괴
  • class: 클래스 내 마지막 테스트의 teardown 중에 파괴
  • module: 모듈 내 마지막 테스트의 teardown 중에 파괴
  • package: 패키지 내 마지막 테스트의 teardown 중에 파괴
  • session: 테스트 세션 종료 시에 파괴

+) version 5.2 에서 추가된 scope : Dynamic scope

fixture 정의 시 scope 속성에 호출 가능한(callable) 함수를 넣을 수 있고, 이 함수는 유효한 범위를 나타내는 문자열을 반환해야 함

다.