2009-04-19 2 views
3

나는 장고에 경매 시스템을 작성했습니다. 단위 테스트를 작성하고 싶지만 신청서는 시간에 민감합니다 (예 : 광고주에게 부과되는 금액은 광고가 웹 사이트에서 얼마나 오래 활동했는지의 함수입니다). 이 유형의 응용 프로그램을 테스트하기위한 좋은 접근 방법은 무엇입니까?Python에서 시간에 민감한 응용 프로그램 테스트

가능한 해결책은 다음과 같습니다. DateFactory class 테스트에서 예측 가능한 날짜와 생산의 실시간 값을 생성하는 몇 가지 방법을 제공합니다. 이 접근법에 대해 의견이 있으십니까? 아니면 실제로 다른 것을 시도해 보셨습니까?

답변

3

제공된 링크에서 저자는 단위 테스트를 위해 메서드에 매개 변수를 추가하는 아이디어를 다소 거부하지만 경우에 따라 비즈니스 논리를 확장 한 것으로 정당화 할 수 있다고 생각합니다. 필자의 견해로는 모델을 좀 더 융통성 있고 표현력이 풍부한 컨트롤의 반전 형태로 만들 수 있습니다. 예를 들면 다음과 같습니다.

def is_expired(self, check_date=None): 
    _check_date = check_date or datetime.utcnow() 
    return self.create_date + timedelta(days=15) < _check_date 

본질적으로 이것은 논리 테스트를 위해 자체 테스트를 통해 자체 날짜/시간을 제공 할 수 있습니다.

참조 된 블로그의 인수는 API를 망칠 것으로 보입니다. 그러나 번 생산 대체 사례가있는 현재 날짜/시간을 대체하는 사용 사례가 발생했습니다. 즉, 제어 방식의 반전이 결국에는 내 응용 프로그램의 필수 부분이되었습니다.

1

일반적으로 프로덕션 코드는 날짜 객체를 입력으로 사용합니다 (여기서 의미는 허용됩니다). 많은 테스트 상황에서 설명하는 DateFactory는 사람들이하는 일입니다.

파이썬에서는 정적 모듈 메서드 인 Datetime.now 또는 Time.now를 직접 변경할 수도 있습니다. 테스트의 분해 (teardown) 부분에서 그들을 대체하기 위해 여기서주의해야합니다. 이는 테스트중인 클래스를 변경할 수 없거나 (또는 ​​변경하기가 어색한) 특히 유용합니다.

는 설정 방법이 실패 조금 possiblity가있는 경우 나는 마지막으로 대체 할 당신이

def setUp(self) 
     self.oldNow = Datetime.now 
     Datetime.now = self._fakenow 
     ... 

    def tearDown(self) 
     Datetime.now = self.oldNow 

이이 작업을 수행합니다.

특히 많은 경우 tearDown 부분을 잊어 버리는 사람들에 대해 걱정해야 할 경우 사용자 정의 DateFactory를 사용하는 것이 안전합니다.

관련 문제