我正在使用PHPUnit,而我的傳統方法是使用模擬對象和由我測試的方法調用的方法。模擬對象被告知單元測試的輸入是什麼。問題是,提供給模擬對象的輸入的一部分是被測試方法隨機生成的(單元測試無法知道它們是什麼)。爲有一定程度的隨機性的方法編寫單元測試
只是想知道是否有人可以提出解決方案。
我正在使用PHPUnit,而我的傳統方法是使用模擬對象和由我測試的方法調用的方法。模擬對象被告知單元測試的輸入是什麼。問題是,提供給模擬對象的輸入的一部分是被測試方法隨機生成的(單元測試無法知道它們是什麼)。爲有一定程度的隨機性的方法編寫單元測試
只是想知道是否有人可以提出解決方案。
可以將「隨機部分」注入該方法(或者是隨機性核心功能)?
E.g. (也許是過於簡單化的例子以「隨機」的字面意思),而不是
function foo($x, $y) {
return $x * rand(1, $y);
}
使用類似
function foo($x, $r) {
return $x * $r->getNext();
}
這樣你消除你的測試儘可能多的「隨機性」成爲可能,因爲你可以通過一個$ r的對象並不真正返回隨機值,但是例如邊緣情況。
您也可以在類中使用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
當然,注射是一個選擇的問題 – VolkerK 2009-10-17 19:12:40
我想我會和上面的幾個類似的建議一起,在需要隨機生成的對象上增加一個set方法(所以單元測試可以設置發生器本身並在效果,控制變化)。謝謝大家。 – 2009-10-17 19:30:31
不知道自己的具體情況很難說清楚,但也許你可以重構將一些隨機數字提供者注入到被測對象中。在測試過程中,您可以使用硬編碼的隨機數種子來獲得可重現的結果。
這是一個很好的建議......雖然我不確定是否喜歡爲了單元測試而增加複雜性。 – 2009-10-17 18:55:00
您不必使用嚴格對待其輸入的嘲笑 - 僅在爲測試增加值時才這樣做。
在其他情況下,使用存根,不關心他們的輸入,或有一些方法是嚴格的,有些是必要的鬆散。
如果您有預期結果的地圖,並且您從密鑰集中隨機抽取,則可以獲得一定程度的隨機性,並且仍然能夠預測預期結果是什麼。
+1用於避免真正的隨機性。如果一個失敗的單元測試不能總是被重現,它會降低對該單元測試值的信任 – 2009-10-17 18:49:14
我一直認爲單元測試的東西可重複。 (我的意思是每個運行表現相同,並給出相同的結果)。
單元測試還有其他的先決條件,但對我而言,它是最重要的一個。 (看看this very good definition)
鑑於此,它可能無法測試你的具體情況。
我會嘗試將你的代碼隨機的東西分離成一個特定的部分。然後,我會將其視爲一個數據源,因此我會試着嘲笑它。
我希望你可以將它應用到你的上下文中。
隨機生成?爲什麼?你在測試一個隨機數發生器組件嗎?如果沒有,我不會看到隨機生成的點。 – 2009-10-17 18:50:56
[單元測試 - 我該如何測試一個返回隨機輸出的函數?]可能的重複(http://stackoverflow.com/questions/2618043/unit-testing-how-do-i-test-a-function-that -returns-random-output) – Raedwald 2016-01-23 15:56:59