2013-01-03 132 views
8

我想在編寫代碼之前學習如何編寫測試用例。我閱讀了一篇關於測試驅動開發的文章。我想知道開發人員如何編寫測試用例例如,此方法:如何編寫測試用例?

public int divideNumbers(int num1, int num2) 
    { 
     return num1/num2; 
    } 
+1

你知道你已經在測試之前編寫了代碼嗎? :) – Rafal

回答

3

我們現在從一個空白項目開始。你想做點什麼,比如說劃兩個數字。所以,你寫一個測試說明您想做什麼:

Assert.That(divide(10,2), Eq(5)) 

這個測試給你一個切入點:它描述了divide方法可接受的接口。因此,您繼續執行它作爲例如int divide(int x, int y)

寫測試,描述你期望從你的代碼中得到什麼。你不需要考慮太多。編寫期望的最正常方式可能是設計代碼的最佳方式,然後您可以實現它以滿足您的測試。

1

有幾個測試步驟。來自MSDN;

你的情況;

Assert.AreEqual(divideNumbers(8, 4), 2); 

Assert類驗證中使用true/false命題單元測試的條件。你應該寫你的測試用例,你期待他們的結果。您可以使用TestMethod屬性來測試您的測試方法。有一個很酷的帖子關於Creating Unit tests for your c# code。分析得很好。

+0

其實我想問的答案是你從codeproject分享的鏈接。謝謝。 – cihata87

0

從實現理論與實踐的區別開始。

任何現實生活系統都會通過TDD輕鬆創建,而另一些則不是。

最後一組是依賴於環境的一切,當工作在一個不尋求抽象環境假設但實際接受這些假設的系統上時。

該組可以採用TDD方式進行開發,但需要對軟件工廠進行額外的工具和擴展。

對於.Net這將是工具和擴展,如MS虛擬測試實驗室和SpecFlow。

我想溝通的是它取決於

對於非常簡單的組件/單元測試,想法是編寫一個失敗的測試用例,然後編寫要測試的代碼,並在測試成功運行時結束開發。

對於集成測試和超越(系統測試),除了考慮測試什麼以外,還需要考慮如何將測試環境帶入某種已知狀態。

1

從您想要開發的函數/類/組件的存根開始。它應該編譯,但是故意不(它)做它應該做的事情。

例如:

public int divideNumbers(int num1, int num2) 
{ 
    throw new NotImplementedException(); 
} 

return -42; 

想一想預期的行爲,治療存根以黑盒的接口。不關心實現(還)。想想接口的「契約」:X進去了,Y出去了。

確定標準案例和重要egde案件。爲他們寫測試。

對於整數除法(假設我們會從頭開始寫),實際上有相當多的情況需要考慮:有和沒有餘數,n/1,n/0,0/n,0/0,負數等。

Assert.IsTrue(divideNumbers(4,4) == 1); 
Assert.IsTrue(divideNumbers(4,3) == 1); 
Assert.IsTrue(divideNumbers(4,2) == 2); 
Assert.IsTrue(divideNumbers(4,1) == 4); 
Assert.Throws<ArgumentException>(() => divideNumbers(4,0)); 

Assert.IsTrue(divideNumbers(0,4) == 0); 
Assert.Throws<ArgumentException>(() => divideNumbers(0,0)); 

Assert.IsTrue(divideNumbers(4,-2) == -2); 
Assert.IsTrue(divideNumbers(-4, 2) == -2); 
Assert.IsTrue(divideNumbers(-4,-2) == 2); 

Assert.IsTrue(divideNumbers(4,-3) == -1); 
Assert.IsTrue(divideNumbers(-4, 3) == -1); 
Assert.IsTrue(divideNumbers(-4,-3) == 1); 

編譯並運行單元測試。他們都失敗了嗎?如果不是,爲什麼?也許其中一個測試不按預期工作(測試也可能是越野車!)。

現在開始實施,直到沒有測試失敗了。

相關問題