2012-04-05 2 views
1

나는 진화론 적 알고리즘을 실험하기위한 패키지를 코딩하고 있으며, 말할 것도없이 많은 확률 론적 방법을 포함하고있다. 이제이 패키지에 대한 (doc) 테스트를 작성하여 모든 것이 작동하는지 확인할 수 있지만 테스트가 단순히 "대부분의 시간"에 해당해야하는 상황에 처하게됩니다. 아마 내가 잘못된 방향으로 접근하고있는 것처럼 느껴지 겠지만, 이것에 대한 여러분의 생각을 듣고 싶습니다. 그런확률 론적 함수에 대한 테스트 작성하기

>>> a = Genome() 
>>> b = Genome() 
>>> a.mutate() 
>>> a != b 
True # Well, most of the time. 

구현 테스트는 테스트가 때때로 모든 것이 작동하는 동안 실패 할 것을 의미 :

예를 들어, 내 doctest를이 같은 뭔가가있다.

나는 테스트를 수행하기 전에 RNG 종자를 해결하기 위해 제안을 읽을 수 있지만 그때는 모든 테스트가 예상 결과를 포함해야하기 때문에 내가 테스트를 쓸 수 전에 작동하는지 확인해야합니다.

+1

'대부분의 시간'으로 원하는 것을 알고 있습니까? 그것이 1 % 이상이면, 당신은 당신의 유닛에서 100 개의 답을 생성 할 수 있고, 당신이 원하는 것과 1 또는 2를 넘지 않도록 할 수 있습니다. – Zenon

+0

@ Zenon 그러나 통계적으로, 때때로 그 최소 백분율 이상이 될 수 있기 때문에 테스트가 여전히 실패 할 수 있습니다. – noio

+0

확률 론적 기능에 대한 테스트를 식별해야하며, 실패한 경우 적절한 임계 값으로 테스트를 다시 실행하십시오. – Zenon

답변

1

무시할 수있는 가능성을 줄 수 있습니다. 예 :

a = Genome() 
genomes = [] 
for i in range(100): 
    b = Genome() 
    b.mutate() 
    genomes.append(b) 
assert any(a != b for b in genomes) 

원래 테스트가 대부분 성공한 경우이 테스트는 항상 실용적인 목적으로 계속 수행됩니다.

이 테스트는 또한 일치가 허용되는 게놈의 수에 대해 합리적인 제한을 부과 할 수 있습니다.

아마도이 테스트는 원래 것보다 좋지 않습니다. 어쩌면 doctest를 사용하는 것은 잘못된 접근법 일 수 있으며 별도의 단위 테스트를 작성해야합니다.

+0

그렇다면 좋은 이유없이 실패 할 가능성은 희박합니다. – noio

+0

@Noio : 이론적 인 질문보다 실용적입니다. 예를 들어 원래 테스트에서 사례의 10 %가 실패한 경우이 테스트는 10^100 건 중 하나에서 실패합니다. 실제로 그것은 결코 그렇지 않습니다. –

관련 문제