2010-03-06 6 views
8

예 클래스 :끝없는 가능성을 테스트하거나 설명하는 방법은 무엇입니까? 의사의

class SumCalculator 
    method calculate(int1, int2) returns int 

이를 테스트 할 수있는 좋은 방법은 무엇입니까? 즉, 내가 필요한 행동을 어떻게 기술해야합니까?

test1: canDetermineSumOfTwoIntegers 

또는

test2: returnsSumOfTwoIntegers 

또는

test3: knowsFivePlusThreeIsEight 

는 Test1을하고 Test2를 모호 보인다 그리고 그것은 특정 계산을 테스트해야합니다, 그래서 정말 테스트되고 있는지 설명하지 않습니다. 그러나 test3는 매우 제한적입니다.

이러한 클래스를 테스트하는 좋은 방법은 무엇입니까?

답변

10

나는 경계 조건 (최대-INT, 분-INT, 영, 긍정적, 부정적)과 전형적인 사례를 테스트하는 것입니다 :

test1: sumOfPosAndPos 
test2: sumOfPosAndNeg 
test3: sumOfPosAndZero 
test4: sumOfNegAndZero 
test5: sumOfMaxIntAndMinInt 

+1

어쩌면 sumOfMaxIntAndMaxInt을 추가하고 실패를보고하는 기능을 확인합니다. 이것은 제가 생각할 수있는 가장 경계적인 경우입니다. – pmr

+0

sumOfMaxIntAndOne도 예외가 발생해야합니까? 그것은 또 다른 좋은 사례 일 것입니다. 그렇지 않으면 동의합니다. 약간 다른 가능성을 생각해보십시오. –

+1

부정적인 테스트 케이스를 잊지 마라. test6 : sumOfStringAndPositive (예외를 발생 시키거나 에러를 리턴해야한다) –

5

몇 가지 철학이있다. The Art of Unit Testing의 저자 인 Roy Osherove는 prefer using explicit values으로 보이고 각 Equivalence Class의 가장 낮은 (또는 가장 단순한) 표현을 선택합니다.

이 원칙은 귀하의 예에 특히 잘 적용되지 않지만 다른 많은 시나리오에서 실제로 잘 작동합니다.

예를 들어, 클래스가 양의 정수를 입력해야하는 경우 숫자가 이므로 모든 양수 중 개 부분 중 가장 간단한 표현이므로 선택하십시오.

개인적으로 나는 오히려 Constrained Non-Determinism이라는 원칙을 선호합니다. 여기서 중요한 점은 주어진 유형에 대한 일종의 공장에서 익명 변수를 제공한다는 것입니다. 테스트에서 관계를 직접 설정해야하기 때문입니다.

는 내가 (하지만 당신은 또한 다른 뭔가를 사용할 수 있습니다) 이렇게 AutoFixture을 사용하고

, 나는이 같은 SumCalculator 테스트 것이 경우에, 그래서 : 원칙적으로

var fixture = new Fixture(); 
var int1 = fixture.CreateAnonymous<int>(); 
var int2 = fixture.CreateAnonymous<int>(); 
var expectedResult = int1 + int2; 
var sut = fixture.CreateAnonymous<SumCalculator>(); 

var result = sut.Calculate(int1, int2); 

Assert.AreEqual(expectedResult, result); 

을이 하나의 시험은 제공 Calculate 메서드의 경우 지정 우리는 int1int2의 값이 무엇인지 결코 알지 못하며 실제로는 중요하지 않은 많은 경우에 매우 적합합니다.

3

만약 당신이 수학 함수를 테스트한다면, 저는 역함수에 대해 테스트해야한다고 제안합니다 : 예를 들어 x = a + b를하는 함수의 경우 ax = -b와 xb = a를 테스트해야합니다 이것은 단지 일러스트레이션을위한 것입니다. 물론 모든 경우에 작동하지는 않습니다.

1

또 다른 대안은을 복제본을 제거하기 위해 Parameterized Test Case을 사용하는 것입니다.기본적으로 테이블에는 튜플 형식 ([term1, term2, sum])으로 테스트에 대한 모든 데이터가 들어 있고, 테스트 케이스는 테이블의 행을 테스트하기 위해 매개 변수화 된 테스트 케이스를 호출 할 때 테이블을 반복합니다.

I 여기에 음수 (오버플로) 테스트가 추가됩니다. calculate(MAXINT, 1)은 무엇을 반환해야합니까?

1

이론 시험에 참조 데이비드 SAFF의 작품; here (PDF)이 그 예입니다. 그리고 시험과 그 주장을 표현하는 - 이것은 기본적으로 (그 기능의 반대되는 기능 같은) 뭔가 (모든 가능한 값의 세트를 포함) 일부 세트의 모든 값에 대한 사실이라고 주장을 만드는 방법입니다. 무작위로 선택된 값으로 테스트를 실행하고 (세트가 너무 길어서 철저히 실행될 수없는 경우) 특정 실패를 자동으로 특정 구체적인 회귀 테스트로 기록하여 재미있는 작업을 수행 할 수 있습니다.

관련 문제