2010-12-03 5 views
5

나는 현재 다음과 같은 방법이 있습니다이 작은 방법으로 어떤 테스트를해야합니까?

public void SetNewRandomValue() { 
    double newValue = numberGenerator.GenerateDouble(
          genesValuesInterval.MinimumValue, 
          genesValuesInterval.MaximumValue 
          ); 

    this.value = newValue; 
} 

은 무엇 (테스트하는 등) 얼마나 많은 테스트를 결정하는 가이드 라인을해야한다이 방법으로 만들 수 있습니까? 나는 현재 다음과 같은 작업을 수행했다. (즉, 테스트 우선이 아닌 메소드를 구현 한 후에 만) :

var interval = new Interval(-10, 10); 
var numberGeneratorMock = new Mock<INumberGenerator>(MockBehavior.Strict); 
var numberGenerator = numberGeneratorMock.Object; 

double expectedValue = 5.0; 

numberGeneratorMock.Setup(ng => 
     ng.GenerateDouble(interval.MinimumValue, interval.MaximumValue)) 
     .Returns(expectedValue); 

var gene = new Gene(numberGenerator, 0, new Interval(-10, 10)); 
gene.SetNewRandomValue(); 

Assert.AreEqual<double>(expectedValue, gene.Value); 

기본적으로 하나의 상황 만 테스트한다. 회귀 - 시험 적으로 나는 코드를 엉망으로 만드는 방법을 생각할 수 없다고 말하고 싶다. 코드를 제대로 작동하지 않는 코드로 바꾸고 여전히 테스트 패스를 가지고있다.

여기에 대한 의견은 무엇입니까? 이 작은 방법을 어떻게 처리할까요? 코드 커버리지 테스팅 프레임 워크를 사용할 수있는 경우

감사

+1

나는 이것이 단위 테스트의 신이 아니기 때문에 이것을 해결책으로 게시하는 것이 불안합니다. 그러나 숫자 생성기를 충분히 테스트하고 genesValues에서 최소/최대 검색을 수행했다면 그만 둘 것입니다. 만약 당신이 그 일을 안다면, 당신이 테스트하는 것은 this.value가 설정된다는 것입니다. –

+0

'Gene' 생성자의 두 번째 매개 변수는 무엇입니까? –

답변

2

나는, 당신이 사용하는 어떤 테스트 도구를 사용하여 코드 커버리지를 검사한다.

개인적으로 Microsoft Testing Tool 또는 NUnit Testing Framework으로 작업하고 싶습니다. 그런 다음 테스트 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Test with NCover (NUnit을 사용하는 동안) 테스트를 실행하고 내 객체 및 테스트 각각에 적용되는 코드 백분율을 알려줍니다.

적어도 98 %의 코드 커버리지로 인한 코드 커버리지를 확인하면 코드가 잘 테스트 될 것입니다.

+1

나는 이것에 동의하지 않을 것이다. 코드 적용 범위는 매우 오해의 소지가 있습니다. 모든 호출을 모의 처리 한 다음 Assert.IsTrue (1 == 1)이면 실제 테스트없이 100 % 코드 커버리지를 얻을 수 있습니다. 나는 당신이 모든 기지에 충돌했는지 확인하는 데 좋은 정신 체크라고 당신에게 동의 할 것이다. 그러나 당신이 그들을 잘 때리는 것을 보장하지는 않는다. –

+2

개인적으로, 나는 각 코드를 치려고 시도하지 않을 것이다. 내 주장에'Assert.IsTrue (1 == 1) '과 같은 가짜 어설 션은'Assert.Pass()'와 같을 것이다. 이것은 실제로 의미가 없습니다. 코드 적용 범위를 사용할 때, 아직 테스트에 부딪치지 않은 것을보고, 테스트를 잘 수행하기 위해 가능한 최선의 테스트를 정교하게 작성합니다. 어쨌든, 당신의 주장과 함께, 나는 당신에게 동의하는 것보다 더 잘할 수 없습니다. 나는이 방법을 보지 않았다. =) –

1

Pex을 살펴 보는 것이 좋습니다. 원하는 단위 테스트를 생성하는 데 도움이 될 수 있습니다. 즉, 여러 가지 잠재적 인 경로와 결과에 대해 메소드와 반환 값을 계산할 수 있습니다.

1

그 테스트는 정상적으로 보입니다. SetNewRandomValue에 대해 실제로 주장 할 수있는 유일한 이유는 Value 구성원이 이후에 할당된다는 것입니다. GenerateDouble으로 전화를 조롱하고 Value에 예상 숫자가 포함되어 있는지 확인 했으므로 좋을 것입니다.

1

단위 테스트를하지 않아도 확실히 테스트 할 수 있습니다. IMHO, 코드 검사는 완벽하게 유효한 테스트 방법입니다. 당신은 일반적으로 속성 setters/getters 같은 것들을 테스트하지 않습니다, 나는이 방법은 충분히 동일한 이유로 단위 테스트를 피하기 위해 간단하다고 생각합니다.

당신이 정말로 테스트하고 싶다면 여기에 내가 할 일이 있습니다 : 나는 한 번만 5가 아니라 몇 가지 값으로 테스트 할 것입니다. (SetNewRandomValue는 this.value = 5;으로 구현 될 수 있습니다. pass). 정수가 아닌 숫자로 테스트하여 거기에 정수에 캐스트를 홀수가 아닌지 확인합니다.

실제로 구현 세부 사항을 테스트하고 있지만 적절한 매개 변수로 GenerateDouble을 호출하고 있는지 테스트 할 수 있습니다. (SetNewRandomValue는 numberGenerator.GenerateDouble(0, interval.max - interval.min) + interval.min;으로 구현 될 수 있으며 테스트에서는 실패하지 않아야합니다.) 실제 임의 숫자 생성기를 사용하고 수천 번 SetNewRandomValue를 수행하고 값이 예상 범위에 고르게 분포하는지 테스트 할 수 있습니다.

0

테스트 방법에 대답하려면 원하는 동작을 설명 할 수 있어야합니다.

코드를 보면 "Gene.SetNewRandomValue"가 self.Value을 생성자에 전달 된 간격에 해당하는 숫자로 설정한다고 가정합니다.

나는 Mock 클래스에 익숙하지 않으므로 기본이 아닐 수도 있지만 테스트하지 않는 것 같습니다. 구현시이 오타가있는 경우 어떻게해야합니까?

double newValue = numberGenerator.GenerateDouble( 
         genesValuesInterval.MinimumValue, 
         genesValuesInterval.MinimumValue 
         ); 

테스트를 통과하지 않았습니까?

1

NumberGenerator.GenerateDouble이 지정된 간격을 벗어난 값을 반환하면 Gene.SetNewRandomValue의 예상되는 동작을 문서화하고 확인하는 테스트를 작성할 수도 있습니다.
첫번째 매개 변수와 genesValuesInterval.MinimumValuenumberGenerator.GenerateDouble 호출 ,
과 함께 genesValuesInterval.MaximumValue 두번째 파라미터로서
해당 호출의 결과에 this.value 설정 :

1

방법은 세 가지 일을한다.

테스트에서는 세 번째 항목을 테스트하지만 첫 번째 항목은 테스트하지 않습니다. mock이 올바른 첫 번째 및 두 번째 매개 변수로 호출되는지 확인하는 두 가지 테스트를 추가로 작성할 수 있습니다.

편집 (아래 코멘트에 대응)이 방법의 의도 된 동작은 미리 지정된 범위 내의 임의의 두 배로 this.value을 설정하는 경우 이 후 상기 세 가지 테스트가 유용하다 (genesValuesInterval 분을 가정하고 최대 이전이다 지정된 수의 범위 내에서 double를 돌려 주도록 (듯이), numberenerGenerateDouble (min, max)를 지정하는 테스트가있는 경우

이 메서드의 의도 된 동작은, this.value를 단지 Double.MinValue, Double.MaxValue), 이는 구현 세부 사항이므로 처음 두 테스트는 불필요합니다.

만약 inted라면

+0

처음 두 가지는 구현 세부 사항입니다. – jason

+0

@ Jason : 단위 테스트는 메소드의 구현 세부 사항을 테스트해야합니다. –

+0

-10과 10이 적절한 매개 변수라고 가정 할 수 없습니다. 0과 20을 전달한 다음 결과로 나오는 double에서 10을 뺍니다. –

관련 문제