2010-06-18 4 views
25

특히, 메소드가 목록에서 n 개의 항목을 선택하여 그 중 %가 하나의 기준을 충족시키고 b %가 초를 충족시키는 식으로 표시됩니다. 단순화 된 예제는 50 %가 'true'값을 갖는 속성과 50 % 'false'속성을 갖는 5 개의 항목을 선택하는 것입니다. 메소드가 반환 할 시간의 50 %는 2 true/3 false, 나머지 50 %는 3 true/2 false.랜덤 출력을 생성하는 단위 테스트 코드에 가장 좋은 방법은 무엇입니까?

통계적으로 말하자면, 이것은 100 회 이상의 실행에서 약 250 개의 true/250 false를 가져야한다는 것을 의미합니다. 그러나 임의성으로 인해 240/260은 전적으로 가능합니다.

단위 테스트를위한 가장 좋은 방법은 무엇입니까? 기술적으로 300/200가 가능할지라도, 이런 일이 발생하면 테스트가 실패 할 것입니다. 이런 경우에 대해 일반적으로 허용되는 허용 오차가 있습니까? 그렇다면 무엇이 그 값을 결정합니까?

편집 : 나는 일하고있는 코드에서 의사 난수 생성기를 사용하지 않고 시간이 지남에 따라 균형을 잡는 메커니즘을 사용하지 않는다. 다른 컴퓨터에서 생성됩니다. 시간이 지남에 따라 각 기준에 맞는 항목의 평균 수가 필요한 비율로 증가한다는 것을 증명할 수 있어야합니다.

+0

예에서 atleast/정확히 50 % 또는 약 50 %를 원하십니까? 보다 구체적으로이 테스트의 임의성은 무엇입니까? – Gishu

+1

당신이 실제로 단위 테스트를 작성하지 않았다고 생각합니다. 다른 컴퓨터에서 실행되는 서버를 테스트하는 경우 실제로는 시스템 테스트를 거치게됩니다. 이 서버에서 실행되는 클래스에 대한 단위 테스트가있는 경우 더 이상 상세한 시스템 테스트가 필요하지 않습니다. –

+0

아니요, 요점은 알고리즘이 사용 된 장소와 관계없이 알고리즘이 시간의 2/3 50 %를 선택하고 나머지 3/2가이 간단한 예제에서 (이 간단한 예제에서) 확인하는 것입니다. 이것을 생산할 시스템이 하나도 없습니다. 하나의 머신에서 1000 번 실행하는 것은 전세계 100 대의 머신에서 10 번 실행되는 경우 적절하게 평균을 낼 것이라는 것을 증명하는 적절한 테스트로 간주됩니다. 따라서 유닛 테스트를 계획하는 이유입니다. – Flynn1179

답변

22

무작위 및 통계는 단위 테스트에서 선호되지 않습니다. 단위 테스트는 항상과 동일한 결과를 반환해야합니다. 항상. 대부분은 아닙니다.

테스트 할 논리의 임의 생성기를 제거하려고하면됩니다. 그런 다음 무작위 생성기를 조롱하고 미리 정의 된 값을 반환 할 수 있습니다.


추가 생각은 :

당신은 더 테스트 할 수 있도록 구현을 변경 고려할 수 있습니다. 가능한 적은 랜덤 값을 얻으십시오. 예를 들어 평균 분포와의 편차를 결정하기 위해 임의의 값 하나만 얻을 수 있습니다. 이것은 쉽게 테스트 할 수 있습니다. 무작위 값이 0이면 평균으로 예상되는 정확한 분포를 얻어야합니다. 값이 인스턴스 1.0 인 경우 몇 가지 정의 된 요소 (예 : 10 %)만큼 평균을 놓치게됩니다. 또한 Gaussian 분포 등을 구현할 수도 있습니다. 여기서는 주제가 아니라는 것을 알고 있습니다. 그러나 원하는대로 구현할 수 있다면 테스트 가능성을 고려하십시오.

+1

+1 원근감의 변화. –

+0

유효한 단위 테스트로 '값은 Flynn1179

+0

단위 테스트에서 다른 기계가 무엇입니까? –

4

통계 정보에 따르면 특정 단일 값 대신 범위를 결정합니다.

+2

테스트에서 무작위가있는 한 오탐 (false negative)에 대한 거짓 긍정 (false positive) 일 수 있습니다. –

2

"단일"단위 테스트로 결과 분포를 테스트해야합니다. 즉, 결과는 개별 실행에서 가능한 한 원하는 배포판에 가깝게 테스트해야합니다. 예를 들어 2 true/3 false는 OK, 4 true/1 false는 결과로 OK가 아닙니다.

또한 메소드를 실행하는 테스트를 작성할 수 있습니다. 100 배로 분포의 평균이 원하는 비율에 "충분히 근접"하는지 확인합니다. 이것은 경계선의 경우입니다. 큰 배치를 실행하는 데는 상당한 시간이 걸릴 수 있으므로 이러한 테스트를 "일반"단위 테스트와 별도로 실행해야 할 수 있습니다. 또한 Stefan Steinegger가 지적했듯이, 그러한 테스트는 매번 실패 할 것이고 "충분히 가깝다"고 정의한다면, 또는 너무 느슨하게 임계 값을 정의한다면 의미가 없기 시작합니다. 그래서 까다로운 경우입니다 ...

3

테스트 스위트를 사용하는 방법에 따라 다릅니다. 테스트 중심 개발과 적극적인 리팩토링을 채택하여 몇 초마다 실행하면 심각한 혼란을 야기하고 생산성을 낮추므로 거짓으로 실패하지 않는 것이 매우 중요합니다. 따라서 실제로는 불가능한 임계 값을 선택해야합니다 제대로 작동하도록 구현해야합니다.밤에 한 번 테스트를 실행하고 실패를 조사 할 시간이 있다면 훨씬 더 엄격해질 수 있습니다.

잦은 조사가 필요없는 무언가를 배포해야합니다. 테스트 스위트를 사용하는 데 따른 모든 목적을 저해하고 팀의 가치를 크게 떨어 뜨립니다.

4

많은 확률 론적 알고리즘이 예를 들어. 과학적 컴퓨팅은 난수 생성기 대신 pseudo-random number generators을 사용합니다. 비록 그들이 정말로 무작위는 아니지만 신중하게 선택한 의사 - 무작위 번호 생성기는 잘 작동합니다. 의사 - 랜덤 번호 생성기의

장점 중 하나는 그들이 생산 수열이 완벽하게 재현 것입니다. 알고리즘이 결정적이므로 같은 시드은 항상 동일한 시퀀스를 생성합니다. 이것은 종종 실험이 반복 가능하고 결과가 재현 가능해야하기 때문에 처음부터 선택되는 이유입니다.

이 개념은 테스트에도 적용됩니다. 임의의 숫자 소스를 연결할 수 있도록 구성 요소를 설계 할 수 있습니다. 테스트를 위해 지속적으로 시드 된 발전기를 사용할 수 있습니다. 그 결과는 반복 가능하며 테스트에 적합합니다.

주 그 사실에 진정한 난수가 필요한 경우, 당신이 할 수 여전히 테스트 그것을 이런 식으로, 한 구성 요소가 임의의 숫자의 플러그 소스를 제공한다. 테스트 할 때 동일한 구성 요소에 동일한 순서 (필요할 경우 실제로는 무작위 일 수 있음)를 다시 연결할 수 있습니다.

1

만약 당신이 평균/stddev에 관한 통계를 가지고 있다면 같은 문제가 생겼을 때 나는 아마 신뢰 구간을 생성한다고 생각합니다. 그래서 평균 기대 값이 250이면 자신의 경우 평균 분포를 사용하여 95 % 신뢰 구간을 만듭니다. 결과가 해당 간격을 벗어나면 테스트에 실패합니다.

0

more를 볼 이유는 난수 코드를 보자 단위 테스트 프레임 워크와 모두를 사용하는 소스 코드가 아닙니다 다시 요인? 무작위 순서가 아닌 알고리즘을 테스트하려고하십니까?

4

은 적어도 세 가지 일들이 여기에 테스트 할 수있다 나에게 보인다

  1. 임의의 소스
  2. 그건를 사용하여 출력을 생성하는 절차의 정확성 임의 소스의 분포 만약 출력 분포는

1 결정되어야 기대 것을

  • 기대하고 수행 할 수 선택된 세트 O를 공급하여 단위 테스트를 알려진 "올바른"값을 생성하고 알려진 올바른 출력을 생성하는지 확인합니다. 랜덤 소스가 코드에 포함되지 않고 인수로 전달되도록 코드를 구조화하는 것이 가장 쉽습니다.

    2 및 3은 절대적으로 테스트 할 수 없습니다. 선택한 신뢰 수준으로 테스트 할 수 있지만 일부 테스트에서는 실패 할 수 있습니다.아마도 당신이 정말로 바라는 것은 테스트 2가 테스트 2보다 훨씬 자주 실패하는 것입니다. 왜냐하면 이것이 알고리즘이 잘못되었다고 생각하기 때문입니다.

    적용 할 테스트는 예상되는 배포판에 따라 달라집니다. 2의 경우 무작위 소스가 균등하게 분산 될 것으로 예상 할 가능성이 큽니다. 이에 대한 다양한 테스트가 있는데, 어떻게 참여하고 싶은지에 따라 다릅니다 (예 : Tests for pseudo-random number generators on this page).

    예상되는 3의 분포는 생산하는 제품에 따라 크게 달라집니다. 질문의 간단한 50-50 사례는 정확히 testing for a fair coin과 동일하지만 분명히 다른 사례는 더욱 복잡해집니다. 배포본이 무엇인지 알아 내면 chi-square test이 도움이 될 수 있습니다.

  • 0

    먼저 난수 생성 과정에서 어떤 분포가 발생해야 하는지를 알아야합니다. 귀하의 경우에는 확률 -0.5로 0 또는 1 인 결과를 생성하고 있습니다. 이는 p = 0.5 인 binomial distribution을 설명합니다.

    표본 크기가 n 인 경우 평균 주위의 신뢰 구간을 (이전 포스터에서 제안한대로) 구성 할 수 있습니다. 또한 n = 500 일 때 두 결과 중 240 이하를 얻을 확률에 대한 다양한 설명을 작성할 수 있습니다.

    p가 매우 크지 않거나 아주 작지 않은 한 20보다 큰 N 값에 대해서는 정규 분포 가정을 사용할 수 있습니다. Wikipedia 게시물은 이것에 대해 더 많은 것을 가지고 있습니다.

    관련 문제