本篇文章介紹了windows 8 開發(fā)之測(cè)試代碼的使用方法。需要的朋友參考下
1.創(chuàng)建解決方案和單元測(cè)試項(xiàng)目
1).“文件”菜單上選擇“新建”,然后選擇“新建項(xiàng)目”。
2).在“新建項(xiàng)目”對(duì)話框中,展開“已單元測(cè)試”、“Visual 單元測(cè)試”,選擇“Windows Store”。然后從項(xiàng)目模板列表中選擇“空白應(yīng)用程序”。
3).將項(xiàng)目命名為 MyTestProject,并確保選中“創(chuàng)建解決方案的目錄”。
4).在解決方案資源管理器中,選擇解決方案名稱,從快捷菜單中選擇“添加”,然后選擇“新建項(xiàng)目”。
5).在“新建項(xiàng)目”對(duì)話框中,展開“已安裝”、“Visual C#”,然后選擇“Windows 應(yīng)用商店”。然后從項(xiàng)目模板列表中選擇“單元測(cè)試庫(kù)(Windows Store 應(yīng)用程序)”。
注意:是先創(chuàng)建一個(gè)項(xiàng)目,然后再這個(gè)項(xiàng)目中添加測(cè)試項(xiàng)目,這樣符合我們?cè)陂_發(fā)中需要對(duì)我們的項(xiàng)目進(jìn)行測(cè)試的需求。
6).在 Visual Studio 編輯器中打開 UnitTest1.cs。
代碼如下:
namespace?UnitTestLibraryTest{????[TestClass]????public?class?UnitTest1????{????????????[TestMethod]????????public?void?TestMethod1()????????{ <p>????????}????}}</p>
注意以下事項(xiàng):
a.每個(gè)測(cè)試都是使用 [TestMethod] 定義的。測(cè)試方法必須返回 void,并且不能具有任何參數(shù)。在類名前一行,加上[TestClass]的聲明.
b.測(cè)試方法必須位于使用 [TestMethod] 特性修飾的類中。運(yùn)行測(cè)試時(shí),將為每個(gè)測(cè)試類創(chuàng)建一個(gè)實(shí)例。將按未指定順序調(diào)用測(cè)試方法。
c.您可定義在每個(gè)模塊、每個(gè)類或每個(gè)方法前后調(diào)用的特定方法。
d.在文件頭部加入using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;的引用。
7).測(cè)試前的初始化及測(cè)試后的清理。用法及代碼如下:
代碼如下:
namespace?UnitTestLibraryTest { ????[TestClass] ????public?class?UnitTest1 ????{ ????????private?int?a; ????????private?int?b; <p>????????//?當(dāng)前測(cè)試類運(yùn)行第一個(gè)測(cè)試方法之前執(zhí)行,類似于 構(gòu)造函數(shù) ????????[ClassInitialize] ????????public? static ?void?MyClassInit(TestContext?context) ????????{ ????????} ????????//?所有測(cè)試方法運(yùn)行完畢后執(zhí)行,類似于 析構(gòu)函數(shù) ????????[ClassCleanup] ????????public?static?void?MyClass End () ????????{? ????????}</p> <p>????????//每個(gè)測(cè)試方法運(yùn)行之前執(zhí)行 ????????[TestInitialize] ????????public?void?Init() ????????{ ????????????a?=?1; ????????????b?=?1; ????????} ????????//每個(gè)測(cè)試方法運(yùn)行之后執(zhí)行 ????????[TestCleanup] ????????public?void?End() ????????{ ????????????a?=?0; ????????????b?=?0; ????????}</p> <p>????} }</p>
注意:以上方法,方法名可以自定義,無返回值,除了[ClassInitialize]的那個(gè)函數(shù)有個(gè)TestContext的參數(shù)外,其他無參數(shù)。
2.驗(yàn)證測(cè)試是否在測(cè)試管理資源器中運(yùn)行
1).在 UnitTest1.cs 文件的 TestMethod1 中插入一些測(cè)試代碼:
代碼如下:
[TestMethod] ????????public?void?AddTestMethod() ????????{ ????????????int?a?=?1; ????????????int?b?=?2; ????????????int?sum?=?a+b; ????????????Assert.AreEqual(3,sum); ????????}
注意,Assert 類提供的若干單元測(cè)試方法可用于驗(yàn)證測(cè)試方法的結(jié)果。
2).在“測(cè)試”菜單上,選擇“運(yùn)行”,然后選擇“全部運(yùn)行”。
將生成并運(yùn)行測(cè)試項(xiàng)目。隨即顯示“測(cè)試資源管理器”窗口,并且測(cè)試列出在“已通過的測(cè)試”下。窗口底部的“單元測(cè)試”窗格將提供有關(guān)所選測(cè)試的其他詳細(xì)信息。
3.向MyTestProject項(xiàng)目添加Rooter類
1).在“解決方案資源管理器”中,選擇“MyTestProject”項(xiàng)目名稱。從快捷菜單中選擇“添加”,然后選擇“類”。
2).將類文件命名為 Rooter.cs。
3).將以下代碼添加到 Rooter 類 Rooter.cs 文件中:
代碼如下:
public?class?Rooter ????{ ????????public?Rooter() ????????{? ????????} ????????public?double?SquareRoot(double?x) ????????{ ???????????? return ?0.0; ????????} ????}
Rooter 類聲明一個(gè)構(gòu)造函數(shù)和 SqareRoot estimator 方法。
4).SqareRoot 方法只是一個(gè)最小實(shí)現(xiàn),足以為測(cè)試設(shè)置測(cè)試基本結(jié)構(gòu)。
4.將測(cè)試項(xiàng)目合并為應(yīng)用程序項(xiàng)目
1).將對(duì) “MyTestProject”應(yīng)用程序的引用添加到 UnitTestLibraryTest項(xiàng)目中。
2).向 UnitTest1.cs 文件添加 using 語句:
a.打開 UnitTest1.cs。
b.在 using Microsoft.VisualStudio.TestPlatform.UnitTestFramework; 行下添加代碼:using MyTestProject;
3).添加使用 Rooter 函數(shù)的測(cè)試。將下列代碼添加到 UnitTest1.cs:
代碼如下:
[TestMethod] ????????public?void?BasicTest() ????????{ ????????????Rooter?rooter?=? new ?Rooter(); ????????????double?expected?=?0.0; ????????????double?actual?=?rooter.SquareRoot(expected?*?expected); ????????????double?tolerance?=?.001; ????????????Assert.AreEqual(expected,?actual,?tolerance); ????????}
4).生成解決方案。
新測(cè)試將顯示在測(cè)試資源管理器的“未運(yùn)行的測(cè)試”節(jié)點(diǎn)中。
5).在測(cè)試資源管理器中,選擇“全部運(yùn)行”。 已通過基本測(cè)試
您已設(shè)置測(cè)試和代碼項(xiàng)目,并驗(yàn)證了您可在代碼項(xiàng)目中運(yùn)行運(yùn)行函數(shù)的測(cè)試。現(xiàn)在您可開始編寫真實(shí)測(cè)試和代碼。
5.以迭代方式增加測(cè)試并使這些測(cè)試通過。
1).添加新測(cè)試:
代碼如下:
[TestMethod] ????????public?void? Range Test() ????????{ ????????????Rooter?rooter?=?new?Rooter(); ????????????for?(double?v?=?1e-6;?v? <p>????????private?double?ToleranceHelper(double?expected) ????????{ ????????????return?expected?/?3.2;? ????????}</p>
?? 提示:建議您不要更改已通過的測(cè)試。而是添加新測(cè)試,單元測(cè)試代碼以便測(cè)試通過,然后添加其他測(cè)試等。 當(dāng)您的用戶更改其要求時(shí),請(qǐng)禁用不再正確的測(cè)試。編寫新測(cè)試并使它們以相同的增量方式一次運(yùn)行一個(gè)。?
2).在測(cè)試資源管理器中,選擇“全部運(yùn)行”。
3).測(cè)試將不會(huì)通過。 RangeTest 未通過
提示:編寫測(cè)試后,立即驗(yàn)證每個(gè)測(cè)試是否都將失敗。這幫助您避免易犯的錯(cuò)誤,不會(huì)編寫從不失敗的測(cè)試。??
4).增強(qiáng)受測(cè)代碼,以便新測(cè)試通過。將 Rooter.cs 中的 SqareRoot 函數(shù)更改為:
代碼如下:
public?double?SquareRoot(double?x) ????????{ ????????????double?estimate?=?x; ????????????double?d if f?=?x; ???????????? while ?(diff?>?estimate?/?1000) ????????????{ ????????????????double? prev iousEstimate?=?estimate; ????????????????estimate?=?estimate?-?(estimate?*?estimate?-?x)?/?(2?*?estimate); ????????????????diff?=?Math.Abs(previousEstimate?-?estimate); ????????????} ????????????return?estimate; ????????}
5).生成解決方案,然后在測(cè)試資源管理器中,選擇“全部運(yùn)行”。
現(xiàn)在所有三個(gè)測(cè)試都將通過。
提示:通過添加測(cè)試的方式一次性開發(fā)代碼。確保所有測(cè)試在每次迭代后都通過。
6.調(diào)用未通過的測(cè)試
1).向 UnitTest1.cs 添加另一個(gè)測(cè)試:?
代碼如下:
[TestMethod]????????public?void?NegativeRangeTest()????????{????????????string?message;????????????Rooter?rooter?=?new?Rooter();????????????for?(double?v?=?-0.1;?v?>?-3.0;?v?=?v?-?0.5)????????????{????????????????try????????????????{????????????????????//?Should?raise?an?exception:????????????????????double?actual?=?rooter.SquareRoot(v); <p>????????????????????message?=?String.Format("No?exception?for?input?{0}",?v);????????????????????Assert.Fail(message);????????????????}????????????????catch?(ArgumentOutOfRangeException?ex)????????????????{????????????????????continue;?//?Correct?exception.????????????????}????????????????catch?(Exception?e)????????????????{????????????????????message?=?String.Format("Incorrect?exception?for?{0}",?v);????????????????????Assert.Fail(message);????????????????}????????????}????????}</p>
2).在測(cè)試資源管理器中,選擇“全部運(yùn)行”。
測(cè)試將不會(huì)通過。在測(cè)試資源管理器中選擇測(cè)試名稱。將突出顯示失敗的斷言。失敗消息將在測(cè)試資源管理器的細(xì)節(jié)窗格中可見。NegativeRangeTests 未通過。
? 3).若要查看測(cè)試未通過的原因,請(qǐng)單步執(zhí)行以下函數(shù):
a.在 SquareRoot 函數(shù)的開頭設(shè)置斷點(diǎn)。
b.在未通過測(cè)試的快捷菜單上,選擇“單元測(cè)試選定的測(cè)試”。 當(dāng)運(yùn)行在斷點(diǎn)處停止時(shí),請(qǐng)單步執(zhí)行以下代碼。
c.向 Rooter 方法添加代碼以捕獲異常,將SquareRoot方法修改如下(對(duì)x進(jìn)行判斷捕獲異常):
代碼如下:
public?double?SquareRoot(double?x) ????????{ ????????????if?(x??estimate?/?1000) ????????????{ ????????????????double?previousEstimate?=?estimate; ????????????????estimate?=?estimate?-?(estimate?*?estimate?-?x)?/?(2?*?estimate); ????????????????diff?=?Math.Abs(previousEstimate?-?estimate); ????????????} ????????????return?estimate; ????????}
在測(cè)試資源管理器中,選擇“全部運(yùn)行”以測(cè)試已糾正的方法,并確保您未引入回歸測(cè)試。所有測(cè)試都將通過。
【相關(guān)推薦】
1.?單元測(cè)試
2.?單元測(cè)試
3.?單元測(cè)試
4.?單元測(cè)試