Pytest Mark 기능

Sangyeon·2021년 3월 13일
0

Pytest

목록 보기
3/12
post-thumbnail

@pytest.mark.{마커명} 데커레이터를 통해 마커 기반으로 묶인 테스트를 실행할 수 있습니다.
참고 : https://docs.pytest.org/en/stable/mark.html

상황 예시

전체 테스트 파일을 전부 실행하기에는 시간이 부족하여, 꼭 확인해야하는 테스트케이스만 실행해 보려고 합니다.

실행 방법

1) pytest.ini 파일에 마커를 설정합니다.
예시로는 전체 테스트 중 꼭 실행해야할 테스트를 'mandatory'로 마커 설정 하였습니다.

[pytest]
markers = mandatory: mark tests that should be executed

2) 테스트 함수에 마커 표시 합니다.
예시에서는 test_1 함수는 꼭 실행해야 한다고 가정합니다.

@pytest.mark.mandatory
def test_1():
    assert True


def test_2():
    assert True


def test_3():
    assert False

3) $ pytest -m {마커명}으로 테스트를 실행합니다.
예시에서는 $ pytest -m mandatory로 실행하면, test_1 함수만 실행됩니다.

특정 케이스 skip 처리

테스트를 하다보면 특정 테스트케이스는 스킵해야할 때도 있습니다.
아래 예시와 같이 pytest.mark.skip()를 사용하면, 해당 테스트함수는 skip 하는 것으로 처리할 수 있습니다.

@pytest.mark.skip()
def test_example():
    assert 1 == 1

만약 테스트함수 내에서 특정 조건일 때 skip 처리 하고 싶다면, pytest.skip('스킵 메시지')를 사용하면 됩니다.

아래는 Web Driver를 이용하여 테스트를 진행할 시, element를 찾을 수 없는 경우, skip 처리하는 예시입니다. 테스트 예시는 Velog의 전체 글 수와 실제 게시글 element의 개수가 일치하는지로 설정해보았습니다.

def test_element():
    # 웹 드라이버 세팅은 생략합니다.
    url = "테스트할 velog url 주소"
    driver.get(url)

    try:
        article_num_text = driver.find_element_by_class_name('전체 게시글 개수 클래스명').get_attribute('textContent')
        article_num = int(re.search('[0-9]+', article_num_text).group())
        article_elements = driver.find_elements_by_css_selector('.subinfo')
        assert article_num == len(article_elements)
    except NoSuchElementException:
        pytest.skip('msg')

    driver.quit()

parametrize를 사용하여 element가 있는 경우와 없는 경우가 섞여있는 url들을 대상으로 테스트하는 경우에 유용합니다.

parametrize

@pytest.mark.parametrize 데커레이터를 통해 매개변수화된 테스트를 수행할 수 있습니다. fixture와 parametrize를 함께 사용하면 테스트 함수의 재사용성이 높아집니다.

예시

테스트 파일

import pytest

list = ['A', 'B', 'C']


@pytest.mark.parametrize('type', list)
def test_1(type):
    assert type == 'A'

위 코드를 실행하면, 매개변수 A, B, C로 test_1 함수를 총 3번 실행합니다.

테스트 결과는 아래와 같습니다.

test.py::test_1[A] PASSED
test.py::test_1[B] FAILED
test.py::test_1[C] FAILED

Reference

https://docs.pytest.org/en/stable/how-to/mark.html#mark

profile
I'm a constant learner.

0개의 댓글