Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx...
本文以Visual Studio 2010為例,來(lái)介紹如何在Visual Studio里面進(jìn)行單元測(cè)試.
?? ??首先來(lái)介紹普通單元測(cè)試,這是進(jìn)行順序測(cè)試、壓力測(cè)試的基礎(chǔ)。如果在Visual Studio 2010(2008)里面沒(méi)有發(fā)現(xiàn)下圖中的Test菜單,請(qǐng)用Visual Studio安裝光盤(pán)進(jìn)行安裝,因?yàn)閂isual Studio單元測(cè)試插件安裝時(shí)可能不是默認(rèn)選項(xiàng)。
?
?
測(cè)試之前,我們要準(zhǔn)備一些測(cè)試代碼?;蛘邚南旅娴逆溄酉螺d完整的項(xiàng)目工程。
http://download.csdn.net/source/3014236
新建一個(gè)名為AppSample的Lib。里面有一個(gè)MathUtility文件,包含加減乘除四個(gè)方法。代碼如下:
namespace?TJVictor.UT.AppSample
{
????public?class?MathUtility
????{
????????public?MathUtility() { }
?
????????public?static?int?Add(int?a,?int?b)
????????{
????????????return?a + b;
????????}
?
????????public?static?int?Minus(int?a,?int?b)
????????{
????????????return?a - b;
????????}
?
????????public?static?int?Divide(int?a,?int?b)
????????{
????????????return?a / b;
????????}
?
????????public?static?int?Multiply(int?a,?int?b)
????????{
????????????return?a * b;
????????}
????}
}
?
創(chuàng)建單元測(cè)試項(xiàng)目有兩種方法:
1.直接創(chuàng)建單元測(cè)試項(xiàng)目:File->New->Project->Test Project.?如下圖:
?
?
2.?直接在需要?jiǎng)?chuàng)建單元測(cè)試的函數(shù)上創(chuàng)建:右擊函數(shù)名->Create Unit Tests。?如下圖
?
?
?????????這樣就創(chuàng)建好了單元測(cè)試項(xiàng)目。Visual Studio?會(huì)自動(dòng)生成一個(gè)單元測(cè)試工程。推薦使用第二種方法創(chuàng)建,因?yàn)榈谝环N方法創(chuàng)建的只有單元測(cè)試工程,第二種方法會(huì)把單元測(cè)試函數(shù)也一起創(chuàng)建了出來(lái)。
?
本文以第二種創(chuàng)建的方式為例,繼續(xù)下一步,講解單元測(cè)試文件。
創(chuàng)建好的單元測(cè)試工程如下圖:
?
其中MathUtilityTest.cs就是自動(dòng)生成的單元測(cè)試文件,打開(kāi)可以看到類似如下代碼。
????????[TestMethod()]
????????public?void?AddTest()
????????{
????????????int?a = 0;?// TODO: Initialize to an appropriate value
????????????int?b = 0;?// TODO: Initialize to an appropriate value
????????????int?expected = 0;?// TODO: Initialize to an appropriate value
????????????int?actual;
????????????actual =?MathUtility.Add(a, b);
????????????Assert.AreEqual(expected, actual);
????????????Assert.Inconclusive("Verify the correctness of this test method.");
????????}
?
關(guān)于單元測(cè)試的各種斷言,不在本文討論范圍之內(nèi)。下表列出Visual Studio 2010支持的斷言及相關(guān)解釋。
| 斷言 | 解釋 |
| AreEqual | 驗(yàn)證值相等 |
| AreNotEqual | 驗(yàn)證值不相等 |
| AreSame | 驗(yàn)證引用相等 |
| AreNotSame | 驗(yàn)證引用不相等 |
| Inconclusive | 暗示條件還未被驗(yàn)證 |
| IsTrue | 驗(yàn)證條件為真 |
| IsFalse | 驗(yàn)證條件為假 |
| IsInstanceOfType | 驗(yàn)證實(shí)例匹配類型 |
| IsNotInstanceOfType | 驗(yàn)證實(shí)例不匹配類型 |
| IsNotNull | 驗(yàn)證條件為NULL |
| IsNull | 驗(yàn)證條件不為NULL |
| Fail | 驗(yàn)證失敗 |
?
測(cè)試函數(shù)AddTest()的屬性[TestMethod()]表示這個(gè)方法是個(gè)可運(yùn)行單元測(cè)試方法,區(qū)別類中的其他方法(如一些測(cè)試輔助方法)。
需要特別注意的是:Assert.Inconclusive("Verify the correctness of this test method.");語(yǔ)句是默認(rèn)添加的,意思是這個(gè)方法是Visual Studio自動(dòng)創(chuàng)建,運(yùn)行前自刪除或注釋此句,否則運(yùn)行結(jié)果無(wú)法通過(guò)。
按上面的步驟,把MathUtility里面的所有方法都建立相應(yīng)的單元測(cè)試,然后按F6進(jìn)行編譯。編譯后,就可以在單元測(cè)試窗口中看到我們剛剛建立的測(cè)試方法了。
Test->Windows->Test List Editor如下圖:
?
?
修改DivideTest代碼如下:
????????[TestMethod()]
????????public?void?DivideTest()
????????{
????????????int?a = 100;?// TODO: Initialize to an appropriate value
????????????int?b = 2;?// TODO: Initialize to an appropriate value
????????????int?expected = 50;?// TODO: Initialize to an appropriate value
????????????int?actual;
???????????
????????????actual =?MathUtility.Divide(a, b);
????????????Assert.AreEqual(expected, actual);
????????????//Assert.Inconclusive("Verify the correctness of this test method.");
????????}
在Test List Editor選中DivideTest方法后,右擊如下圖
?
?
1.Run Checked Tests:直接運(yùn)行此單元測(cè)試函數(shù)
2.Debug Checked Tests:以Debug模式運(yùn)行。在此模式下運(yùn)行單元測(cè)試函數(shù),可以在單元測(cè)試函數(shù)(DivideTest)或是被測(cè)函數(shù)(MathUtility.Divide)中加斷點(diǎn),則程序會(huì)自動(dòng)停留在斷點(diǎn)處。
3.Open Test:打開(kāi)此測(cè)試函數(shù)的方法,相當(dāng)于雙擊。
4.Disable:把此測(cè)試方法置為無(wú)效。
?
?
左擊Run Checked Tests后,運(yùn)行結(jié)果如下圖,證明測(cè)試通過(guò):
?
重新修改DivideTest()程序如下:
????????[TestMethod()]
????????public?void?DivideTest()
????????{
????????????int?a = 100;?// TODO: Initialize to an appropriate value
????????????int?b = 2;?// TODO: Initialize to an appropriate value
????????????int?expected = 60;?// TODO: Initialize to an appropriate value
????????????int?actual;
???????????
????????????actual =?MathUtility.Divide(a, b);
????????????Assert.AreEqual(expected, actual);
????????????//Assert.Inconclusive("Verify the correctness of this test method.");
????????}
再次運(yùn)行,結(jié)果如下:
?
測(cè)試失敗,原因是:期待值為60,實(shí)際值為50,斷言失敗。
?
重新修改DivideTest()程序如下:
????????public?void?DivideTest()
????????{
????????????int?a = 100;?// TODO: Initialize to an appropriate value
????????????int?b = 0;?// TODO: Initialize to an appropriate value
????????????int?expected = 60;?// TODO: Initialize to an appropriate value
????????????int?actual;
???????????
????????????actual =?MathUtility.Divide(a, b);
????????????Assert.AreEqual(expected, actual);
????????????//Assert.Inconclusive("Verify the correctness of this test method.");
????????}
這次以Debug模式運(yùn)行,則程序會(huì)在return?a / b;拋出異常,顯示被除數(shù)不能為0.
?
至此,一個(gè)簡(jiǎn)單的單元測(cè)試已經(jīng)從頭到尾跑了一遍。細(xì)心的讀者一定會(huì)發(fā)現(xiàn)在MathUtilityTest.cs測(cè)試文件里面還有四個(gè)被注釋掉的方法,下表列出了這四個(gè)方法的解釋和用法。
| 函數(shù)名 | 用法 |
| [ClassInitialize()] MyClassInitialize | 這個(gè)方法會(huì)在每次調(diào)用測(cè)試方法前被自動(dòng)調(diào)用。假設(shè)在調(diào)用AddTest(),DivideTest()等方法之前都需要初始化一些基本數(shù)據(jù)列表,則這個(gè)工作可以放在MyClassInitialize函數(shù)里面,不用分別寫(xiě)在每個(gè)測(cè)試方法里。 |
| [ClassCleanup()] MyClassCleanup | 這個(gè)方法會(huì)在每次調(diào)用測(cè)試方法結(jié)束后被自動(dòng)調(diào)用。 |
| [TestInitialize()] MyTestInitialize | 這個(gè)方法會(huì)在每次啟動(dòng)一個(gè)測(cè)試過(guò)程前被自動(dòng)調(diào)用。例如本次測(cè)試一共選擇了AddTest(),DivideTest()兩個(gè)測(cè)試方法,則在調(diào)用這兩個(gè)方法前,MyTestInitialize會(huì)先被調(diào)用。與MyClassInitialize不同的是,MyClassInitialize是每次調(diào)用測(cè)試方法時(shí)都會(huì)被調(diào)用,相當(dāng)于函數(shù)級(jí)的調(diào)用,MyTestInitialize則只在測(cè)試過(guò)程前會(huì)被調(diào)用一次,在測(cè)試過(guò)程結(jié)束前,不會(huì)再被調(diào)用,相當(dāng)于過(guò)程級(jí)的調(diào)用。 |
| [TestCleanup()] MyTestCleanup | 這個(gè)方法會(huì)在每次結(jié)束一個(gè)測(cè)試過(guò)程后被自動(dòng)調(diào)用。 |
?
Visual Studio?之所謂把這四個(gè)函數(shù)注釋掉,原因是這四個(gè)函數(shù)只是示意性函數(shù)(從名字中就可以看出)。關(guān)鍵是看這四個(gè)函數(shù)的方法屬性[ClassInitialize()],[ClassCleanup()], [TestInitialize()], [TestCleanup()]只要把相關(guān)的屬性加到相關(guān)的方法上,那么這個(gè)方法就具有的上面所描述的功能。
?
單元測(cè)試適用范圍:
1.驗(yàn)證函數(shù)正確性。對(duì)于一個(gè)函數(shù),只要我們把相關(guān)的測(cè)試數(shù)據(jù)都寫(xiě)全,然后run一下,就知道是否都能通過(guò)。以后修改此方法后,只要再次run一下,就知道此次修改是否影響到了以前的測(cè)試用例,大大節(jié)省時(shí)間和提高正確率。
2.Debug程序。我們一般寫(xiě)后臺(tái)代碼時(shí),都要寫(xiě)一個(gè)console或是winform小程序要調(diào)試驗(yàn)證所寫(xiě)的類是否能run起來(lái),那么單元測(cè)試中的Debug模式就可以勝任此工作。
?
?
下面介紹兩個(gè)使用時(shí)的小技巧。
1.可以在Test Result窗口里面導(dǎo)出測(cè)試結(jié)果。導(dǎo)出的結(jié)果包括一份測(cè)試報(bào)告和測(cè)試程序。證明此程序已經(jīng)通過(guò)了報(bào)告中的所有測(cè)試用例,相當(dāng)于Release了一個(gè)版本。
2.設(shè)置測(cè)試數(shù)量。每運(yùn)行一次測(cè)試過(guò)程,就會(huì)生成一次測(cè)試報(bào)告和程序。Visual Studio默認(rèn)次數(shù)是25,即超過(guò)25后,就會(huì)提示超出測(cè)試數(shù)次。我們可以通過(guò)下面的設(shè)置來(lái)提高次數(shù)。
Tool->Options->Test Tools->Test Execution,把里面的25改成100即可。如下圖
?
至此,普通單元測(cè)試已經(jīng)完成。請(qǐng)繼續(xù)關(guān)注順序單元測(cè)試。
?
?
Visual Studio 2010單元測(cè)試系列已經(jīng)全部完成,以方便大家閱讀,請(qǐng)使用http://blog.csdn.net/tjvictor/archive/2011/02/09/6175358.aspx來(lái)查看這一系列的所有博文。
轉(zhuǎn)載于:https://www.cnblogs.com/songtzu/archive/2012/10/22/2733456.html
總結(jié)
以上是生活随笔為你收集整理的Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Win7 SP1 安装python 3.
- 下一篇: 略读《大教堂与市集》