2012-04-05 26 views
1

私は進化的アルゴリズムを実験するためのパッケージをコーディングしていますが、言うまでもなく多くの確率的方法が含まれています。さて、私はこのパッケージのいくつかの(doc)テストを書いてみたいので、すべてがうまくいくことを確認できますが、テストが本当に「ほとんどの時間」に当てはまる状況に遭遇します。私はおそらくこれに間違ったやり方で近づいているように感じますが、私はまだこれについてあなたの考えを聞きたいと思います。例えば確率関数のテストを書く

、私は私のdoctestをにこのようなものを持っている:

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

はそのようなテストはすべてが動作している間にテストが時々失敗することを意味する実装。

私がテストを行う前に、RNGシードを修正するための提案を読んで、その後私はすべてがテストが期待される結果を含める必要があるため、私は、テストを書くことができます前を動作することを確認する必要があります。

+1

あなたは「ほとんどの時」であなたが望むものを知っていますか?それが少なくとも1%であれば、ユニット内で100個の回答を生成し、1〜2個の回答があなたの望むものと異なることを確認できます。 – Zenon

+0

@ Zenonしかし、統計的には、その最小パーセンテージ以上になることがありますので、テストに失敗することがあります。 – noio

+0

確率的関数に関するテストを特定し、失敗した場合は、妥当なしきい値で2回目のテストを実行してください。 – 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ケースのうち1つで失敗します。実際には、それは決してありません。 –

関連する問題