메뉴 닫기

파이썬 Selenium pytest 픽스처로 드라이버 생성과 종료 로그 스크린샷 자동화

파이썬 Selenium pytest 픽스처로 드라이버 생성과 종료 로그 스크린샷 자동화

🚀 테스트 자동화를 더 효율적으로 만드는 Selenium과 pytest 활용법을 알아보세요

테스트 자동화를 진행하다 보면 브라우저 드라이버를 매번 실행하고 종료하는 과정이 반복적으로 느껴질 때가 있습니다.
게다가 에러가 발생했을 때 로그와 스크린샷을 남기는 것은 디버깅에 큰 도움이 되지만, 이를 수동으로 관리하기는 꽤 번거로운 일입니다.
이런 상황에서 pytest 픽스처(fixture)를 사용하면 테스트 환경을 깔끔하게 관리할 수 있고, Selenium WebDriver를 안정적으로 실행 및 종료할 수 있습니다.
또한 실패한 테스트 케이스에서 로그와 스크린샷을 자동으로 남길 수 있어 실무에서도 유용하게 활용됩니다.

이번 글에서는 Python Selenium을 기반으로 pytest 픽스처를 활용해 브라우저 드라이버 생성과 종료를 자동화하고, 테스트 실패 시 로그와 스크린샷을 저장하는 방법을 구체적인 예제 코드와 함께 살펴봅니다.
자동화 테스트를 준비하는 개발자나 QA 담당자뿐 아니라, 파이썬을 학습하면서 실무에 적용할 수 있는 실전 예제를 찾는 분들에게도 큰 도움이 될 것입니다.



⚙️ Selenium과 pytest의 관계

파이썬에서 웹 자동화를 구현할 때 가장 많이 사용되는 도구가 Selenium입니다.
Selenium은 실제 브라우저를 제어할 수 있어 크롬, 파이어폭스, 엣지 등 다양한 환경에서 테스트를 실행할 수 있습니다.
하지만 단순히 브라우저를 켜고 끄는 것만으로는 충분하지 않으며, 테스트 케이스를 체계적으로 관리하려면 테스트 프레임워크와의 결합이 필요합니다.

이때 pytest가 중요한 역할을 합니다.
pytest는 파이썬 진영에서 널리 사용되는 테스트 프레임워크로, 단순한 단위 테스트부터 복잡한 통합 테스트까지 폭넓게 지원합니다.
특히, 픽스처(fixture)라는 강력한 기능을 제공하여 테스트 전후에 반복적으로 실행되는 설정과 정리 과정을 자동화할 수 있습니다.
이 덕분에 Selenium WebDriver를 매번 새로 생성하고 종료하는 수고를 덜 수 있으며, 테스트 실행 흐름을 훨씬 간결하게 만들 수 있습니다.

🔗 왜 pytest와 함께 써야 할까?

Selenium만으로도 웹 자동화는 가능하지만, 테스트가 늘어나면 관리가 어려워집니다.
예를 들어, 수십 개의 테스트 케이스마다 드라이버 실행 코드와 종료 코드를 반복해서 작성하면 유지보수가 복잡해집니다.
pytest는 이런 문제를 해결할 수 있도록 공통된 설정을 픽스처로 모듈화하여 중복 제거재사용성 극대화를 지원합니다.

💬 즉, Selenium이 ‘자동화 실행 도구’라면 pytest는 ‘자동화 관리 도구’ 역할을 맡아 전체적인 테스트 환경을 더 안정적이고 효율적으로 만들어 줍니다.

📌 pytest와 Selenium의 결합 장점

  • 🛠️드라이버 실행과 종료를 자동화할 수 있음
  • 테스트 실패 시 로그와 스크린샷을 자동 저장 가능
  • 📂테스트 코드의 중복 제거 및 구조화된 관리 가능
  • 🚀CI/CD 파이프라인과 연동 시 효율적인 자동화 환경 제공

이처럼 pytest와 Selenium의 조합은 단순히 테스트를 실행하는 것을 넘어, 테스트를 관리하고 분석하며 확장하는 기반을 마련해 줍니다.
따라서 실무에서 자동화 테스트를 도입할 때 가장 많이 선택되는 조합이라고 할 수 있습니다.

🛠️ pytest 픽스처로 드라이버 생성과 종료 관리

자동화 테스트에서 가장 기본적이면서도 반복적으로 수행되는 작업이 바로 웹드라이버 생성과 종료입니다.
하지만 각 테스트마다 이를 수동으로 작성하면 코드 중복이 심해지고, 관리가 어려워집니다.
이 문제를 해결하는 대표적인 방법이 바로 pytest의 픽스처(fixture)입니다.

픽스처는 테스트 실행 전 필요한 자원을 초기화하고, 테스트 종료 후 정리(cleanup) 작업까지 처리할 수 있는 강력한 기능을 제공합니다.
예를 들어, Selenium 드라이버를 실행하는 코드를 픽스처로 작성하면, 각 테스트 함수는 이 픽스처를 불러오기만 하면 됩니다.
또한 테스트가 끝난 뒤 자동으로 브라우저가 닫히도록 설정할 수도 있어 매우 유용합니다.

💻 드라이버 관리용 픽스처 예제 코드

CODE BLOCK
import pytest
from selenium import webdriver

@pytest.fixture
def driver():
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")  # UI 없는 모드 실행
    driver = webdriver.Chrome(options=options)
    yield driver
    driver.quit()  # 테스트 종료 후 브라우저 닫기

위 예제에서 yield 키워드는 중요한 역할을 합니다.
pytest는 yield 이전 코드를 테스트 실행 전 초기화 단계로, yield 이후 코드를 테스트 종료 후 정리 단계로 인식합니다.
따라서 드라이버 실행은 yield 이전에서 처리하고, 종료는 yield 이후에서 처리할 수 있습니다.

📌 테스트 함수에서 픽스처 사용하기

CODE BLOCK
def test_google_search(driver):
    driver.get("https://www.google.com")
    assert "Google" in driver.title

테스트 함수에서는 인자로 driver를 받아오기만 하면 됩니다.
pytest가 자동으로 픽스처를 호출하여 드라이버를 생성해 주고, 테스트 종료 후에는 브라우저를 닫아 줍니다.
즉, 코드의 간결함과 유지보수성을 동시에 확보할 수 있는 셈입니다.

💡 TIP: 여러 개의 테스트에서 공통으로 사용할 수 있는 픽스처를 conftest.py 파일에 모아 두면 프로젝트 전반에서 쉽게 재사용할 수 있습니다.



📸 실패 테스트에서 스크린샷 자동 저장하기

테스트 자동화 과정에서 가장 자주 겪는 문제는 실패 원인을 파악하는 일입니다.
로그만으로는 화면 상태를 정확히 알기 어려운 경우가 많기 때문에, 스크린샷 저장 기능은 매우 유용합니다.
pytest와 Selenium을 함께 사용하면 실패한 시점의 브라우저 화면을 캡처하여 저장하는 기능을 쉽게 구현할 수 있습니다.

pytest는 hook 함수를 제공하여 테스트 결과에 따라 추가 작업을 수행할 수 있도록 지원합니다.
이를 활용하면 테스트가 실패했을 때 자동으로 스크린샷을 저장하도록 만들 수 있습니다.
특히 CI/CD 환경에서 자동화된 테스트를 실행할 때, 개발자가 직접 브라우저를 확인할 수 없으므로 이러한 기능은 필수적입니다.

🖼️ pytest hook을 이용한 스크린샷 저장

CODE BLOCK
import pytest

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    result = outcome.get_result()
    if result.when == "call" and result.failed:
        driver = item.funcargs.get("driver")
        if driver:
            driver.save_screenshot(f"screenshots/{item.name}.png")

위 코드에서는 테스트가 실패할 경우 driver.save_screenshot() 메서드를 사용하여 현재 화면을 PNG 파일로 저장합니다.
파일명은 테스트 함수 이름과 동일하게 지정하면 어떤 테스트에서 실패했는지 추적하기 쉽습니다.

📌 스크린샷 자동 저장 시 유의할 점

⚠️ 주의: 스크린샷 파일이 누적되면 용량이 급격히 커질 수 있습니다. 따라서 정기적으로 관리하거나 실패 케이스에서만 저장하도록 제한하는 것이 좋습니다.

  • 📂스크린샷 저장 디렉토리를 별도로 지정하는 것이 관리에 유리합니다.
  • 🕒파일명에 타임스탬프를 포함하면 동일한 테스트의 여러 실행 결과를 비교할 수 있습니다.
  • 🔍실패한 시점의 UI 요소 상태를 시각적으로 확인할 수 있어 디버깅 효율성이 높아집니다.

이처럼 pytest hook을 활용한 스크린샷 자동 저장 기능은 단순한 테스트 실패 로그 이상의 가치를 제공합니다.
실패 원인 분석 시간을 줄여주고, 협업 환경에서도 유용한 증거 자료로 활용할 수 있습니다.

📝 로그 수집 및 디버깅 활용

테스트 자동화에서 실패 원인을 빠르게 파악하려면 로그 수집이 필수적입니다.
스크린샷이 시각적인 단서를 제공한다면, 로그는 동작 과정의 세부 정보를 기록해줍니다.
Selenium은 브라우저 콘솔 로그, 네트워크 로그 등을 수집할 수 있으며, pytest의 hook과 결합하면 실패한 테스트의 상세 기록을 남길 수 있습니다.

예를 들어, Chrome 드라이버 옵션을 통해 performance log를 활성화하면 API 요청과 응답을 추적할 수 있습니다.
또한 pytest의 pytest_runtest_logreport 같은 hook을 이용하면, 테스트 실패 시점의 로그를 자동으로 별도 파일로 저장할 수 있습니다.

📂 브라우저 로그 수집 예제

CODE BLOCK
from selenium import webdriver

options = webdriver.ChromeOptions()
options.set_capability("goog:loggingPrefs", {"browser": "ALL", "performance": "ALL"})
driver = webdriver.Chrome(options=options)

# 콘솔 로그 출력
for entry in driver.get_log("browser"):
    print(entry)

이 코드를 통해 브라우저의 콘솔 로그를 수집할 수 있습니다.
예를 들어, JavaScript 오류가 발생했는지, 네트워크 요청이 실패했는지 등을 직접 확인할 수 있어 디버깅 효율성을 높여줍니다.

📌 로그 관리 시 고려할 점

  • 📜로그를 파일로 저장하면 실패한 테스트의 기록을 보존할 수 있습니다.
  • 🔎로그와 스크린샷을 함께 활용하면 문제 원인을 더 빠르게 파악할 수 있습니다.
  • 필요 없는 로그까지 모두 저장하면 분석 효율이 떨어지므로 필터링이 필요합니다.

💎 핵심 포인트:
스크린샷은 화면 상태를, 로그는 동작 기록을 보여주기 때문에 두 가지를 함께 수집해야 완전한 디버깅 환경을 구축할 수 있습니다.



💡 실무 적용 시 고려해야 할 팁

pytest와 Selenium을 활용한 자동화 테스트는 개발과 QA 과정에서 강력한 도구가 될 수 있습니다.
그러나 단순히 예제 코드를 실행하는 것만으로는 실무 환경에서 안정적인 테스트를 보장하기 어렵습니다.
프로젝트 규모와 팀의 협업 방식에 맞게 환경을 세밀하게 구성하는 것이 중요합니다.

특히 CI/CD 파이프라인에 통합할 경우, 테스트 실행 환경이 로컬과 다르기 때문에 드라이버 버전 관리, 로그 및 스크린샷 저장 경로, 테스트 실행 속도 최적화 등 여러 요소를 고려해야 합니다.
또한 테스트의 재현성을 보장하기 위해 데이터 초기화나 환경 세팅을 픽스처로 관리하는 것이 필수적입니다.

🔧 실무 적용을 위한 체크리스트

  • ⚙️드라이버 버전을 CI 서버 환경과 동일하게 맞추기
  • 📂로그와 스크린샷 저장 디렉토리를 자동 생성하도록 설정
  • 🚀헤드리스 모드를 적극 활용하여 실행 속도 최적화
  • 🔁불안정한 테스트를 줄이기 위해 리트라이 옵션 고려
  • 📊테스트 결과를 리포트 형태로 자동 생성

📌 CI/CD 파이프라인과의 통합

실무에서는 Jenkins, GitHub Actions, GitLab CI와 같은 CI/CD 도구와 pytest를 결합해 자동화 테스트를 실행합니다.
이 과정에서 실패한 테스트의 로그와 스크린샷을 아티팩트(artifact)로 보존하면, 배포 전 테스트 검증 단계에서 매우 유용하게 활용할 수 있습니다.

💡 TIP: CI 환경에서 Selenium을 구동할 때는 Docker를 활용하면 브라우저와 드라이버 호환성 문제를 줄일 수 있습니다.

즉, pytest 픽스처와 Selenium을 단순히 코드 레벨에서 사용하는 것을 넘어서, 팀의 워크플로우 전반에 녹여내는 전략이 필요합니다.
이러한 접근이 테스트 자동화를 실무에서 진정으로 가치 있게 만드는 핵심 포인트입니다.

자주 묻는 질문 (FAQ)

pytest 픽스처는 꼭 써야 하나요?
필수는 아니지만, 반복적인 드라이버 실행과 종료 코드를 줄여주기 때문에 유지보수와 확장성 측면에서 큰 이점을 제공합니다.
스크린샷 저장은 모든 테스트에서 하는 게 좋을까요?
모든 테스트에서 저장하면 용량 관리가 어려워지므로, 실패한 케이스에서만 스크린샷을 저장하는 것이 가장 효율적입니다.
로그는 어떤 정보를 수집하는 게 좋을까요?
브라우저 콘솔 로그, 네트워크 요청/응답, Selenium 동작 로그를 함께 수집하면 실패 원인 파악이 훨씬 쉬워집니다.
헤드리스 모드는 언제 사용하는 게 좋나요?
CI/CD 환경이나 빠른 실행이 필요한 경우 유용합니다. 다만, 일부 UI 관련 테스트에서는 실제 브라우저 모드가 더 안정적일 수 있습니다.
pytest 픽스처는 여러 개 만들 수 있나요?
네, 가능합니다. 예를 들어 로그인 세션 픽스처, 데이터 초기화 픽스처 등 다양한 시나리오에 맞게 여러 개를 정의할 수 있습니다.
실패한 테스트만 다시 실행할 수 있나요?
pytest 플러그인 중 pytest-rerunfailures 등을 활용하면 실패한 테스트만 재실행할 수 있습니다.
스크린샷과 로그를 CI에서 어떻게 확인하나요?
Jenkins, GitHub Actions 등 CI 도구에서 아티팩트로 저장해 두면, 실행 후 다운로드하여 분석할 수 있습니다.
pytest와 unittest의 가장 큰 차이점은 뭔가요?
unittest는 전통적인 클래스 기반 구조를 따르지만, pytest는 간결한 함수 기반 문법과 픽스처, 다양한 플러그인을 지원해 생산성이 높습니다.

🚀 pytest 픽스처와 Selenium 자동화 활용 정리

이번 글에서는 파이썬 Selenium을 pytest와 함께 사용하는 방법을 살펴봤습니다.
픽스처를 활용해 드라이버 생성과 종료를 자동화하고, 테스트 실패 시 로그와 스크린샷을 자동 저장하는 기법까지 확인했습니다.
또한 브라우저 로그 수집과 CI/CD 환경에서의 적용 팁도 함께 다뤄 실무에서도 곧바로 적용할 수 있는 내용을 정리했습니다.

pytest의 픽스처는 반복적인 코드를 줄여주고, 테스트 환경을 체계적으로 관리할 수 있게 해줍니다.
여기에 Selenium의 브라우저 제어 기능을 결합하면 단순한 자동화를 넘어서 테스트 관리와 디버깅까지 아우르는 강력한 프레임워크가 완성됩니다.
즉, 안정적인 테스트 환경을 구축하고자 한다면 pytest와 Selenium의 조합은 사실상 필수라고 할 수 있습니다.

앞으로 자동화 테스트를 도입하거나 개선하려는 분들이라면, 본문에서 소개한 픽스처, hook, 로그 수집 기법을 프로젝트에 적극적으로 적용해 보시길 추천드립니다.
테스트 생산성이 향상될 뿐 아니라 협업 과정에서도 실패 원인을 빠르게 파악할 수 있어 전체 개발 속도를 끌어올릴 수 있을 것입니다.


🏷️ 관련 태그 : 파이썬자동화, Selenium, pytest, 픽스처, 테스트자동화, 브라우저테스트, QA자동화, 스크린샷저장, 로그분석, CI연동