ITGeine
Pytest fixture 에 대한 정리 본문
Pytest 를 사용하다 보면 테스트 모듈마다 반복되는 기본 작업이 있는 경우가 있는데, 이 때 pytest 의 fixture 를 사용하여 리소스를 정의하고, 재사용할 수 있다.
fixture를 테스트 자동화에 사용하다 개념 정리의 필요성을 느껴서 아래 문서 기반으로 정리해보고자 한다.
(*의역 많음 주의)
- pytest fixture : https://docs.pytest.org/en/6.2.x/fixture.html
0. Fixture 간단 정리
- 테스트 function을 initialize 하는 것
- initialize : 서비스, 특정한 상태, 또는 실행 환경에서의 setup
- 테스트가 안정적으로 실행되고, 일관되고 반복 가능한 결과를 생성할 수 있도록 함
pytest fixture 와 기존 setup/teardown function 과의 차이점
- fixture는 특정한 이름을 가지고, 테스트 function, 모듈, 클래스나 전체 프로젝트 범위에서 활성화됨
- fixture scope로 지정 가능한 값들 : function, class, module, package or session. (기본값 : function)
@pytest.fixture(scope='module')
- 관리상의 이점 : 단순한 unit 부터 복잡한 기능 테스팅까지 가능하며, 설정 및 컴포넌트 옵션에 따라 fixture 를 파라미터처럼 사용할 수 있고, 함수, 클래스, 모듈 또는 전체 테스트 세션에서 fixture를 재사용 할 수 있음
1. Fixture 가 무엇인지 정의하기 전에..
fixture 가 무엇인지 보기 전에, 먼저 테스트가 무엇인지 정리해보자.
- 테스트 = 특정 동작의 결과를 확인하고 그 결과가 기대값과 같은지를 확인하는 것
이때 "동작"은 어떤 시스템이 특정 상황/자극에 대해 행동하는 방식으로 이 동작이 이루어지는 방법(how) 이나 왜 동작이 이루어지는지 (why) 는 중요하지 않다.
테스트를 4단계로 나누어보면 :
- Arrange : 테스트를 위한 준비단계
- ex) 객체 생성, 데이터베이스에 레코드 입력, URL 정의, 자격 증명 생성, 어떤 프로세스가 완료될 때까지 대기하기 등
- 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 의 형태를 띰
- Assert : 결과가 기대한 것과 같은지 확인하는 단계
- assert 는 테스트가 기대와 같은지 측정하고 판단함
- ex) 무엇인가가 green 이어야 한다면, 이것을 assert thing == "green" 과 같이 말할 수 있음
- 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
- fixture는 다른 fixture를 호출할 수 있다
- fixture는 재사용가능하다
- 테스트/fixture는 한번에 하나 이상의 fixture를 호출할 수 있다
- fixture는 한 테스트에서 여러 번 요청될 수 있다 (return 값은 캐시됨)
- 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) 함수를 넣을 수 있고, 이 함수는 유효한 범위를 나타내는 문자열을 반환해야 함
다.