pytest에서 conftest.py 파일의 용도는 무엇입니까?


217

나는 최근에 발견했다 pytest. 좋아 보인다. 그러나 문서가 더 나을 수 있다고 생각합니다.

어떤 conftest.py파일을 사용 해야하는지 이해하려고합니다 .

내 (현재 작은) 테스트 스위트 conftest.py에는 프로젝트 루트에 하나의 파일이 있습니다. 테스트에 주입하는 조명기를 정의하는 데 사용합니다.

두 가지 질문이 있습니다.

  1. 이것이 올바르게 사용 conftest.py됩니까? 다른 용도가 있습니까?
  2. 둘 이상의 conftest.py파일을 가질 수 있습니까 ? 언제하고 싶습니까? 예가 이해 될 것이다.

더 일반적으로, conftest.pypy.test 테스트 스위트에서 파일 의 목적과 올바른 사용을 어떻게 정의 하시겠습니까?


9
당신은 저를It seems great. However, I feel the documentation could be better.
user9074332

7
예, 문서가 훨씬 나을 수 있습니다. 전체 pytest 문서를 검색 했으며이 conftest.py작업을 수행하거나 conftest 파일로 해당 작업을 수행하는 것에 대한 많은 참조가 있지만 pytest가 검색을 테스트 할 때 모든 conftest.py 파일 있음을 나타내는 문서는 어디에도 없습니다 . 테스트 발견이 수행되는 디렉토리 구조) 는 테스트 수집 단계 동안 (테스트가 실행되기 전에) 실행됩니다. 실험을 통해 저를 알아 내야했습니다.
Daniel Goldfarb

답변:


289

이것이 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.


조명기 설정이에서 완료 되기 전에 첫 번째 단위 테스트 모듈 test_aaaaa.py이 실제로 실행을 시도 하는 상황이 발생 했습니다 . 왜 이런 일이 발생할 수 있는지에 대한 생각이 있습니까? conftest.py
user9074332

conftest.py가 없으면 테스트 루트 경로가 sys.path에 추가되지 않고 "ModuleNotFoundError : No module named 'foobar'"와 같은 오류가 표시됩니다.
스위니

11

넓은 의미에서 conftest.py는 로컬 디렉토리 별 플러그인입니다. 여기에서 디렉토리 별 후크 및 고정구를 정의합니다. 제 경우에는 프로젝트 특정 테스트 디렉토리가 들어있는 루트 디렉토리가 있습니다. 일반적인 마술은 'root'conftest.py에 있습니다. 특정 프로젝트-자체 프로젝트. 널리 사용되지 않는 한 conftest.py에 픽스처를 저장하는 데 나쁜 것을 볼 수 없습니다 (이 경우 테스트 파일에서 직접 정의하는 것을 선호합니다)


10

나는 conftest.py 파일을 사용하여 테스트에 주입하는 조명기를 정의합니다. 이것이 올바른 사용 conftest.py입니까?

, 고정구는 일반적으로 여러 테스트를 위해 데이터를 준비하는 데 사용됩니다.

다른 용도가 있습니까?

, 조명기는 다음에 의해 실행되는 함수입니다.pytest 실제 테스트 함수 이전에 그리고 때로는 테스트 함수에 함수입니다. 조명기의 코드는 원하는대로 할 수 있습니다. 예를 들어, 픽스처를 사용하여 테스트를 수행 할 데이터 세트를 가져 오거나 픽스처를 사용하여 테스트를 실행하기 전에 시스템을 알려진 상태로 만들 수 있습니다.

둘 이상의 conftest.py파일을 가질 수 있습니까 ? 언제하고 싶습니까?

첫째, 조명기를 개별 테스트 파일에 넣을 수 있습니다. 그러나 여러 테스트 파일간에 조명기를 공유하려면conftest.py 모든 테스트의 중앙 위치에 파일 . 고정구는 모든 테스트에서 공유 할 수 있습니다. 고정물을 해당 파일의 테스트에서만 사용하려는 경우 개별 테스트 파일에 넣을 수 있습니다.

둘째, , 다른 수 있습니다 conftest.py상단 테스트 디렉토리의 하위 디렉토리에있는 파일을. 그렇게하면,이 하위 레벨에 정의 된 조명기conftest.py 파일에 를 해당 디렉토리 및 서브 디렉토리에서 테스트 할 수 있습니다.

마지막으로, conftest.py테스트 루트에서 파일에 조명기를 배치하면 모든 테스트 파일에서 조명기를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.