2010-12-03 52 views
5

我現在有以下方法:哪些測試可以用於這個小方法?

public void SetNewRandomValue() { 
    double newValue = numberGenerator.GenerateDouble(
          genesValuesInterval.MinimumValue, 
          genesValuesInterval.MaximumValue 
          ); 

    this.value = newValue; 
} 

應該是什麼決定多少測試的準則(和測試),使這種方法?我目前已經完成了以下工作(僅在實施該方法後 - 即不是測試優先):

var interval = new Interval(-10, 10); 
var numberGeneratorMock = new Mock<INumberGenerator>(MockBehavior.Strict); 
var numberGenerator = numberGeneratorMock.Object; 

double expectedValue = 5.0; 

numberGeneratorMock.Setup(ng => 
     ng.GenerateDouble(interval.MinimumValue, interval.MaximumValue)) 
     .Returns(expectedValue); 

var gene = new Gene(numberGenerator, 0, new Interval(-10, 10)); 
gene.SetNewRandomValue(); 

Assert.AreEqual<double>(expectedValue, gene.Value); 

基本上只是測試一種情況。迴歸測試我會說,我想不出一種混淆代碼的方式,將它變成不正常運行的代碼,並且仍然通過測試,也就是說,我認爲該方法看起來不錯。

你對此有什麼看法?你將如何處理這個小方法?

感謝

+1

我擔心發佈這個解決方案,因爲我絕不是單元測試的神。但是,如果您已經充分測試了您的號碼生成器,並從基因值中檢索了最小/最大值,那麼我會停下來。如果你知道這些工作,所有你會測試的是this.value被設置。 – 2010-12-03 20:04:01

+0

「Gene」構造函數中的第二個參數是什麼? – 2010-12-03 20:58:23

回答

2

我會檢查代碼覆蓋率無論您使用的測試工具,如果代碼覆蓋率可用於您的測試框架。

我個人喜歡使用Microsoft Testing ToolNUnit Testing Framework。然後,我可以右鍵單擊我的測試項目和Test with NCover(同時使用NUnit),它將運行測試並告訴我爲每個對象和測試覆蓋的代碼的百分比。

我說,當您完成代碼覆蓋率檢查時,至少會覆蓋98%的代碼覆蓋率,您的代碼很可能會得到很好的測試。

+1

我不同意這一點。代碼覆蓋率非常非常誤導。你可以模擬你所有的呼叫,然後Assert.IsTrue(1 == 1),你將有100%的代碼覆蓋率,沒有實際的測試。我同意你的看法,確保你已經擊中了所有的基地,這是一個很好的理智檢查,但它並不能保證你擊中他們。 – 2010-12-03 20:10:08

1

我建議看看Pex - 它確實可以幫助您生成您正在尋找的單元測試(即找出給定方法和返回值的不同潛在路徑和結果)。

1

該測試看起來不錯。您實際上可以斷言SetNewRandomValue的唯一一件事是之後分配了Value成員。您已嘲笑撥打電話GenerateDouble並確認Value包含預期號碼,所以您應該很好。

1

你絕對可以爲單元測試這個情況。恕我直言,代碼檢查是一種完全有效的測試方法。你通常不會測試像屬性setter/getters這樣的東西,我認爲這種方法很簡單,可以避免出於同樣的原因進行單元測試。這就是說,如果你真的想測試它,我會這樣做:我會用一些值來測試它,而不是隻用一次來測試它。(SetNewRandomValue可以實現爲this.value = 5;,它不應該)我會用一個非整數來測試它,以確認那裏沒有古怪的轉換爲整數。

您可以測試它是否使用正確的參數調用GenerateDouble,儘管這實際上是測試實現細節。 (SetNewRandomValue可以實現爲numberGenerator.GenerateDouble(0, interval.max - interval.min) + interval.min;,這應該不會失敗)。您可以使用一個真正的隨機數生成器,並執行幾千次SetNewRandomValue,並測試這些值是否均勻分佈在您的預期範圍內。

0

要回答如何測試它,你應該能夠描述什麼是所需的行爲。

看着你的代碼,我假定「Gene.SetNewRandomValue」應該設置self.Value爲落在傳遞給構造函數的Interval中的數字。

我對Mock類並不是非常熟悉,所以我可能會脫離基礎,但看起來您並未測試它。如果你的實現有這個錯字呢?

double newValue = numberGenerator.GenerateDouble( 
         genesValuesInterval.MinimumValue, 
         genesValuesInterval.MinimumValue 
         ); 

您的測試是否仍然通過?

1

NumberGenerator.GenerateDouble返回的值超出指定的時間間隔時,您也可以編寫一個測試文檔(並驗證)Gene.SetNewRandomValue的預期行爲。

1

的方法是做三件事情:
調用numberGenerator.GenerateDoublegenesValuesInterval.MinimumValue作爲第一個參數,
genesValuesInterval.MaximumValue作爲第二個參數,
和設置this.value到調用的結果。

您的測試測試了這些事情的第三個,但不是前兩個。你可以再寫兩個測試,用正確的第一個和第二個參數檢查模擬。

編輯(響應的評論如下): 如果此方法的預期行爲是設置this.value到一個預先指定的範圍內的隨機雙,則上述三個測試是有用的(假設genesValuesInterval min和max是先前指定的範圍內,並且您有測試來聲明該numberGenerator.GenerateDouble(min,max)在指定範圍內返回一個雙精度值。

如果此方法的預期行爲只是將this.value設置爲一個隨機double Double.MinValue,Double.MaxValue),那麼前兩個測試是不必要的,因爲這只是一個實現細節。

如果發現

相關問題