pytest 혹은 테스팅을 할 때 fixture란게 어떤 개념이고 그에 대한 간략한 예시를 알아보기로 한다.
환경 및 선수조건
- Python
- Pytest가 무엇인지
- Django에 대한 기본 사용 및 이해
- Selenium
소개
pytest에 대한 공부를 하면서 계속 fixture
라는게 나오고 mocking
혹은 mock object
라는 것이 계속 나오다가 이해를 하지 못하였는데 이 기회에 정리하면서 이해를 해보고자 정리합니다.
살펴 볼 fixture
라는게 어떤 개념인지부터 시작해 현재 프로젝트에 적용해본 pytest fixture의 예시를 보도록 하겠습니다.
Fixture가 무엇인가요?
우선 fixture의 사전적 정의에 대해서 살펴보고 넘어가보도록 하겠습니다. 검색은 네이버에서의 결과입니다.
사전적인 의미로는 경기 혹은 고정 세간이라도 나와있지만… 아직은 무슨 의미인지 감이 안옵니다…(그게 정상) 그러면 Wikipedia에 한번 영어로 검색을 해보겠습니다.
검색을 해보니 첫번째에 Test fixture라는 부분이 있습니다. 의미는 “used to control and automate testing”으로 테스트를 자동화 하거나 조절하기위해 사용된다고 합니다.
링크를 들어가 보시면 아래와 같이 소프트웨어 섹션이 있습니다.
간략하게 요약을 하면 fixture란 테스팅을 하는데 있어서 필요한 부분들을 혹은 조건들을 미리 준비해놓은 리소스 혹은 코드들이라고 보면됩니다. DB가 필요해서 어떤 내용들을 테스트 할 때만 DB에 넣어서 확인을 한다던가 특정 파일을 테스팅 할 때 필요하다면 특정 파일들이 그 fixture라고 볼 수 있습니다.
pytest에서 fixture 사용하기
이제 fixture에 대해서 개념을 알았으니 실제로 간단한 코드를 보도록 하겠습니다. pytest를 통해서 테스팅을 할 때 특정 browser를 만들고 그 브라우저를 계속 사용하기위한 코드입니다. 즉 여기서는 browser가 fixture가 되겠죠?
homepage_test.py
@pytest.fixture(scope="module")
def browser():
# ...
# 브라우저를 받아오는 부분
# driver는 webDriver이다.
# ...
yield driver
driver.close()
def test_first_page_card_title(browser):
browser.get("http://localhost:8000")
assert '규카츠 먹을래?' in browser.page_source
browser함수에서 driver를 만들고 그 driver를 test_first_page_card_title이라는 함수가 사용을 합니다.
위에 @pytest.fixture(scope="module")
을 통해서 현재 py파일 안에서 계속 사용할 것임을 명시 하였기에 현재 py파일에서 실행이 되면 계속 driver를 사용 할 수 있게됩니다.
추가적으로 아래처럼 계속 browser를 사용해도 하나의 브라우저를 사용할 수 있으며 yield예약어가 있기 때문에 다 끝났을 때 browser의 driver.close()가 실행됩니다.
def test_1(browser):
browser.get("http://localhost:8000")
assert True
def test_2(browser):
browser.get("http://localhost:8000")
assert True
def test_f3(browser):
browser.get("http://localhost:8000")
assert True
다시 마지막으로 정리하면 fixture란 테스팅에서 쓰이는 값이나 리소스에 대한 부분으로 미리 준비해두는 준비 도구 및 재료입니다. 그 값은 어떤 객체가 될수도 있고 환경도 될수도 있고 DB가 될수도 있습니다.
다음에는 fixture 혹은 RunPython을 이용해서 pytest에서 테스팅 하기위한 DB를 어떻게 설정하는지를 확인해보는 코드를 만들어보겠습니다.