2013-01-11 7 views
1

코드의 기능 테스트에는 종종 예를 들어 외부 리소스가 필요합니다. 데이터베이스.단위 테스트의 일부로 데몬을 시작/중지하는 모범 사례 (pytest 사용)

은 기본적으로 두 가지 방법이 있습니다 : 자원 (예 : 데이터베이스) 항상 실행 항상 사용할 수 있습니다 가정

  • 시작/시험의 일부로서 관련 자원을 중지

Python의 "오래된"세계 unittest (2)에서 world setUp() 및 tearDown() 메서드는 을 사용하여 서비스를 제어 할 수 있습니다.

py.test를 사용하면 세계가 더욱 복잡해지고 setUp() 및 tearDown() 메서드의 개념이 조명기 구현을위한 funcarg 마법으로 대체되었습니다. 솔직히이 접근법은 깨졌습니다 - 적어도 setUp/tearDown 메소드를 대체합니다.

py.test가 사용되는 프로젝트에서 서비스 및 리소스를 제어하는 ​​데 권장되는 방법은 무엇입니까?

우리는 (적어도 필요한 경우) setUp/tearDown 메서드로 테스트를 계속 작성해야합니까? 아니면 더 좋은 패턴이 있어야합니까?

+1

당신은 왜 비품 접근법이 고장 났다고 생각합니까? 어떤 문제가 있습니까? – pfctdayelise

답변

1

pyTest는 xUnit 스타일 설정/해제 방법을 지원합니다 (http://pytest.org/latest/xunit_setup.html 참조). 따라서이 스타일을 선호한다면 그냥 사용할 수 있습니다.

http://pytest.org/latest/fixture.html을 사용하면 전체 테스트 실행을위한 외부 프로세스를 인스턴스화하고 연결 개체를 반환 할 수있는 "세션"범위의 조명기를 인스턴스화 할 수도 있습니다. 코드는 대략 다음과 같을 것이다 :

# content of conftest.py 

import pytest 

@pytest.fixture(scope="session") 
def connection(): 
    ... instantiate process ... 
    return connection_to_process_or_url 

및 테스트 파일은 다음과 같이 그것을 사용 : 당신은 테스트 실행 사이의 서비스를 유지하려면

# content of test_conn.py 
def test_conn_ok(connection): 
    ... work with connection ... 

하면, 당신은 저장 (일부 로직을 작성해야합니다 PID, 살아 있는지 확인, PID가 없거나 생존하지 않으면 새 프로세스를 시작하십시오.) 당분간은 (향후 릴리스에서 지원 코드가 포함될 수 있습니다.)

0

pytest에서이 작업을 수행하는 올바른 방법은 세션 범위의 조명기 인 것 같습니다 (hpk42 points out). 당신은 Fixture finalization/executing teardown code section of the documentation에 따라, 단일 통화로 yield 문을 간결하게 인라인 설치/해체를 사용할 수 있습니다

import smtplib 
import pytest 

@pytest.fixture(scope="module") 
def smtp(request): 
    smtp = smtplib.SMTP("smtp.gmail.com") 
    yield smtp # provide the fixture value 
    print("teardown smtp") 
    smtp.close() 

당신이 세션 범위를 사용할 수 있습니다이 경우 당신이 당 모듈을 실행하지 않은 경우.