큰 장고 프로젝트에 효과적인 단위 테스트를 작성하는 데 어려움을 겪고 있습니다. 나는 상당히 좋은 테스트 범위를 가지고 있지만, 작성한 테스트는 전혀 단위 테스트가 아닌 통합 / 수락 테스트이며, 효과적으로 테스트되지 않는 응용 프로그램의 중요한 부분을 가지고 있음을 알게되었습니다. 이 문제를 최대한 빨리 해결하고 싶습니다.
여기 내 문제가 있습니다. 내 스키마는 깊이 관계가 있고 시간 지향적이므로 모델 객체에 높은 내부 커플 링과 많은 상태를 제공합니다. 많은 모델 메소드가 시간 간격을 기준으로 쿼리 auto_now_add
하며 타임 스탬프 가 지정된 필드에서 많은 작업을 수행했습니다 . 예를 들어 다음과 같은 방법을 사용하십시오.
def summary(self, startTime=None, endTime=None):
# ... logic to assign a proper start and end time
# if none was provided, probably using datetime.now()
objects = self.related_model_set.manager_method.filter(...)
return sum(object.key_method(startTime, endTime) for object in objects)
이런 식으로 테스트하는 방법은 무엇입니까?
내가 지금까지 여기 있습니다. 단위 테스트 목표 에 인수에 대한 조롱 된 행동 이 주어져야 하며 올바른 결과를 생성하기 위해 올바르게 필터링 / 집계되고 있습니까?by key_method
summary
datetime.now ()를 조롱하는 것은 간단하지만 나머지 동작을 어떻게 조롱 할 수 있습니까?
- 조명기를 사용할 수는 있지만 데이터를 구축하기 위해 조명기를 사용하는 장단점이 있다고 들었습니다.
- ORM을 통해 데이터를 설정할 수도 있지만 관련 개체도 만들어야하므로 제한적일 수 있습니다. ORM을 사용하면
auto_now_add
필드를 수동으로 엉망으로 만들 수 없습니다 . - ORM을 조롱하는 것은 또 다른 옵션이지만, 깊이 중첩 된 ORM 메소드를 조롱하는 것은 까다로울뿐만 아니라 ORM 코드의 로직은 테스트에서 조롱되며, 조롱은 테스트가 테스트의 내부 및 종속성에 실제로 의존하는 것으로 보입니다. 테스트 대상 기능.
가장 까다로운 너트는 이와 같은 기능으로, 몇 가지 모델 계층과 하위 수준 기능에 있으며 시간에 크게 의존합니다. 내 전반적인 문제는 내가 어떻게 슬라이스하는지에 관계없이 테스트가 테스트하는 기능보다 훨씬 복잡해 보인다는 것입니다.