2012-04-05 66 views
1

我正在編寫一個用於試驗演化算法的軟件包,不用說,它包含大量的隨機方法。現在,我想爲這個軟件包編寫一些(doc)測試,這樣我就可以驗證一切正常,但是我遇到了測試應該在「大部分時間」都是真實的情況。這感覺就像我可能接近這個錯誤的方式,但我仍然想聽聽你的一些想法。爲隨機函數編寫測試

例如,我在我的文檔測試是這樣的:

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

那樣實現測試意味着測試有時會失敗,而一切工作。

我讀的建議做測試之前修復RNG種子,但隨後我會確保一切正常之前我可以寫測試,由於測試應包括預期的結果。

+1

你知道'大部分時間'你想要什麼嗎?如果它至少爲1%,那麼你可以在你的單位生成100個答案,並確保不超過1或2不同於你想要的。 – Zenon 2012-04-05 14:35:51

+0

@Zenon但從統計上看,有時候會超過這個最低百分比,所以它可能仍然不能通過測試。 – noio 2012-04-05 20:45:14

+0

你應該確定你對隨機函數的測試,如果失敗了,再次運行測試,並有合理的閾值。 – Zenon 2012-04-05 20:52:18

回答

1

您可以使其失敗的概率可以忽略不計,例如,

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

如果您的原始測試成功大部分時間,這個人會永遠成功所有的實際目的。

該測試還可以對允許匹配的基因組數量施加合理的限制。

可以說這個測試的讀數比原來的要好。也許使用doctests在這裏是錯誤的方法,你應該編寫單獨的單元測試。

+0

因此,它是可能的(雖然不太可能)因爲它沒有好的理由而失敗是可原諒的? – noio 2012-04-05 20:48:25

+0

@Noio:這比理論問題更實用。如果您的原始測試失敗,例如10%的情況下,這一個將失敗在10^100個案例中的一個。在實踐中,這從來沒有。 – 2012-04-06 13:50:01