2014-05-10 28 views
1

我今天給了TDD一個認真的嘗試,並發現它非常有幫助,符合所有的好評。如何測試數學相關單位?

在我追求的練習要在其中學習Python和TDD我已經使用了TDD技術開始代碼SPOJ練習和我在一個問題已經到了:

鑑於所有的SPOJ的訓練大多是應用數學編程;如何測試TDD時尚的數學程序?取樣已知的正確數據?測試一個已知的實現?

我發現使用問題本身給出的示例數據是有價值的,但它感覺有點過分,因爲您可以使用控制檯如此快速地進行測試,更不用說以可測試的方式設計算法的開銷(代理stdout和stdin對象對於一個非常小的獎勵來說是無足輕重的),雖然它很好,因爲它會迫使你用可測試的術語來思考你的解決方案,我想我可能會在這方面嘗試太多的努力。

歡迎所有指導

+0

」樣本已知的正確數據?「是。 「針對已知的實現進行測試?」是。 –

+0

「代理stdout和stdin對象」 - 你不需要那樣做。把你的代碼分解成處理IO(解析和格式化)的組件和核心算法。 –

+0

@OliCharlesworth在這方面,我想出了這個:http://pastebin.com/vPZKeJEX – Machinarius

回答

0

使用您知道結果(輸出)的樣本輸入。使用等價劃分來確定一組合適的測試用例。使用數學代碼,您可能會發現無法像其他代碼一樣實現增量式:您可能需要多個測試用例來實現每次增量式改進。我的意思是,非數學代碼通常可以被認爲具有一組「特徵」,並且您可以一次實現一個特徵,但是數學代碼並不像那樣。

+0

請問我可以對「漸進式改進」做一些解釋嗎? – Machinarius

0

測試所有邊緣情況。當輸入由於某種原因而特殊時,您的程序很可能會失敗:負值或零值,非常大的值,相反的輸入,空輸入。您可能還需要進行一些破壞性測試,以確定事情在事情破裂或停頓之前能夠投入多大。

Sphere online Judge可能不是TDD的最佳選擇。一方面,輸入數據可能比真人可能表現得更好。其次,在某些問題上存在代碼大小限制。一個廣泛的測試套件可能會讓你超過這個限制。

+0

這些測試僅供我個人使用,SPOJ提交的內容只是代表問題的代碼而已。 – Machinarius

+0

令人敬畏的建議,謝謝。不能標記爲答案,因爲這主要是一個懸而未決的問題 - 令人驚訝的是它沒有被標記爲一個 – Machinarius

0

您可能想看看Bob叔叔的「Transformation Priority Premise」。它提供了一些關於如何選擇一系列測試來測試驅動算法的指導。 「