주의: 모든 상황에 부합하지 않을 수 있습니다! 그렇기에 이 방식이 최선이 아니라는 것과 스스로가 증명해봐야 한다는 점 잊지 말아주세요😁
상황설명
저는 2가지 테스트를 진행하고 있었어요. unittest
와 pytest
를 서로 사용해보고 어떤 차이가 있나 확인하는 작업이었어요.
vscode
에서 unittest
는 import package에 대한 예외가 발생하지 않았어요.pytest
를 사용할 때는, 다른 상위 패키지에 연결된 모듈을 읽어드리지 못했어요vscode
의 (왼쪽탭인)testing
에 {pytest}.py
파일이 열리지 않았습니다{pytest.py}
을 run 시키면, 다음과 같은 예외를 던지더라구요 No module named 'cleancode'
File "/Users/ty/sources/python/python-practice/app/sample_test/test_merge_req_pytest.py", line 1, in <module>
from cleancode.unittest import MergeRequestStatus, MergeRequestException, MergeRequest
원인 설명
사실, pytest의 문제라기 보다는, 해당 source파일에서 인터프리터를 통해 run시키면, 해당 source파일의 위치가 base path로 잡히기 때문에, 어떠한 설정도 없으면, 상대 경로로 패키지를 import하는 것이 가장 문제가 없습니다. 다만, 다들 그러하듯이 한가지 방식으로 정해서 가져오고 싶고 그것이 절대주소 방식이기를 원하실 거에요(제가 그러해서..🤣)
잠깐! 여기서 vscode > testing에 file이 안 떠있던 원인은 pytest 설정의 문제보다는 python의 base path 문제였다라는 것을 다시 말씀드립니다.
이 페이지에서 설명하는 해결 방법
2가지 설명을 하려고합니다. 첫 째는, pytest
를 돌리기 위한 .vscode
> settings.json
설정하는 법과 둘 째는, python base path를 .env
와 setting.json
에 설정하는 방법을 설명하려고 합니다.
python base path를 .env file로 설정하는 방법
PYTHONPATH=./
{
"python.envFile": "${workspaceFolder}/.env",
}
pytest 간단하게 설정해보죠
다른 블로그들을 확인해보시면, 기본 pytest 설정 및 활용방법은 잘 나와있어요. 저는 vscode에서 pytest를 다른 상위 패키지의 모듈을 불러서 사용할 수 있도록 해드리고 싶은 거라는 점 다시 상기해드리고 싶습니다.
pip install pytest
.vscode
> setting.json
에 pytest
설정 {
"python.defaultInterpreterPath": "../env/bin/python",
"python.testing.pytestPath": "../env/bin/pytest",
"python.testing.autoTestDiscoverOnSaveEnabled": true,
"python.testing.pytestEnabled": true,
"python.testing.unittestArgs": [
"-v",
"-s",
"./sample_test",
"-p",
"*test*.py"
],
"python.testing.unittestEnabled": false,
"python.testing.nosetestsEnabled": false,
}
위 설정까지 잘 해주시면, 다음과 같이 vscode
의 testing
탭에 테스트 소스파일이 자동으로 읽히는 것을 보실 수 있어요
다른 package의 module를 불러온 것도 확인해보죠!
from cleancode.unittest import MergeRequestStatus, MergeRequestException, MergeRequest
import pytest
def test_simple_rejected():
merge_request = MergeRequest()
merge_request.downvote('maintainer')
assert merge_request.status == MergeRequestStatus.REJECTED
cleancode.unittest
부분이 base path
문제를 해결 안하시면, module name을 찾을 수 없다는 에러가 발생합니다.