유일한 논리가 가드 인 단위 테스트 방법에 유용합니까?


12

다음과 같은 방법이 있다고 가정 해보십시오.

public void OrderNewWidget(Widget widget)
{
   if ((widget.PartNumber > 0) && (widget.PartAvailable))
   {
        WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber);
   }
}

내 코드에 여러 가지 메소드가 있습니다 (비동기 웹 서비스 호출의 앞쪽 절반).

단위 테스트로 다루는 것이 유용한 지 토론 중입니다. 그렇습니다 여기에는 논리가 있지만 그것은 단지 보호 논리입니다. (웹 서비스 호출이 발생하기 전에 필요한 것들이 있는지 확인합니다.)

저의 일부는 "일단 테스트 할 수는 있지만 시간이 가치가 없다"고 말합니다 (이미 일정이 미진한 프로젝트에 있습니다).

그러나 저의 다른 쪽은, 당신이 그들을 단위 테스트하지 않으면 누군가가 경비원을 변경하면 문제가있을 수 있다고 말합니다.

그러나 내 첫 번째 부분은 누군가가 경비원을 변경하면 경비원을 더 많이 만들고 있다고 말합니다 (지금은 경비원을 변경하고 경비원의 단위 테스트를 수행해야하기 때문입니다).

예를 들어 서비스에서 위젯 가용성을 확인해야 할 책임이있는 경우 더 이상 경비를 원치 않을 수 있습니다. 그것이 단위 테스트를 받고 있다면 지금 두 곳을 바꿔야합니다.

나는 두 가지 방법으로 장단점을 봅니다. 그래서 다른 사람들이 한 일을 물어볼 것이라고 생각했습니다.


17
관리자에게 "더 많은 작업"을하지 않습니다. 로직을 변경하면 해당 단위 테스트를 변경해야합니다. 그것이 작동하는 방식입니다. 나는 당신의 단점을 보지 못합니다 : 단위 테스트가 변경 될 필요가 없다면 아무것도 테스트하지 않을 것입니까? 단위 테스트가 유용한 지 여부에 대해 의문을 가질 수도 있습니다.
Andres F.

9
이것은 주제가 아니지만 부품 번호가 0 이하이거나 부품을 사용할 수없는 경우 예외를 throw하도록 논리를 변경합니다. 제 생각에는 누군가가 가짜 위젯, 다른 문제를 자동으로 숨 깁니다.
Matthew

2
@ 매튜 아주 좋은 지적. 이 기능은 거짓말입니다. 이름은 무언가를 주문하겠다고 알려줍니다. 그리고 그것은 내부와 동일한 논리를 적용하지 않으면 DRY를 위반하지 않는 한 결코 알 수 없습니다. 다시 말해, 디자인이 더 정확하도록 변경 되었다면이 질문은 처음에는 묻지 않았을 것입니다.
stijn

2
but it is not worth the time" (I am on a project that is already behind schedule).우리는 소프트웨어 개발자입니다. 우리가 예정된 유일한 시간은 우리가 죽었을 때입니다 :)
maple_shaft

답변:


26

저의 일부는 "일단 테스트 할 수는 있지만 시간이 가치가 없다"고 말합니다 (이미 일정이 미진한 프로젝트에 있습니다).

세 가지 매우 짧은 테스트입니다. 당신은 자신에게 질문을하는 데 많은 시간을 보냈습니다.

그러나 저의 다른 쪽은, 당신이 그들을 단위 테스트하지 않으면 누군가가 경비원을 변경하면 문제가있을 수 있다고 말합니다.

이쪽을 들으십시오.

그러나 내 첫 번째 부분은 누군가가 경비원을 변경하면 경비원을 더 많이 만들고 있다고 말합니다 (지금은 경비원을 변경하고 경비원의 단위 테스트를 수행해야하기 때문입니다).

관리자가 TDD 너트 인 경우 더 어렵습니다. 관련 변경이나 테스트 추가없이 내가 변경하면 열심히 생각해야합니다. 실제로, 나는 계속 진행하기 전에 테스트를 추가하고 변경하기를 원할 것입니다.

당신의 첫 부분은 명백한 잘못입니다. 두 번째 부분에 등을 두드리고 그것에 대해 생각하지 마십시오.


내가 너무 ㅎ 답을 쓴에도 불구하고 간결을위한 한
지미 호파

3
+1. 예. 요구 사항이 변경되면 일부 테스트를 조정해야합니다.
Olivier Jacot-Descombes

나는 당신이 말하는 것을 좋아하지만, 내 코드 (비동기 호출의 앞쪽 절반)에 이런 종류의 호출 인스턴스가 많이 있습니다. 따라서 단지 3 개의 단위 테스트가 아닙니다. 그래도 그것이 "올바른"방법이라면 나는 그것들을 끝내고 싶다.
Vaccano

@Vaccano : 작성해야 할 것이 많을수록 테스트 할 논리 경로가 많을수록 작성해야합니다.
pdr

9

가드 로직과 실제 순서가 별도의 방법이라면 단위 테스트를 단순화합니다.

에서 Widget클래스

public bool IsReadyForOrdering { get { return PartNumber > 0 && PartAvailable; } }

또는 다른 곳의 동등한 방법

public bool IsWidgetReadyForOrdering(Widget widget)
{
    return widget.PartNumber > 0 && widget.PartAvailable;
}

주문 방법

public void OrderNewWidget(Widget widget)
{
   if (IsWidgetReadyForOrdering(widget)) {
        WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber);
   }
}

이제 테스트 IsWidgetReadyForOrdering가 쉬워졌습니다. 더 이상 그것에 대해 오래 생각하지 마십시오. 그것을 테스트하십시오!


1
Oof, stateful logic in a property. -1 메서드 여야하고, 단순성 때문에 PartAvailable 인 PartNumber를 가져와야합니다. 공용 API의 일부일 필요는 없지만 속성이 아닌 경우 보호하십시오. 또한 일반적으로 동의하지 않습니다. 메소드 내부의 가드 로직은 완전히 훌륭하며, 작은 메소드이기 때문에 이미 작은 메소드를 작게 만들기 위해 클래스를 오염시키고 있기 때문에 내 눈에는 더 좋습니다. 이 경우 반복적 인 논리 인 경우에만 클래스에 추가하십시오.
지미 호파

1
첫째, 이것은 질문에 대답하지 않습니다. 둘째, 사실이 아닙니다. 어느 쪽이든 세 가지 테스트를 작성해야합니다. 셋째, 불필요하게 구현 정보를 호출 코드에 노출합니다.
pdr

8
@JimmyHoffa : 해당 속성의 상태 저장 논리가 어디에 있습니까? 실제로이 예는 상태 변경 논리 (OrderNewWidget)를 비 상태 변경 논리 (ReadyForOrdering)와 분리하는 방법을 보여줍니다. 그리고 작은 함수를 추출해도 코드가 향상되고 상태가 나빠질수록 코드가 나빠지지는 않는다고 확신합니다. +1입니다.
Doc Brown

2
이 메소드 OrderNewWidget는 인수 Widget가 있기 때문에 아마도 다른 클래스에있을 것입니다 Widget. 이 메서드에는 반환 값이 없으므로 테스트하기가 쉽지 않습니다. 통화 WigdetOrderingService를 추적 하는 -mock 을 삽입해야합니다 OrderNewWidgetAsync.
Olivier Jacot-Descombes

2
@JimmyHoffa : 실제로 "stateless"에 대한 정의는 C #에서 "static"을 의미합니다. 따라서 "속성이 객체의 상태에 액세스하면 안됩니다"라고 말합니다. 그러나 벙어리 게터조차도 상태 변수에 액세스하므로 "정적 속성 만 쓰기"를 의미합니다.
Doc Brown

6

단위 테스트 일정에 시간이 없지만 확실한 QA 사용을위한 시간을 따로 떼어 놓은 경우 해당 QA 시간 중 일부를 도용하여 단위 테스트를 작성할 수 있는지 또는 일부 QA 기간을 보낼 수 있는지 묻습니다 단위 테스트를 수행하거나 비 단위 테스트 코드를 처리 할 수 ​​있습니다. 불행히도 일정이 양보를하거나 강제로 사망하도록 강요하는 일정은 일반적으로 첫 번째 옵션을 제안합니다. 해당 기간 동안 시스템을 올바르게 유지 관리합니다.

즉, 가드 진술을 테스트하는 일반적인 질문에; 예! 가드 진술을 절대적으로 테스트하십시오! 사람들은 그 방법, 당신은 버그 수정을하는 사람의 오해 뭔가를 찾으려하고 가드를 제거하거나 변경하지 않을의 행동의 중요한 부분입니다 &&||당신 것? 단위 테스트는 a) 당신이 실제로 경비원의 논리를 올바르게 얻었는지, 그리고 b) 어떤 이유로 인해 단위 테스트를 실행할 때 불만을 제기하지 않고 나중에 그 논리를 위반하지 않는지 확인합니다.


0

위의 훌륭한 답변이 있으며, 그 요점은 매우 중요합니다. 그러나 놓친 것 같은 것은 포괄적 인 단위 테스트 세트를 가지고 있다는 것입니다. 코드의 매우 상세한 사양처럼 읽습니다. 코드가 너무 간단하여 테스트 유효성 검사를 생략하면 어떻게 잘못 될 수 있는지 알기가 어렵고 사양의 일부가 빠져 있습니다. 이러한 테스트를 놓친 팀에 들어간 경우 실제로 서비스가 해당 인수의 유효성을 검증하지 않은 것으로 가정합니다.


-5

코드는 코드입니다. 테스트 할 때 100 % 적용 범위를 확보해야합니다. 중요하지 않은 경우에는 없을 것입니다.

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