2013-03-05 1 views
3

난 던지기 예외 시뮬레이션에 대해 this question을 읽었습니다. 진짜 개체 인 척 모의 개체를 만들 것을 제안합니다.유닛 테스트에서 임의의 코드 포인트에서 예외를 던지면 어떻게 시뮬레이트합니까?

그건 내가 원하는 것이 아닙니다. 실제 객체를 대체하면 실제 코드의 일부가 손실됩니다. 최소한의 변경으로 실제 코드를 호출하고 해당 코드의 무작위 지점에서 예외가 발생하도록하고 싶습니다.

단위 테스트에서 임의의 코드 포인트가 호출 될 때 예외가 발생할 수 있습니까?

+0

예외 처리를 테스트하려고합니까? – CloudyMarble

+0

오류 처리를 테스트 할 때 실제 코드의 일부분을 잃는 문제는 무엇입니까? 동일한 테스트에서 실제 코드 및 오류 처리를 테스트하면 안됩니다. – adrianm

+0

임의의 지점에서 개체가 생성 한 관리 코드에 일부 코드를 삽입 할 수 있습니다. – ipavlic

답변

3

단위 테스트에 임의성을 넣지 마십시오. 그것은 단지 당신에게 문제를 가져올 것입니다. 단위 테스트는 항상 일관성을 가져야합니다. 특히 그가 빨간색으로 갔을 때 무엇이 ​​잘못되었는지 당신에게 이야기하기를 원한다면. 단위 테스트에 임의의 예외를 던지면 예외가 발생하여 빨간색 막대가 반환 될 수 있습니다. 어쩌면 다음 번에 오류가 다시 실행됩니다. 이것은 실제로 단위 테스트가 여기에있는 것이 아니며, 한 번 발생한 실패 테스트에서 문제를 발견하는 데 큰 어려움을 겪습니다.

훨씬 나은 방법은 코드의 중요한 부분을 체계적으로 테스트하는 것입니다. 각 중요한 메소드를 조롱 된 객체로 바꿉니다.이 객체는 테스트하려는 예외 유형을 throw하고 이와 같은 각 테스트 케이스를 처리합니다. 이 오류를 찾고있을 때 잘못된 정보가 더 많이 제공됩니다.

희망이 도움이됩니다.

2

나는이 문제에 관해 생각해 볼 수 있습니다.

1 - RandomException() 함수를 만듭니다. 그 throw 예외는 임의의 값이 3으로 나눌 수있는 경우 그렇지 않으면 예외를 throw하지 않습니다. 이 함수 블록이이 코드 블록에 캡슐화되어 있는지 확인하십시오.

#if DEBUG 
void RandomException() 
{ 
    // gen random value 
    // if random value % 3 == 0 throw the exception now 
} 
#else 
void RandomException() 
{ 
} 
#endif 

그런 식으로 코드를 릴리스하면 이러한 함수 호출이 프로그램에 영향을 미치지 않습니다.

아이디어가 도움이되기를 바랍니다.

+0

내 코드의 임의의 지점에서이 함수를 호출하려면 어떻게해야합니까? – sharptooth

+0

그건 TestProject가 작동하는 방식이 아니야. 적어도 내가 일하는 곳은 아니야. 제품과 함께 제공되는 테스트 코드가 있습니까? – Default

+0

@Default : 아니요, 우리는 제품을 "선적"하지 않으며 웹 서비스를 운영하고 유지 관리하므로 고객은 코드를 보유하지 않습니다. – sharptooth

1

당신이 예외 처리를 테스트하려고하는 것처럼 보입니다. 예외 처리를 무작위로 던지기 만하면됩니다. 특정 조건에서 처리를 테스트해야한다면 예외를 유발해야하는 불법적 인 상황과 같은 실제 객체의 조건.

당신은 여전히이 변수에 따라 예외를 던질 코드를 일으킬 것입니다 (Unittest) 외부에서 설정할 수있는 로컬 varibale 통해이 동작을 생성 할 수 있지만 내가 그 좋은 접근 생각하지 saied.

관련 문제