2009-06-07 10 views
4

각 단위 테스트를 얼마나 검사해야합니까? 예를 들어 나는이 시험이각 단위 테스트가 얼마나 테스트해야합니까?

[TestMethod] 
public void IndexReturnsAView() 
{ 
    IActivityRepository repository = GetPopulatedRepository(); 
    ActivityController activityController = GetActivityController(repository); 
    ActionResult result = activityController.Index(); 
    Assert.IsInstanceOfType(result, typeof(ViewResult)); 
} 

또한

[TestMethod] 
public void IndexReturnsAViewWithAListOfActivitiesInModelData() 
{ 
    IActivityRepository repository = GetPopulatedRepository(); 
    ActivityController activityController = GetActivityController(repository); 
    ViewResult result = activityController.Index() as ViewResult; 
    Assert.IsInstanceOfType(result.ViewData.Model, typeof(List<Activity>)); 
} 

분명히 첫 번째 테스트가 실패합니다 그래서 두 번째 테스트 그래서이 두 두 주장과 함께 하나 개의 테스트로 결합해야한다면? 제 느낌은 테스트가 세분화되고 테스트가 적을수록 오류의 원인을 빨리 찾을 수 있다는 것입니다. 그러나 모든 테스트를 실행하는 데 시간이 걸릴 수있는 아주 작은 테스트의 엄청난 수의 오버 헤드가 있습니다.

답변

12

가능한 한 많이 나누는 것이 좋습니다.

이것에 대한 많은 이유는 가장 중요한 사람은 이럴있다 : 당신의 테스트 하나가 실패하면

  • , 당신은 신속하고 같은 잘못을 정확하게 분리 할 수 ​​있도록하려면 가능한 한 안전하게. 각 테스트 방법을 테스트하는 것이 하나의 테스트 만 수행하는 가장 좋은 방법입니다.

  • 각 테스트는 깨끗한 슬레이트로 시작해야합니다. 저장소를 한 번 작성한 다음 2 개 이상의 테스트에서 사용하면 해당 테스트의 순서에 내재적으로 종속됩니다. Test1이 저장소에 항목을 추가했지만 삭제하는 것을 잊어 버리라고합니다. Test2의 동작이 달라져서 테스트가 실패 할 수도 있습니다. 유일한 예외는 불변의 데이터입니다.

속도 문제와 관련하여 걱정할 필요가 없습니다. 이와 같은 순수한 코드 - 크 런칭의 경우, .NET은 매우이며, 차이점을 알 수는 없습니다. 코드 작업과 데이터베이스와 같은 작업을 수행하자 마자 성능 문제를 느낄 것입니다.하지만 작업을 마친 후에는 위에서 설명한대로 모든 "클린 슬레이트"문제에 부딪치게됩니다. 그것과 함께 살아야합니다 (또는 가능한 한 많은 데이터를 불변으로 만들어야합니다).

시험에 가장 좋습니다.

+1

글 머리 기호 2 : 슬레이트 = 상태? – guerda

+3

슬레이트를 쓰려고했지만 상태도 적절할 것입니다. "깨끗한 슬레이트"는 "처음부터 시작하기"에 대한 구어체입니다. –

3

더 세밀할수록 좋습니다. 테스트 케이스에서 어설 션이 실패하면 테스트 케이스가 더 이상 실행되지 않습니다. 사건의 후반부는 잠재적으로 다른 오류를 발견 할 수 있습니다.

테스트 케이스 사이에 공유 코드가있는 경우 설정/teardown 기능을 사용하여 너무 많이 반복하지 않고 처리하십시오. 시간 비용은 종종 무시할 수 있습니다. setup/teardown에 너무 많은 시간이 걸리면 단위 테스트는하지 않고 상위 레벨 자동화 테스트를 수행 할 것입니다. 단위 테스트는 이상적으로 파일 시스템, 네트워크, 데이터베이스 등의 종속성을 가져서는 안됩니다.

+0

+1 폭로 된 오류! – guerda

0

단위 테스트는 기능 디자인의 관점에서 기술 설계에 설명 된 내용을 정확하게 테스트해야합니다.

+0

제 의견으로는 너무 일반적인 답변입니다. 두 가지 테스트에서 반드시 테스트해야하는 두 가지 주장이있을 수 있으며 일부는 함께 테스트 될 수 있습니다. – guerda

+0

그리고 그걸 어떻게 압니까? 머리 꼭대기에서? 그리고 그것은 좋은 접근 방법입니까? 논리 함수 당 적어도 두 개의 어설 션을 수행해야합니다. 하나는 좋은 입력과 좋은 출력을 테스트하는 것이고 다른 하나는 쓰레기 입력에 넣고 실패를 예상하는 것입니다. 그러나 기술 설계가 없다면 좋은 결과물이 무엇인지 알지 못하고 기능 설계가 없으면 어떤 쓰레기 입력을 경계해야할지 모릅니다. –

+0

그의 질문에 대한 귀하의 대답은 "당신은 개발자의 리드가 테스트하라는 것을 정확하게 테스트해야합니다."한 단계에서 이것이 정확할 수도 있지만 질문이 특정 코드에 대한 피드백을 요청할 때 전혀 도움이되지 않습니다. –

2

"표준"대답은 코드에 버그가있는 경우 하나의 테스트를 중단해야하지만 다른 실패를 숨기지 않아야한다는 것입니다 (다른 테스트가 실행되지 않도록) 이 하나가 실패하면. 각 테스트는 한 가지를 테스트하고 두 가지 테스트는 같은 것을 테스트하지 않습니다. 그것은 항상 이상적인 것이지 항상 눈에 띄는 것은 아닙니다. 지도라고 부르세요.

사실, 이것은 실제로 예술입니다. 처음에는 성능 문제를 해결하고 유지 보수성에 더 초점을 둡니다.거기에 두세 반에서 세 줄의 중복이 있습니다. 디자인이 변경되면 유지 관리가 어려워집니다. 복제 자체는이 경우 클래스에 제출 된 설정 방법으로 해결할 수 있지만 걱정할 주요 사항은 유지 관리 가능성입니다.

테스트는 유지할 수 있고 이해하기 쉬우 며 다른 사람 (또는 시간이 지남에 따라)이 합리적으로 코드를 이해하고 테스트를 유지할 수 있도록하기 위해 충분히 작아야합니다.

0

테스트 테스트가 얼마나 많은지에 대한 접근 방식은 분명히 정면을 결정하고 그것에 충실해야합니다. 나는 다른 팀 및/또는 프로젝트 등 코딩, 성능, 문제 해결, 테스트 인프라를 향한 서로 다른 우선 순위를 가지고 그러나 일관되고 항상 도움이 될 것입니다 때문에 모두가 균일하게 동일한 방법을 수행해야한다고 생각하지 않습니다

  1. 빠른 부터 문제를 확인하십시오.
  2. 건설에 소요되는 시간이 덜 입니다.
  3. 은 테스트 도우미 클래스의 과 동일한 세트를 사용하고 테스트를 구현합니다.
  4. 테스트를 충분히 빠르게 실행하십시오. 너무 빠르지 않고 너무 느리지도 않습니다.
  5. 조직 검사 (스위트 룸, 패키지 등)

그 성능이 후 더 검증/asserttions와 두꺼운 테스트를 구현하는 더 중요 결정합니다. 문제 해결이 가장 중요하다고 판단되면 필요한만큼 테스트를 분리하십시오. 두껍고 잘 구조화 된 테스트에 결함이있는 이유를 알 수 없습니다. 그러한 테스트는 더 얇은 테스트의 양과 똑같은 작업을 수행하게됩니다.

물론 모든 테스트는 특정 기능/기능에 초점을 맞추어야하지만 실제로이 스레드의 주제는 아닙니다.

관련 문제