나는 최근에 발견했다 pytest
. 좋아 보인다. 그러나 문서가 더 나을 수 있다고 생각합니다.
어떤 conftest.py
파일을 사용 해야하는지 이해하려고합니다 .
내 (현재 작은) 테스트 스위트 conftest.py
에는 프로젝트 루트에 하나의 파일이 있습니다. 테스트에 주입하는 조명기를 정의하는 데 사용합니다.
두 가지 질문이 있습니다.
- 이것이 올바르게 사용
conftest.py
됩니까? 다른 용도가 있습니까? - 둘 이상의
conftest.py
파일을 가질 수 있습니까 ? 언제하고 싶습니까? 예가 이해 될 것이다.
더 일반적으로, conftest.py
py.test 테스트 스위트에서 파일 의 목적과 올바른 사용을 어떻게 정의 하시겠습니까?
답변
이것이 conftest.py의 올바른 사용입니까?
그렇습니다. 비품은의 잠재적이고 일반적인 용도입니다 conftest.py
. 정의 할 고정구는 테스트 스위트의 모든 테스트에서 공유됩니다. 그러나 루트에 고정구를 정의하는 conftest.py
것은 쓸모 없을 수 있으며, 그러한 고정구가 모든 테스트에 사용되지 않으면 테스트 속도가 느려질 수 있습니다.
다른 용도가 있습니까?
그렇습니다.
-
Fixtures : 테스트에 사용되는 정적 데이터에 대한 조명기를 정의합니다. 달리 지정하지 않는 한이 데이터는 제품군의 모든 테스트에서 액세스 할 수 있습니다. 이것은 데이터뿐만 아니라 모든 테스트에 전달 될 모듈의 도우미 일 수 있습니다.
-
외부 플러그인로드 :
conftest.py
외부 플러그인 또는 모듈을 가져 오는 데 사용됩니다. 다음 전역 변수를 정의하여 pytest는 모듈을로드하고 테스트에 사용할 수있게합니다. 플러그인은 일반적으로 프로젝트 또는 테스트에 필요할 수있는 다른 모듈에 정의 된 파일입니다. 여기에 설명 된대로 사전 정의 된 플러그인 세트를로드 할 수도 있습니다 .pytest_plugins = "someapp.someplugin"
-
후크 : 테스트 및 테스트 방법 등의 후크를 지정하여 테스트를 향상시킬 수 있습니다. 사용 가능한 후크 세트는 여기를 참조하십시오 . 예:
def pytest_runtest_setup(item): """ called before ``pytest_runtest_call(item). """ #do some stuff`
-
루트 경로 테스트 : 이것은 약간의 숨겨진 기능입니다.
conftest.py
루트 경로에 정의 하면pytest
을 지정하지 않고 응용 프로그램 모듈을 인식 하게됩니다PYTHONPATH
. 백그라운드에서 py.test는sys.path
루트 경로에서 찾은 모든 하위 모듈을 포함하여 사용자 를 수정합니다 .
conftest.py 파일을 두 개 이상 가질 수 있습니까?
테스트 구조가 다소 복잡한 경우 가능합니다. conftest.py
파일에는 디렉토리 범위가 있습니다. 따라서 목표 한 조명기 및 도우미를 만드는 것이 좋습니다.
언제하고 싶습니까? 예가 이해 될 것이다.
여러 경우에 적합 할 수 있습니다.
특정 테스트 그룹에 대한 도구 또는 후크 세트 작성
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
test root/mod2/test.py will NOT produce "I am mod"
일부 테스트 에는 고정물 세트를로드 하지만 다른 테스트 에는 고정 하지 않습니다.
root / mod / conftest.py
@pytest.fixture()
def fixture():
return "some stuff"
root / mod2 / conftest.py
@pytest.fixture()
def fixture():
return "some other stuff"
root / mod2 / test.py
def test(fixture):
print(fixture)
“다른 것들”을 인쇄합니다.
루트에서 상속 된 후크를 재정의 합니다 conftest.py
.
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
root / conftest.py
def pytest_runtest_setup(item):
print("I am root")
#do some stuff
내부에서 테스트를 실행하여 root/mod
“I am mod”만 인쇄됩니다.
자세한 내용은 conftest.py
여기를 참조 하십시오 .
편집하다:
다른 모듈의 여러 테스트에서 일반 도우미 함수를 호출해야하는 경우 어떻게해야합니까? conftest.py에 넣으면 사용할 수 있습니까? 아니면 단순히 helpers.py 모듈에 넣고 테스트 모듈에서 가져와 사용해야합니까?
conftest.py
헬퍼를 정의 하는 데 사용할 수 있습니다 . 그러나 일반적인 관행을 따라야합니다. 도우미는 적어도에 조명기로 사용할 수 있습니다 pytest
. 예를 들어 내 테스트에는 테스트에 이런 식으로 주입하는 모의 redis 도우미가 있습니다.
루트 / 도우미 /redis/redis.py
@pytest.fixture
def mock_redis():
return MockRedis()
루트 / 테스트 /stuff/conftest.py
pytest_plugin="helper.redis.redis"
root / tests / stuff / test.py
def test(mock_redis):
print(mock_redis.get('stuff'))
이것은 테스트에서 자유롭게 가져올 수있는 테스트 모듈입니다. 참고 잠재적으로 이름을 수 redis.py
같은 conftest.py
모듈이 있다면 redis
더 많은 테스트가 포함되어 있습니다. 그러나 모호함으로 인해 그러한 관행은 권장되지 않습니다.
을 사용하려면 conftest.py
해당 도우미를 루트에 넣고 conftest.py
필요할 때 주입하면됩니다.
루트 / 테스트 /conftest.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / tests / stuff / test.py
def test(mock_redis):
print(mock_redis.get(stuff))
설치 가능한 플러그인을 작성하는 것도 가능합니다. 이 경우 도우미를 어디에서나 쓸 수 있지만 잠재적 인 테스트 프레임 워크에 설치할 진입 점을 정의해야합니다. 참조 이 .
비품을 사용하고 싶지 않다면 물론 간단한 도우미를 정의하고 필요할 때마다 일반 오래된 가져 오기를 사용할 수 있습니다.
루트 / 테스트 / 도우미 /redis.py
class MockRedis():
# stuff
root / tests / stuff / test.py
from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
그러나 여기서 모듈이 테스트의 하위 폴더에 없기 때문에 경로에 문제가있을 수 있습니다. __init__.py
도우미 에를 추가하여 (테스트되지 않음)을 극복 할 수 있어야합니다
root / tests / helper / __ init__.py
from .redis import MockRedis
또는 단순히 도우미 모듈을에 추가하십시오 PYTHONPATH
.
답변
넓은 의미에서 conftest.py는 로컬 디렉토리 별 플러그인입니다. 여기에서 디렉토리 별 후크 및 고정구를 정의합니다. 제 경우에는 프로젝트 특정 테스트 디렉토리가 들어있는 루트 디렉토리가 있습니다. 일반적인 마술은 ‘root’conftest.py에 있습니다. 특정 프로젝트-자체 프로젝트. 널리 사용되지 않는 한 conftest.py에 픽스처를 저장하는 데 나쁜 것을 볼 수 없습니다 (이 경우 테스트 파일에서 직접 정의하는 것을 선호합니다)
답변
나는
conftest.py
파일을 사용하여 테스트에 주입하는 조명기를 정의합니다. 이것이 올바른 사용conftest.py
입니까?
예 , 고정구는 일반적으로 여러 테스트를 위해 데이터를 준비하는 데 사용됩니다.
다른 용도가 있습니까?
예 , 조명기는 다음에 의해 실행되는 함수입니다.pytest
실제 테스트 함수 이전에 그리고 때로는 테스트 함수에 함수입니다. 조명기의 코드는 원하는대로 할 수 있습니다. 예를 들어, 픽스처를 사용하여 테스트를 수행 할 데이터 세트를 가져 오거나 픽스처를 사용하여 테스트를 실행하기 전에 시스템을 알려진 상태로 만들 수 있습니다.
둘 이상의
conftest.py
파일을 가질 수 있습니까 ? 언제하고 싶습니까?
첫째, 조명기를 개별 테스트 파일에 넣을 수 있습니다. 그러나 여러 테스트 파일간에 조명기를 공유하려면conftest.py
모든 테스트의 중앙 위치에 파일 . 고정구는 모든 테스트에서 공유 할 수 있습니다. 고정물을 해당 파일의 테스트에서만 사용하려는 경우 개별 테스트 파일에 넣을 수 있습니다.
둘째, 네 , 다른 수 있습니다 conftest.py
상단 테스트 디렉토리의 하위 디렉토리에있는 파일을. 그렇게하면,이 하위 레벨에 정의 된 조명기conftest.py
파일에 를 해당 디렉토리 및 서브 디렉토리에서 테스트 할 수 있습니다.
마지막으로, conftest.py
테스트 루트에서 파일에 조명기를 배치하면 모든 테스트 파일에서 조명기를 사용할 수 있습니다.