이것이 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
.
It seems great. However, I feel the documentation could be better.