2013-04-09 76 views
0

我目前的項目是相當複雜,做了很多數學,其中我不知道預先的結果。我正在編寫單元測試(在JUint中);我現在有一些我已經寫過的測試,然後我親自看看結果是否看起來是正確的,但是因爲我的程序是我如何確定複雜數學的結果,所以我沒有真的很確定我如何驗證準確性。測試代碼在哪裏你不知道輸出提前

我還有其他單元測試用於測試代碼的很小部分,但我不確定如何爲它的更大塊編寫測試。任何人有任何想法和指導?

多一點信息,它不是一個數字。更類似於:「輸入:100,000行csv數據」輸出「csv分析100,000」。但是這些行依賴於對方,在10行csv數據上運行代碼不足以實現有意義的數學運算。

+0

您是否瞭解正確的範圍可能是什麼? – 2013-04-09 21:16:57

+0

@JasonSperske我添加了另一句話來試圖回答這個問題 – durron597 2013-04-09 21:19:13

+0

對於誰接近投票表達這個問題,這是一個真正的問題,有幾個真正的答案。只是因爲沒有代碼並不意味着它不是真實的。 – durron597 2013-04-10 01:46:50

回答

5

做數學要求你是數學家,即使你是一個非常糟糕的人。沒有辦法繞過它。考慮到這一點,這裏有一些方法數學家用它來檢查自己的答案:

  • 派生輸入從答案,迫使你向後認爲。
  • 使用不同的方法得到相同的答案。
  • 將此問題分解爲更小,更容易驗證的步驟
  • 嘗試在現實世界中使用結果,並觀察是否有不好的事情發生。

如果你知道你的程序應該輸出什麼答案,那麼你可以檢查你的程序是否接近正確的答案,然後希望它是正確的,並將其用於你的單元測試。但根據我的經驗(遊戲開發),真實的核心數學是檢查自己最可靠的方法。此外,您還可以在您的指尖上使用世界上最先進的計算器之一。 :)

P.S.不要忘記在你的單元測試中留下一些變化。尤其是在進行更高級的數學運算時,有多種正確的方法可以使浮點算術給出稍微不同的答案。

+0

我不是一個非常糟糕的數學家;我其實認爲該程序現在正確運行。我只想進行單元測試,所以我可以肯定...:p – durron597 2013-04-09 21:30:24

+0

基本上我想說的是,數學需要知識和紀律以確保您得到正確的答案。我想這也有助於使用更多數學來檢查你的答案......我會將其添加到我的答案中。 – 2013-04-09 21:37:17

+0

我沒有使用浮點算法,我使用'BigDecimal'和'divide(...,MathContext.DECIMAL64)' – durron597 2013-04-09 21:39:55

1

您應該能夠選擇特定的輸入並對這些輸入有預期的結果。如果你不能手工完成一些測試用例結果,你應該將你正在測試的部分分解成多個可測試的部分。您也可以在測試中使用不同的技術來解決數學問題,然後在測試項目中。這個問題是,如果他們不同,哪一個是錯誤的,但至少你知道該找什麼。

+0

數學難度較大,而且有很多。這實際上是非常簡單的計算......但是需要大量的迭代和輸入數據 – durron597 2013-04-09 21:24:34

+0

@ durron597然後,我會找到一些重要的數據點併爲每個數據點找出答案。也許在電子表格上。對不起,沒有神奇的答案 – cmd 2013-04-09 21:55:39

0

這很大程度上取決於你正在做的數學類型。例如,如果你正在求解微分方程,那麼你會驗證你得到的結果與步長的一半相同,或者你將結果與一個已知的精確(但很慢)的方法(如反向歐拉方法)進行比較。

不知道你在做什麼數學類型,我假設你正在使用雙精度算術。嘗試將結果與BigDecimal等任意精度庫進行比較,以驗證您沒有遇到很多舍入和截斷錯誤。

+0

我所做的一切都在BigDecimal – durron597 2013-04-09 21:18:52

0

下面的建議是可能有點微不足道:

  • 儘量提供輸入,輸出可以預期(所有的零數據,除了一個值都爲零的數據等)
  • 如果可能的嘗試爲您手動執行的部分檢查編寫代碼並在大量/多個輸入上運行
  • 使用不同算法(或由不同開發人員)再次執行代碼並交叉檢查兩個實現
  • 對於小規模,手動檢查運行查看代碼覆蓋範圍(例如, le與Jacoco http://www.eclemma.org/jacoco/)並嘗試修改輸入/創建新輸入以增加代碼覆蓋範圍