Backend/pytest

[pytest] 테스트 코드에서 명령행 인자 전달하는 방법 (feat. argparse)

sangwonYoon 2023. 6. 15. 01:47

아래와 같이 argparse 모듈을 통해 명령행 인자를 입력받는 함수 main()이 있다.

# main.py
import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--name", default="sangwon")
    args = parser.parse_args()
    
    return args.name

if __name__ == "__main__":
    print(main())

 

main.py는 아래과 같이 실행할 수 있다.

>> python main.py --name YoonSangWon
YoonSangWon

 

그렇다면 테스트 코드에서 main 함수에 명령행 인자를 전달하기 위해서는 어떻게 해야 할까? monkeypatch fixture을 사용하면 된다.

monkeypatch는 pytest의 built-in fixture로, 임시적으로 클래스나 클래스의 메소드, 함수, 환경 변수 등의 객체를 조작할 수 있다.
더 자세한 사용법은 아래 링크에서 확인할 수 있다.

 

How to monkeypatch/mock modules and environments — pytest documentation

How to monkeypatch/mock modules and environments Sometimes tests need to invoke functionality which depends on global settings or which invokes code which cannot be easily tested such as network access. The monkeypatch fixture helps you to safely set/delet

docs.pytest.org

 

우리가 파이썬 스크립트로 명령행 인자를 전달하게 되면 sys.argv에 파이썬 스크립트의 이름과 명령행 인자가 담겨 전달된다. 따라서, 우리는 monkeypatch를 이용해 sys.argv 객체의 값을 조작하면 되는 것이다.

monkeypatch.setattr() 메소드를 사용하면 sys.argv 객체의 값을 조작할 수 있다.

# test_main.py
import sys

from main import main

def test_main(monkeypatch):
    # sys.argv[0]은 파이썬 스크립트의 이름이고, sys.argv[1:]부터 명령행 인자가 담긴다.
    monkeypatch.setattr("sys.argv", ["main.py", "--name", "YoonSangWon"])
    result = main()
    assert result == "YoonSangWon"

테스트 성공!

 

'Backend > pytest' 카테고리의 다른 글

[pytest] Fixture  (0) 2023.06.10
[pytest] 파이썬 테스팅을 위한 pytest 사용법  (0) 2023.06.09