조롱이 얼마나 옳은가?


10

나는 "그것이 달려있다"고 확신하기 때문에 농담으로 질문의 제목을 붙 였지만, 몇 가지 구체적인 질문이 있습니다.

많은 계층의 종속성이있는 소프트웨어에서 작업하면서 팀은 각 코드 모듈을 그 아래의 종속성과 분리하기 위해 상당히 광범위하게 조롱하는 데 익숙해졌습니다.

따라서 Roy Osherove 가이 비디오 에서 5 % 정도의 조롱을 사용해야한다고 제안한 것에 놀랐습니다 . 우리가 70-90 % 사이에 있다고 생각합니다. 나는 때때로 다른 유사한 지침 을 보았습니다 .

나는 서로 다른 이름을 부여해야 할 두 가지 범주의 "통합 테스트"로 간주되는 것을 정의해야한다. 1) 여러 코드 모듈을 통합하는 In-process 테스트 및 2) 말하는 Out-of-process 테스트 데이터베이스, 파일 시스템, 웹 서비스 등에 관심이 있습니다. 모든 프로세스에서 여러 코드 모듈을 통합하는 테스트입니다.

내가 읽은 많은 커뮤니티 지침에 따르면 단위 테스트는 정확한 위치에 대한 정확한 피드백을 제공하기 때문에 많은 수의 분리 된 세밀한 단위 테스트와 소수의 거친 세분화 된 통합 테스트를 선호해야합니다. 회귀가 생성되었을 수 있지만 설정하기가 까다로운 거친 테스트는 실제로 시스템의 더 많은 기능을 검증합니다.

이를 감안할 때 이러한 별도의 코드 단위를 분리하기 위해 조롱을 자주 사용하는 것이 필요합니다.

다음과 같은 객체 모델이 제공됩니다.

여기에 이미지 설명을 입력하십시오

... 또한 응용 프로그램의 종속성 깊이가이 이미지에 맞을 수있는 것보다 훨씬 더 깊어 2-4 레이어와 5-13 레이어 사이에 다중 레이어 N이 있다고 생각하십시오.

유닛 # 1에서 수행되는 간단한 논리적 결정을 테스트하고 모든 의존성이 코드 모듈에 생성자 주입되는 경우, 예를 들어 2, 3 및 4는 생성자 모듈 1에 생성자 주입됩니다. 이미지, 나는 오히려 2, 3 및 4의 모형을 1에 주입합니다.

그렇지 않으면 2, 3 및 4의 구체적인 인스턴스를 구성해야합니다. 이는 추가 타이핑보다 더 어려울 수 있습니다. 종종 2, 3 및 4는 만족스럽고 그래프에 따라 (그리고 프로젝트의 현실에 따라) 생성자 요구 사항을 갖습니다. 2, 3 및 4.

2, 3 또는 4가 특정 방식으로 작동해야 # 1의 간단한 논리적 결정을 테스트 할 수있을 때 이러한 상황이 더욱 어려워집니다. 2, 3 또는 4가 필요한 방식으로 작동하려면 전체 객체 그래프 / 트리를 한 번에 이해하고 "정신적으로 추론"해야 할 수도 있습니다. myMockOfModule2.Setup (x => x.GoLeftOrRight ()). Returns (new Right ());를 수행하는 것이 훨씬 쉬운 것 같습니다. 모듈 2가 올바른 방향으로 지시하면 모듈 1이 예상대로 응답하는지 테스트합니다.

2 ... N ... 13의 구체적인 인스턴스를 모두 함께 테스트하려면 테스트 설정이 매우 커서 대부분 복제됩니다. 테스트 실패는 회귀 실패의 위치를 ​​정확히 찾아내는 데 도움이되지 않을 수 있습니다. 테스트는 독립적 이지 않습니다 ( 다른 지원 링크 ).

물론 하위 계층에 대한 상호 작용 기반 테스트보다는 상태 기반 테스트를 수행하는 것이 합리적입니다. 이러한 모듈은 더 이상 의존성이 거의 없기 때문입니다. 그러나 가장 아래의 모든 모듈을 분리하려면 정의에 따라 조롱이 거의 필요합니다.

이 모든 것을 감안할 때, 내가 잃어버린 것을 말해 줄 수 있습니까? 우리 팀이 모의를 과용합니까? 또는 일반적인 단위 테스트 지침에서 대부분의 응용 프로그램의 종속성 계층이 함께 통합되어 모든 코드 모듈을 함께 테스트하는 것이 합리적이라고 가정합니다 (사례를 "특별한")? 아니면 다르게는, 우리 팀이 우리의 경계 컨텍스트를 적절하게 묶지 않습니까?


귀하의 응용 프로그램이 느슨한 커플 링으로 이익을 얻을 수있는 것처럼 들립니다. en.wikipedia.org/wiki/Loose_coupling
Robert Harvey

1
Or is there perhaps some assumption in typical unit testing guidance that the layers of dependency in most applications will be shallow enough that it is indeed reasonable to test all of the code modules integrated together (making our case "special")? <-이것.
Robert Harvey

또한 주목할 가치가 있습니다. 회귀 테스트 (특히 통합 테스트)의 목적은 소프트웨어가 여전히 작동하는 곳을 증명하는 것입니다. 문제 해결을 통해 문제를 해결 한 다음 추가 단위 테스트를 통해 특정 파손을 해결할 수 있습니다.
Robert Harvey

원래 게시물에서 모듈 1이 I2, I3 및 I4 만 알고 있다고 분명히 말 했어야합니다. 모듈 2는 I5, I6 및 I7 만 인식합니다. 구체적인 2, 3 및 4 대 1을 제공하여 모의를 사용하지 않고 테스트하는 것은 의심의 여지가있는 목표입니다. 그렇지 않으면, 우리는 시간의 5 % 이상을 조롱하는 것을 사용합니다.
ardave

귀중한 관습을 무시하는 많은 팀에 대한 블로그 게시물을 읽은 후 상황이 "특별"하다고 잘못 생각하여 우리의 사례가 "특별"인 것에 대해 농담을했습니다. 그러나 이것이 실제로 우리의 경우라면, 이것은 내가 읽은 일부 커뮤니티 지침과 팀의 실제 경험 사이의 불일치를 설명합니다. (5 % vs 70-90 %)
ardave

답변:


4

우리 팀이 모의를 과용합니까?

언뜻보기에.

1..13 모듈이있는 경우 각 모듈에는 자체 단위 테스트가 있어야하며 모든 (사소하고 신뢰할 수없는) 종속성은 테스트 버전으로 바꿔야합니다. 그것은 모의 의미 할 수 있지만, 어떤 사람들은 명명, 가짜, 심, null 객체와 같은 의미가 있습니다. 어떤 사람들은 모든 테스트 구현을 "모의"라고합니다. 이것이 "옳은"금액에 대한 혼란의 원인이 될 수 있습니다.

개인적으로, 나는 모든 테스트 객체를 "모의 (mocks)"라고 부릅니다. 다양한 객체를 구별하는 것이 종종 유용하지 않기 때문입니다. 그들이 단위 테스트를 빠르고, 고립되고, 탄력적으로 유지하는 한 ... 나는 그들의 이름이 무엇인지 상관하지 않습니다.


이 경우 그때 궁금 것이 어떤 이 함께 통합 된 하나 개 이상의 코드 모듈을 테스트하는 대 분리에 테스트 코드 모듈에 가장 경우에 거기 일반적인 지침은. 다른 방법으로 분리 할 수있는 두 개의 모듈을 통합하자마자 여러 가지 바람직하지 않은 문제가 생길 수 있습니다. 회귀 원인을 정확히 지적하지 못함 / 단일 회귀에 대한 다중 테스트 실패, 과도한 테스트 설정 등 나는 내 자신의 직관적 인 감각을 가지고 있지만 ( "시험에 귀를 기울인다") 이것은 70-90 % 모의 수준으로 남았다.
ardave

1
@nono-내 경험상 언급 한 이유로 모든 것을 분리해서 테스트해야합니다 . 당신이 고립에서 단위 테스트를하지 않는 유일한 일이 당신이 것들 수없는 그들이 어떤 파일 시스템 또는 직접 다른 외부 자원에 대해 이동하기 때문에 ( 뭔가 결국 그렇게한다).
Telastyn

이것을 며칠 동안 씹은 후에는 가능한 가장 좋은 설명처럼 보입니다. "모의"의 엄격한 정의를 회고 상호 작용 / 행동 검증에 사용되는 테스트 이중 유형으로 사용하는 경우 더미 테스트가 두 배 또는 특정 동작을 시뮬레이트하기 위해 미리 구성된 테스트 더블, 예, 5 % 수준에서 와인딩을 볼 수 있습니다.
ardave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.