2014-05-24 4 views
4

Xcode는 실패한 어설 션에서 테스트 루틴을 종료하지 않습니다. 이 올바른지? 나는이 문제의 배경을 이해하지 못했고, assert처럼 행동하고 프로그램을 종료 시켰 으면합니다. 다음 테스트에서는 "still running"이 인쇄됩니다. 이것이 대상입니까?XCTAssertTrue가 루틴을 중지하지 않습니다.

- (void)testTest 
{ 
    XCTAssertTrue(false, @"boo"); 
    NSLog(@"still running"); 
} 

내가 사전 조건이 충족되지 않을 때 종종 이후의 코드가 충돌 때문에이 유용 할 것이라고 표시되지 않습니다이 :

- (void)testTwoVectors 
{ 
    XCTAssertTrue(vec1.size() == vec2.size(), @"vector size mismatch"); 

    for (int i=0; i<vec1.size(); i++) { 
     XCTAssertTrue(vec1[i] == vec2[i]); 
    } 
} 
+0

' "boo"'는 형식 문자열이 아니므로 귀하의 예는 좋지 않습니다. 아마'@ "boo"'를 의미 할 것입니다. – matt

+0

예, "@"을 잊어 버렸습니다. – Phantrast

답변

0

예, 그것은 것입니다. 이것이 단위 테스트의 작동 방식입니다. 테스트에 실패해도 테스트가 종료되지 않습니다. 단순히 테스트를 통과하지 못했을뿐입니다. 하나의 테스트가 실패하기 때문에 다른 테스트가 통과했는지 또는 실패했는지에 대한 지식을 잃고 싶지 않기 때문에 유용합니다.

테스트 메서드가 예외를 throw하면 예외가 throw됩니다. 그러면 그 이유를 알 수 있습니다. 그러나 예외가 잡히면 문제가 무엇입니까? 다른 테스트 방법도 계속 실행되므로 결과가 여전히 예상대로 유지됩니다. 하나의 테스트가 실패하면 테스트를 중단하고 다른 테스트는 테스트를 수행합니다. 그러면 로그에 다음과 같은 내용이 표시됩니다.

Executed 7 tests, with 2 failures (1 unexpected) in 0.045 (0.045) seconds 

첫 번째 오류는 XCTAssert입니다. 두 번째 예외입니다.

+3

내 질문을 오해 한 것 같습니다. 나는 각 테스트 _method_가 다른 것들과 독립적이라는 것을 안다. 그러나이 경우 하나의 메소드 내에서 실패한 하나의 선언은 그 메소드의 종료로 이어지지 않는다. 사전 조건을 충족시키지 않으면 후속 코드가 충돌하기 때문에 이것이 유용 할 것입니다. – Phantrast

+2

내 대답을 오해 한 것 같아. 당신이 그렇게 요구하는 것은 당신이 모르는 것을 의미합니다. 직관적 인 기대는 대답을 결정 짓는 것이 아닙니다. 현실은 그렇게합니다. – matt

+0

아, 알겠습니다. 그게 분명해. 감사. – Phantrast

0

테스트가 "실패"를 생성하면이 개별 테스트가 계속 실행된다는 것을 분명히하기 만하면됩니다. 특정 테스트를 중단하려면 return을 입력해야합니다.

테스트가 다시 시작된다는 사실은 매우 유용 할 수 있습니다. 따라서 테스트 실패로 이어지는 첫 번째 문제뿐만 아니라 테스트 실패로 끝나는 모든 문제를 확인할 수 있습니다.

당신 말 :

- (void)testTwoVectors 
{ 
    XCTAssertTrue(vec1.size() == vec2.size(), @"vector size mismatch"); 

    for (int i=0; i<vec1.size(); i++) { 
     XCTAssertTrue(vec1[i] == vec2[i]); 
    } 
} 

귀하의 예 :이 유용 할 것이다 얼마나 자주 다음 코드는 사전 조건이 충족되지 않을 때 충돌 때문에 내가 볼 수 없습니다

왜냐하면 두 벡터의 크기가 다른 경우 왜 return이 좋을지 이해할 수 있기 때문에 아이러니합니다.하지만 같은 크기가 된 경우 예제 테스트의 두 번째 절반은 왜 실패한 후에 멈추고 싶지 않다. .

벡터가 동일한 크기이고 항목 중 5 개가 동일하지 않았다고 가정합시다. 첫 번째 시험뿐만 아니라이 시험에서 5 가지 실패 모두를 시험 보고서에 기록하는 것이 좋을 수도 있습니다.

테스트 결과를 검토 할 때 처음 실패뿐만 아니라 모든 실패 원인을 아는 것이 때로는 좋은 경우가 있습니다.

4

XCTAssert<XX>의이 동작을 변경할 수 있습니다.
설정 방법에서 self.continueAfterFailure을 NO로 변경하십시오.

IMO는 테스트 어설 션 실패 후 테스트를 중지하는 것이 더 나은 동작입니다 (다른 중요한 테스트를 실행하지 못하게하는 충돌을 방지합니다).테스트가 실패한 후에도 계속 진행될 필요가 있다면 이는 테스트 케이스가 단순히 분할되어야한다는 것을 의미합니다.

관련 문제