[udemy] Real World Python Test Automation with Pytest 학습
강좌 정보 : https://www.udemy.com/course/pytest-course/
* 이 포스팅에서는 "[very academy] Pytest Mastery with Django"에 언급된 내용을 제외하고 처음으로 언급되는 방법들에 대해서만 기록을 한다.
- 참고 포스팅 : https://devspoon.tistory.com/82
chapter 2-2 markers
- pytest.mark.skipif() :
- 사용 방안 : 일반적으로 관련이 없거나 현재 환경에서 실행할 수 없기 때문에 테스트를 건너뛰거나 전혀 실행하지 않아야 함을 나타낼ㄸ skip을 사용하며 skpif는 특정 조건하에 스킵을 유도시킬 수 있다.
- 'skip'은 일반적으로 테스트를 실행할 수 없을 때 사용된다.
# 1번 방법
@pytest.mark.skipif(4 > 1, reason="Skipped becasuse 4>1")
def test_should_be_skipped_if() -> None:
assert 1==1
# 2번 방법
number = 4
@pytest.mark.skipif(number > 1, reason="Skipped becasuse 4>1")
def test_should_be_skipped_if() -> None:
assert 1==1
- pytest.mark.xfail
- 사용 방안 : xfail은 테스트가 실패하거나 오류가 발생할 것으로 예상되지만 테스트 중인 코드의 동작을 확인하기 위해 실행할 가치가 있음을 나타내는 데 사용된다.
- 'xfail'은 테스트가 실패하거나 예상대로 작동하지 않는 것으로 알려져 있지만 코드의 동작을 확인하기 위해 실행해야 할 때 사용된다.
@pytest.mark.xfail
def test_dont_care_if_fails() -> None:
assert 1==2
- custom marker : pytest.mark.{marker name} (ex: pytest.mark.slow)
- 그룹을 만들어 특정 조건하에 그룹들만 실행 시키고자 할때 사용할 수 있다.
- 이 방법을 사용하기 위해서 pytest.ini에 명시하거나 실행 명령어의 옵션에 명시해야 한다.
@pytest.mark.slow
def test_with_custom_mark1() -> None:
pass
chapter 2-3 Fixtures, Parametrize
- fixture로 파라미터 값 받기
@pytest.fixture
def company() -> Company:
return Company(name="Fiver", stock_symbol="SVRR")
def test_with_fixture(company: Company) -> None:
print(f"Printing {company} from fixture")
- pytest.mark.parametrize로 파라미터 값 받기
@pytest.mark.parametrize("company_name",["TikTok", "Instagram", "Twitch"],)
def test_parametrized(company_name) -> None:
print(f"\nTest with {company_name}")
- 예외처리를 이용한 파라미터 값 받기
def raise_covid19_esception() -> None:
raise ValueError("CoronaVirus Esception")
def test_raise_covid19_exception_should_pass() -> None:
with pytest.raises(ValueError) as e:
raise_covid19_esception()
assert "CoronaVirus Exception" == str(e.value)
- caplog를 사용한 logging 방법
- pytest에서 logging을 사용해 레벨에 따른 로깅 출력을 제어할 수 있다.
- 표준 pytest caplog 픽스처를 사용하여 로그 메시지를 캡처한 다음 로깅 수준을 포함하여 내용을 어설션할 수 있다.
- 실행시 -k "logged" 를 입력해준다. 여기서 logged는 log 테스트만 하기 위한, 함수 이름에 대한 패턴이다.
def test_example(caplog):
# Perform some action that generates log messages, e.g. calling a function
my_function()
# Assert that there is at least one warning-level log message
warning_messages = [msg for msg in caplog.record_tuples if msg[1] == logging.WARNING]
assert len(warning_messages) >= 1
# 예외처리를 로깅하는 방법
import logging
logger = logging.getLogger("CORONA_LOGS")
def function_that_logs_something() -> None:
try:
raise ValueError("CoronaVirus Exception")
except ValueError as e:
logger.warning(f"I am logging {str(e)}")
def test_logged_warning_level(caplog) -> None:
function_that_logs_something()
assert "I am logging CoronaVirus Exception" in caplog.text
# 기본 적인 로깅 방법
def test_logged_info_level(caplog) -> None:
with caplog.at_level(logging.INFO):
logger.info("I am logging info level")
assert "I am logging info level" in caplog.text
chapter 6-6 실행 방법
- 파일 단위 : pytest -v -s --durations=0 {file name}
- 상대경로 : pytest -v -s --durations=0 {path name}
- 키워드 : pytest -v -s --durations=0 -k "create"
- 특정 파일의 class 단위 : pytest -v -s --durations=0 -k {file name}::{class name}
- 특정 파일의 class의 특정 함수 : pytest -v -s --durations=0 -k {file name}::{class name}::{{function name}}
- 마커 : pytest -v -s --durations=0 -m xfail
chapter 6-8 pytest refactoring
- 챕터 제목은 의미가 없다. django 자체 testcode를 pytest로 전환하는 과정이다.
- pytestmark :
- pytest 모듈 또는 conftest 파일의 전역 수준에서 pytestmark를 정의하면 해당 모듈 또는 파일 내의 모든 테스트 기능을 지정된 pytest 마커로 표시하는 데 사용할 수 있습니다.
- 예를 들어 테스트 모듈 또는 conftest 파일의 맨 위에 pytestmark = pytest.mark.webtest를 정의하면 해당 모듈 또는 파일에 정의된 모든 테스트 함수가 webtest 마커로 표시됩니다. 이는 'webtest' 마커를 각각의 개별 테스트 기능에 적용할 필요가 없다는 것을 의미합니다. 모든 테스트 기능에 자동으로 적용되기 때문입니다.
- 이는 마커를 각 테스트 함수에 개별적으로 적용하는 수고를 덜기 때문에 모두 특정 마커를 적용해야 하는 많은 수의 테스트 함수가 있는 경우 유용할 수 있습니다. 또한 webtest 마커가 필요한 모든 테스트 기능이 자동으로 적용되므로 테스트 스위트의 일관성을 보장합니다.
chapter 17-1 Server Agnostic API Testing with requests library
- requests : https://requests.readthedocs.io/en/latest/
- 사용 방법
import requests
def test_zero_companies_django_agnostic() -> None:
response = requests.get(url="http://127.0.0.1:8000/companies"
assert response.status_code == 200
assert json.loads(response.content) == []
def test_create_company_with_layoffs_django_agnostic() -> None:
response = requests.post(
url="http://127.0.0.1:8000/companies",
json={"name": "test company name", "status": "Layoffs"},
)
assert response.status_code == 201
response_content = json.loads(response.content)
assert response_content.get("status") == "Layoffs"
cleanup_company(company_id=response_content["id"])
def cleanup_company(company_id: str) -> None:
response = requests.delete(url=f"http://127.0.0.1:8000/companies/{company_id}")
assert response.status_code == 204
chapter 17-3 Server Agnostic API Testing with requests library
- responses : https://github.com/getsentry/responses
- 사용 방법 :
import responses
@pytest.mark.crypto
@responses.activate
def test_mocked_dogecoin_api() -> None:
responses.add(
method=responses.GET,
url="https://api.cryptonator.com/api/ticker/doge-usd",
json={
"ticker": {
"base": "EDEN",
"target": "EDEN-USD",
"price": "0.04535907",
"volume": "4975940509.75870037",
"change": "-0.00052372",
},
"timestamp": 1612515303,
"success": True,
"error": "",
},
status=200,
)
assert process_crypto() == 29
chapter 18-1 Allure Report Tool
- 설치 : pip install allure-pytest
- 사용 목적 : html 기반의 보고서를 만들어 준다.
- 사용 방법 :
- Allure-Pytest-Official-Documentation : https://docs.qameta.io/allure/#_pytest
- Allure-Server-Install-CLI-Official-Documentation : https://docs.qameta.io/allure/#_installing_a_commandline
- Allure-Official-Documentation : https://docs.qameta.io/allure/
chapter 19-1 Cool Plugins For pytest
- 설치 : pip install pytest-sugar
- 사용 목적 : 터미널 상의 결과를 보기 쉽게 만들어 준다 (컬러 출력, 진행률 포시줄, 테스트 통계, 테스트 시간 등)
- 사용 방법 :
https://github.com/Teemu/pytest-sugar/
chapter 20-1 Python Mocking Theory
- 설치 : pip install pytest-mock
- 사용 목적 : 단위 테스트에서 모의 개체를 만들고 사용하는 방법을 제공하는 라이브러리
- 해당 항목은 추가 학습이 요구되기 때문에 다른 포스팅에서 다루기로 함
https://devspoon.tistory.com/86
reference :
https://www.notion.so/Step-9-Allure-Report-6e541b8277284547bf99c76741caec6d
https://velog.io/@tkjung/TDD-Pytest-Allure-Report-%ED%99%9C%EC%9A%A9
https://www.daleseo.com/python-unittest-mock/
https://www.daleseo.com/python-unittest-mock-patch/
https://code13.tistory.com/256
https://velog.io/@jinukix/UnitTest-Mocking-setUpData-vs-setUp
https://rumbarum.github.io/posts/pytest/pytest-mock/
https://libertegrace.tistory.com/entry/TDD-Python-Testing-Framework2-Pytest-Unittest-mocking
https://cocook.tistory.com/179
https://www.slideshare.net/genycho/pytest-240931546
'Django Web Framework > Django Pytest' 카테고리의 다른 글
Template와 json 통신을 위한 pytest 예시 코드 (0) | 2023.04.23 |
---|---|
Rest Framework를 위한 pytest 예시 코드 (0) | 2023.04.23 |
pytest-mock의 사용법 (0) | 2023.04.14 |
pytest 확장 라이브러리 정리 (0) | 2023.04.09 |
[very academy] Pytest Mastery with Django (0) | 2023.04.02 |
댓글