임의성을 사용하는 단위 테스트 함수에 대한 모범 사례 기술에 관심이 있습니다. 명확하게하기 위해 난 이 아니며 난수 생성기의 분포를 테스트하는 데 관련된이 아닙니다. 장난감 예를 들어 임의성을 사용하는 함수를 단위 테스트하는 방법은 무엇입니까?
,의이 기능을 살펴 보자 : this question에// Returns a random element from @array. @array may not be empty.
int GetRandomElement(int[] array);
답변은 우리가 의미가 난수의 모의 소스를 삽입 할 수 있음을 시사한다. 하지만 모의 사용 방법을 정확히 모르겠습니다. 예를 들어, 우리는이 인터페이스를 가지고 있다고 가정하자 :
// A mock-friendly source of randomness.
interface RandomnessSource {
// Returns a random int between @min (inclusive) and @max (exclusive).
int RandomInt(int min, int max);
}
을 ... 그리고 여기에 GetRandomElement()
의 서명을 변경
// Returns a random element from @array, chosen with @randomness_source.
// @array may not be empty.
int GetRandomElement(int[] array, RandomnessSource randomness_source);
모든 이제 시험처럼 잘 볼 수 있었다
MockRandomnessSource mock = new MockRandomnessSource();
mock.ExpectCall(RandomnessSource::RandomInt(0, 5)).Return(2);
AssertEquals(GetRandomElement({0, 10, 20, 30, 40}, mock), 20);
... 구현이 다음과 같이 보이는 경우에만 작동합니다.
마음에 도약// Less intuitive, but still a conforming implementation.
int GetRandomElement(int[] array, RandomnessSource randomness_source) {
// Pick a random number between [1..n+1), only to subtract 1 from it.
return array.Get(randomness_source.RandomInt(1, array.Length() + 1) - 1);
}
하나 개의 아이디어 우리가 더 같이, 함수의 계약을 제한 할 수 있다는 것이다 :
는 ...하지만 기능 사양의 것도이 같은 구현이 방지되지
// Returns a random element from @array, chosen with @randomness_source by
// by calling @RandomnessSource::RandomInt to pick a random index between
// 0 and the length of @array.
int GetRandomElement(int[] array, RandomnessSource randomness_source);
...하지만 함수 계약에 너무 많은 제한을 두는 인상을 완전히 넘을 수는 없습니다.
RandomnessSource
호출자를 단위 테스트에보다 잘 적용 할 수 있도록 인터페이스를 정의하는 데 더 좋은 방법이 있을지도 모르겠다.하지만 나는 무엇을 어떻게하는지 잘 모르겠습니다.
... 임의성을 사용하는 단위 테스트 기능을위한 최상의 연습 기법 (있는 경우)은 무엇입니까?
"무작위"는 정의하기 어렵습니다. 따라서 질문은 "왜 '무작위'가 필요한가? 예를 들어, GetRandomElement를 테스트하려면 반드시 임의의 소스가 필요하지 않습니다. –
@JamesKPolk 좀 더 자세히 설명해 주시겠습니까? 단위 테스트 GetRandomElement()의 예를 들어 주시겠습니까? –
'RandomnessSource'의 테스트 버전은 범위의 극단에서 값을 반환하고 중간 값으로 반환해야합니다. 원하는 테스트 커버리지에 대한 결정을 내릴 수 있습니다. 결정 론적이지만 "임의"로 보이는 시퀀스를 사용할 수도 있습니다.고정 시드와 함께 java.util.Random 클래스 (Java를 사용하는 경우)와 같은 것을 통합합니다. –