2009-10-17 49 views
2

我正在使用PHPUnit,而我的傳統方法是使用模擬對象和由我測試的方法調用的方法。模擬對象被告知單元測試的輸入是什麼。問題是,提供給模擬對象的輸入的一部分是被測試方法隨機生成的(單元測試無法知道它們是什麼)。爲有一定程度的隨機性的方法編寫單元測試

只是想知道是否有人可以提出解決方案。

+0

隨機生成?爲什麼?你在測試一個隨機數發生器組件嗎?如果沒有,我不會看到隨機生成的點。 – 2009-10-17 18:50:56

+0

[單元測試 - 我該如何測試一個返回隨機輸出的函數?]可能的重複(http://stackoverflow.com/questions/2618043/unit-testing-how-do-i-test-a-function-that -returns-random-output) – Raedwald 2016-01-23 15:56:59

回答

2

可以將「隨機部分」注入該方法(或者是隨機性核心功能)?

E.g. (也許是過於簡單化的例子以「隨機」的字面意思),而不是

function foo($x, $y) { 
    return $x * rand(1, $y); 
} 

使用類似

function foo($x, $r) { 
    return $x * $r->getNext(); 
} 

這樣你消除你的測試儘可能多的「隨機性」成爲可能,因爲你可以通過一個$ r的對象並不真正返回隨機值,但是例如邊緣情況。

+0

您也可以在類中使用setter來設置隨機生成器對象。這樣,它不需要是該函數的參數。沿着以下幾行:function foo($ x){$ r = $ this-> getGenerator(); [...]}函數getGenerator(){if(empty($ this-> generator){$ this-> generator = new RandomGenerator();} return $ this-> generator;} – PatrikAkerstrand 2009-10-17 18:55:24

+0

當然,注射是一個選擇的問題 – VolkerK 2009-10-17 19:12:40

+0

我想我會和上面的幾個類似的建議一起,在需要隨機生成的對象上增加一個set方法(所以單元測試可以設置發生器本身並在效果,控制變化)。謝謝大家。 – 2009-10-17 19:30:31

2

不知道自己的具體情況很難說清楚,但也許你可以重構將一些隨機數字提供者注入到被測對象中。在測試過程中,您可以使用硬編碼的隨機數種子來獲得可重現的結果。

+1

這是一個很好的建議......雖然我不確定是否喜歡爲了單元測試而增加複雜性。 – 2009-10-17 18:55:00

0

您不必使用嚴格對待其輸入的嘲笑 - 僅在爲測試增加值時才這樣做。

在其他情況下,使用存根,不關心他們的輸入,或有一些方法是嚴格的,有些是必要的鬆散。

2

如果您有預期結果的地圖,並且您從密鑰集中隨機抽取,則可以獲得一定程度的隨機性,並且仍然能夠預測預期結果是什麼。

+0

+1用於避免真正的隨機性。如果一個失敗的單元測試不能總是被重現,它會降低對該單元測試值的信任 – 2009-10-17 18:49:14

1

我一直認爲單元測試的東西可重複。 (我的意思是每個運行表現相同,並給出相同的結果)。
單元測試還有其他的先決條件,但對我而言,它是最重要的一個。 (看看this very good definition

鑑於此,它可能無法測試你的具體情況。
我會嘗試將你的代碼隨機的東西分離成一個特定的部分。然後,我會將其視爲一個數據源,因此我會試着嘲笑它。

我希望你可以將它應用到你的上下文中。

相關問題