공급 업체 웹 서비스를 호출하는 단위 테스트 방법


10

하나의 공개 메소드 Send()와 몇 개의 개인 메소드 가있는 클래스가 있습니다. 몇 가지 웹 서비스를 호출하고 응답을 처리합니다. 처리는 개인 방법으로 수행됩니다.

코드를 단위 테스트하고 싶습니다. 내 이해는 단위 테스트가 내 코드를 독립적으로 테스트해야한다는 것입니다 (즉, 공급 업체 응답 모의).

또한 개인 메소드를 단위 테스트 할 필요는 없다고 생각 하지만 Send () 메소드 만 테스트하면 코드가 별도로 테스트되지 않고 공급 업체 공진에 의존합니다.

그런 다음 모의 응답으로 테스트 할 수 있도록 개인 메서드를 공개해야합니까? 수업 만 불러야하기 때문에 나쁜 습관 인 것 같습니다.

기본적인 질문이라면 사과는 단위 테스트에 익숙하지 않습니다.

C #과 VS2010을 사용하고 있습니다.


개인 메소드를 테스트하지 않으면 그것이 작동하는지 어떻게 알 수 있습니까?
Bryan Oakley

1
@BryanOakley 당신은 개인적인 방법이 작동한다는 것을 알 필요가 없습니다, 그것은 개인입니다. 호출하는 공용 메소드가 테스트를 통과하기 때문에 작동한다는 것을 알고 있습니다.
StuperUser

@Bryan 오클리는 링크를 한 번 봐 가지고
톰 종복

안녕 톰, 나는 더 눈에 띄도록 링크를 업데이트하고 링크 텍스트가 대상을 반영하도록했습니다. 롤백하시기 바랍니다.
StuperUser

답변:


18

웹 서비스를 처리하는 코드 (예 : 데이터 송수신)를 결과 처리 코드와 분리해야합니다. 후자의 코드를 다른 클래스로 옮기고 필요한 메소드를 공개하십시오. 그런 다음 외부 종속성과 별도로 처리 로직을 쉽게 단위 테스트 할 수 있습니다.

이를 통해 코드가 단일 책임 원칙을 준수하게합니다 . 일반적으로 개인 메소드를 테스트 할 필요성을 느끼는 것은 종종 클래스가 너무 많은 책임을 가지고 있다는 것을 나타내므로 여러 클래스로 리팩토링해야합니다.


3

이러한 의존성 테스트 ( 공급 업체 webservices 호출 )는 단위 테스트가 아닌 통합 테스트 라고 생각합니다 .


3

다른 사람들이 말했듯이 단위 테스트에 웹 서비스 또는 데이터베이스 호출과 같은 외부 종속성이 있으면 단위 테스트가 아니며 통합 테스트입니다.

실제 단위 테스트는 테스트하려는 구성 요소 외에 외부 구성 요소와 독립적으로 실행될 수 있으며 환경에 관계없이 반복 가능해야합니다. 외부 웹 서비스가 중단되면 단위 테스트에 실패하지 않아야합니다.

우리는 Mocking Framework를 사용하여이 문제를 해결합니다. 모의 객체를 사용하면 단위 테스트의 구성 요소가 실제 모의 객체 대신이 모의 객체를 사용하도록 구성 요소 모의 객체를 만들 수 있습니다. 모의 객체를 테스트 가능한 구성 요소에 주입하고 예상되는 인수, 호출 할 때 반환 할 항목, 던지는 예외를 지정할 수 있습니다. 단위 테스트의 신뢰성과 독립성을 향상시킬 수 있으므로 주제에 대해 더 많이 읽으십시오.

다른 C # 조롱 프레임 워크에 대한 좋은 게시물은 다음 SO 스레드를 참조하십시오.

/programming/37359/what-c-mocking-framework-to-use

편집 : 명백히 민감한, 나는 테스트가 끝날 때 데이터베이스 변경을 롤백 할 수있는 DbUnit 또는 기타 트랜잭션 도구에 대해서는 언급하지 않았 음을 소유 할 것입니다. 이것 또한 반복 가능하며 생성 된 테스트 데이터로 환경에 구애받지 않으므로이 경우 Mocking Framework가 필요하지 않습니다.


누군가가 downvote를 설명 할 수 있습니까? PHP, ROR, NoSQL 데이터베이스, 서버의 Javascript, Apple 제품 또는 기타 팹 트렌드를 찢어 보지 않았지만 여전히 어쨌든
다운 바이트를 얻었

나는 :) 누군가가 자신의 단위 테스트는 "전혀 없습니다 단위 테스트"를 호출되고있는 같이하지 않았다 (나를되지 않았습니다) 생각
다니엘 B
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.