예외로 인해 try / catch 블록을 테스트하는 이벤트를 시뮬레이트하는 방법은 무엇입니까?


14

예외가 어떻게 작동하고 C #에서 예외를 포착하고 처리하는 방법을 이해하지만 예외가 올바르게 포착되도록 예외를 유발할 수있는 이벤트를 어떻게 시뮬레이션 할 수 있습니까? 예를 들어, 네트워크 문제, 데이터베이스 문제 등을 시뮬레이션 할 수있는 일종의 테스트 베드에서 응용 프로그램을 실행할 수 있습니까? 본질 상 예외는 재현하기 어려워서 코드에 대처하기가 어렵습니다.

주로 C # /. NET / Visual Studio를 사용하여 개발하지만 다른 언어와 관련된 답변이나 리소스가 유용 할 수 있습니다.


또 다른 가능한 해결책은이 MSDN 기사 : TestApi를 사용한 결함 주입 테스트
Giorgi

답변:


13

1) 의존성 주입 모델을 따른 경우 특정 부분의 실제 구현을 모의로 대체하여 필요에 따라 예외를 throw 할 수 있습니다. 그러나 처음에는 특정 방식으로 애플리케이션을 설계하거나 완전히 리엔지니어링해야합니다.

처럼:

public class SqlUsersRepository : IUsersRepository
{
    public void RegisterNewUser (User newUser)
    {
        throw new SqlException ("Connection timeout");
    }
}

그러나 여기서 우리는 소비자 코드가 구체적인 구현 예외를 처리하는 데 관심을 가져서는 안된다는 문제가 있습니다.

2) 또 다른 방법은 특정 메소드 호출을 사용자 정의 래퍼로 바꾸는 것입니다.

대신에:

FileStream fs = File.OpenRead (path);

너는 사용한다:

FileStream fs = File.OpenRead_Test (path);

사용자 정의 확장 방법을 제공함으로써 (단순한 아이디어) :

public static FileStream OpenRead_Test (this System.IO.File file, string path)
{
    throw new FileNotFoundException ();
}

3

모의 프레임 워크를 살펴 봐야합니다.

이것들을 사용하면 의존성 주입을 사용하여 실제 데이터베이스 대신 가짜 데이터베이스를 호출 할 수 있습니다. 즉, 각 통화에 대해 반환되는 항목을 완전히 제어 할 수 있습니다.

그런 다음 호출되면 단순히 원하는 예외를 throw하는 테스트를 설정합니다.

public void Test1()
{
    throw new NullArgumentException();
}

코드가 이것을 올바르게 처리하면 테스트가 통과됩니다.


3

조롱과 주입은 지금까지만 가능하며 어떤 경우에는 접근 방식에 큰 변화가 필요합니다.

테스트 프레임 워크에 맞게 앱을 다시 디자인하지 않으려면 실제로 필요한 것은 오류에 대해 리깅 된 호스트 또는 환경입니다. 네트워크 속도 저하를 시뮬레이션하는 방법에는 여러 가지가 있습니다 (Microsoft 테스트 도구도 웹 테스트 영역에 약간의 영향을 미침). 데이터베이스를 생성하여 오류를 생성하는 스크립트와 데이터베이스를 조정하여 시뮬레이션을 변경하도록 변경 될 수있는 라우터 뒤에 머신을 배치하는 것이 가장 성공적이었습니다.

그럼에도 불구하고 하드웨어를 향해 충분히 빠르거나 멀리 내려갈 경우 동시성 문제 및 지연된 쓰기 실패와 같은 오류가 거의 시뮬레이션 할 수 없습니다. 때때로 당신은 그것들을 실제 시간과 다른 시간 동안 야기 시켜야만 안전망없이 일해야합니다.


동의-경우에 따라 릴리스 코드에서 종속성 주입으로 인한 오버 헤드를 감당할 수없는 경우가 있습니다. 일상적인 문제는 아니지만 발생할 수 있습니다.
Steve314
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.