테스트 방법에서 try catch를 사용해야합니까?


18

단위 테스트를하고 있습니다.

하나의 기능을 테스트하려고합니다.

테스트 컴포넌트에서 호출합니다. 그러나 원격 기능이 예외를 처리 할 수 ​​없다면 내 테스터 구성 요소에서도 예외가 발생합니다.

테스터 구성 요소에서 예외가 발생하는 것에 대해 걱정해야합니까?

감사.

편집하다:

추신:

오류를 던지는 것은 좋지만 다른 기능에 대해서만 최종 옵션이 될 때까지 최종 옵션이 아닙니다!

세상에 나는 프로그래밍 견적을 썼다!!


나는 테스트를 처음 접했고 함수의 동작 만 테스트해야한다. 블랙 박스 및 화이트 박스 테스트라고합니다. 아 기억 나 나는 대학에서 그것을 공부했다!
Vikas

구체적으로 어떤 언어와 xUnit 프레임 워크를 사용하고 있습니까? 어떤 경우에는 그렇습니다.
Greg K

내가 사용하고 MXUnitMockBox 및 냉각 박스를 ColdFusion에서의 언어.
Vikas

답변:


23

짧은 대답 : NO.

단위 테스트에서 예외를 포착하지 마십시오. 예외가 발생하는 오류 및 상황을 찾기위한 단위 테스트입니다.

단위 테스트 프레임 워크는 예외를 깔끔하게 처리해야합니다. (모든 경우) 대부분의 xUnit의 프레임 워크가 할 수있는 구조가 기대 당신이 테스트중인 시스템에서 특정 예외 조건을 유도하고 예상 예외가 발생하면 테스트 통과를 가지고 있지만 그렇지 않은 경우 실패 할 때 사용하는 특정 예외를.


고급 테스트 프레임 워크는 예외를 매우 잘 처리 할 수 ​​있다고 생각합니다. 심지어 Visual Studio에서는 "예상 예외"라고 말한 것처럼 예외를 테스트 할 수 있습니다. 따라서 알고 공유하는 것이 좋습니다. 감사합니다 ..
카스

때때로 좋은 테스트는 테스트가 제대로 이루어지지 않았을뿐 아니라 실패한 경우도 테스트하기 때문에 예외가 발생했는지 확인하려고합니다.
deadalnix

1
예외가 발생하는 상황 (특히 자신의 예외)을 테스트하려는 경우 예외를 포착하려고합니다. 특정 조건에서 예외로 실패하도록 설계된 코드를 작성하는 경우 해당 조건은 테스트 스위트의 일부이므로 테스트해야합니다. 이러한 테스트에서 이러한 예외를 파악하고 분석해야합니다.
jwenting

1
읽기에게 두 번째 단락을 @Jwenting - 단위 테스트 프레임 워크는 예외를 포착하고 그렇지 않을 경우 테스트는 특정 예외가 발생하는 경우 통과 실패 할 수
mcottle

5

(mcottle의 답변과 달리) 긴 대답 : 아니요 ... 대부분의 경우

테스트에서 특정 예외가 발생할 것으로 예상 할 때 해당 테스트의 모든 행이 특정 예외를 발생시키는시기를 알게됩니다.

테스트중인 메소드가 예외를 던진다는 것을 아는 것과는 다릅니다.

테스트에 객체 또는 컨텍스트 설정이 포함 된 경우 (프레임 워크의 버전이 아닌 테스트 내에서 SetUp) 실제로 테스트하려는 단일 행을 시도 / 캐치에서 랩퍼로 래핑하는 것이 좋습니다.

예를 들어

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

그리고

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

이 테스트가 실패하면 테스트중인 메소드가 임의의 설정 항목이 아닌 예외를 던졌습니다.

(임의의 설정 작업을 피하려고 노력해야합니다. 때로는 테스트에 설정 코드를 추가하는 것이 더 쉽습니다.)


좋은 예입니다! "테스트"단계를 정확한 테스트로 제한하는 데 매우주의를 기울이려고하지만,이를 풀 수있는 방법을 찾을 수없는 경우 (예 : 경쟁 조건 테스트시)에 대한이 트릭을 기억할 것입니다 조건에 도달하려면 '테스트'에 가까운 '설정'이 필요합니다).
Ethel Evans

1

일반적으로 예외는 제외해야하며 테스트 프레임 워크는 필요한 모든 정보가 포함 된 멋진 보고서를 제공합니다.


그러나 TDD 방법론에서는 다음 단계를 수행해야합니다.

  1. 테스트 작성
  2. 실패를보고 오류를 이해할 수있게하십시오.
  3. 코드 수정
  4. 코드와 테스트 리팩토링

예외를 내릴 때 오류가 분명하면 괜찮습니다. 그러나 때로는 예외가 모호하거나 잘못 인도되기도합니다. 어떻게 코드에 넣을 수 있습니까 (나중에 잊어 버렸을 때 또는 문제를 파악하는 데 큰 시간을 허비 할 팀원을 위해)? 따라서 제 정책은 " 실패를 분명히해야하는 경우 예외를 잡아야합니다 "입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.