使用Visual Studio編寫單元測(cè)試
一、什么是單元測(cè)試
單元測(cè)試就是編寫一段代碼,用來檢查某個(gè)特定條件下,另外一段代碼的行為是否符合我們的預(yù)期。
單元測(cè)試的代碼與實(shí)際程序的代碼具有同等的重要性。
每一個(gè)單元測(cè)試,都是用來定向測(cè)試它所對(duì)應(yīng)的一個(gè)單元的代碼是否正確執(zhí)行(一般只的是對(duì)方法的測(cè)試)。
單元測(cè)試應(yīng)該由被測(cè)試代碼的編寫者來完成(即程序員自己來完成,因?yàn)橹挥谐绦騿T自己才知道程序的效果)。
二、單元測(cè)試的好處
能夠協(xié)助程序員盡快找到代碼中bug的具體位置。
能夠讓程序員對(duì)自己的程序更有自信。
能夠讓程序員在提交項(xiàng)目之前就將代碼變得更加的強(qiáng)壯。
能夠協(xié)助程序員更好的進(jìn)行開發(fā)。
能夠向其他的程序員展示你寫的程序該如何調(diào)用。
能夠讓項(xiàng)目主管更了解系統(tǒng)當(dāng)前的情況。
三、編寫單元測(cè)試
VSTS中的測(cè)試工具可以對(duì)任何類、接口、結(jié)構(gòu)等實(shí)體中的字段、屬性、構(gòu)造函數(shù)、方法等進(jìn)行單元測(cè)試。用的最多的是對(duì)方法進(jìn)行測(cè)試。
單元測(cè)試分為兩種:
1、整體測(cè)試。
2、單獨(dú)測(cè)試。
通常在解決方案中添加一個(gè)測(cè)試項(xiàng)目,用于單元測(cè)試。將單元測(cè)試代碼和業(yè)務(wù)代碼分開。
1、新建一個(gè)空白的解決方案,命名為:UnitTestingSolution

2、新建一個(gè)控制臺(tái)應(yīng)用程序,作為業(yè)務(wù)代碼進(jìn)行測(cè)試

3、在控制臺(tái)應(yīng)用程序中新建一個(gè)Triangle類,對(duì)Triangle類里面的方法進(jìn)行測(cè)試,Triangle類定義如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UnitTestingCon
{
/// <summary>
/// 三角形
/// </summary>
public class Triangle
{
// 定義三角形三邊長(zhǎng)的屬性
public float SideLength1 { get; private set; }
public float SideLength2 { get; private set; }
public float SideLength3 { get; private set; }
/// <summary>
/// 構(gòu)造函數(shù),用來給屬性賦值
/// </summary>
/// <param name="sideLength1"></param>
/// <param name="sideLength2"></param>
/// <param name="sideLength3"></param>
public Triangle(float sideLength1, float sideLength2, float sideLength3)
{
SideLength1 = sideLength1;
SideLength2 = sideLength2;
SideLength3 = SideLength3;
}
/// <summary>
/// 判斷是否是一個(gè)三角形
/// 1、每條邊都是正數(shù)
/// 2、兩邊之和大于第三邊
/// </summary>
/// <returns></returns>
public bool IsTriangle()
{
// 三邊長(zhǎng)度有不是正數(shù)的返回false
if((SideLength1<=0)|| (SideLength2 <= 0)|| (SideLength3 <= 0))
{
return false;
}
else
{
return (((SideLength1+SideLength2)>SideLength3)
&&((SideLength1+SideLength3))>SideLength2
&&((SideLength2+SideLength3)>SideLength1));
}
}
/// <summary>
/// 判斷是否為等邊三角形
/// 1、必須是三角形
/// 2、三條邊必須都相等
/// </summary>
/// <returns></returns>
public bool IsEquilateralTriangle()
{
if(!IsTriangle())
{
return false;
}
else
{
return ((SideLength1==SideLength2)&&(SideLength1==SideLength3)&&(SideLength2==SideLength3));
}
}
/// <summary>
/// 獲取三角形的面積
/// 1、如果不是三角形,面積為0
/// 2、如果s為三角形的三邊(a、b、c)和的一半
/// 三角形的面積為(s*(s-a)*(s-b)*(s-c))的平方根
/// </summary>
/// <returns></returns>
public double GetArea()
{
if(!IsTriangle())
{
return 0;
}
else
{
float s = (SideLength1 + SideLength2 + SideLength3) * 0.5f;
return Math.Sqrt(s * (s - SideLength1) * (s - SideLength2) * (s - SideLength3));
}
}
}
}4、新建單元測(cè)試項(xiàng)目
在解決方案上面右鍵,選擇“添加”->新建項(xiàng)目:

在打開的對(duì)話框中選擇測(cè)試下面的單元測(cè)試項(xiàng)目,項(xiàng)目名稱:要測(cè)試的類名+Test

創(chuàng)建的單元測(cè)試項(xiàng)目結(jié)構(gòu)如下:

UnitTest1是默認(rèn)生成的測(cè)試類,可以刪掉。
5、新建測(cè)試類
在單元測(cè)試項(xiàng)目上右鍵,選擇“添加”->“類”,然后選擇測(cè)試下面的單元測(cè)試

約定:要測(cè)試的類和測(cè)試的方法以Test結(jié)尾。
單元測(cè)試默認(rèn)在Microsoft.VisualStudio.TestTools.UnitTesting命名空間下面。
6、編寫測(cè)試代碼
編寫測(cè)試代碼前首先要添加對(duì)測(cè)試項(xiàng)目的引用,要測(cè)試哪個(gè)項(xiàng)目就要添加對(duì)哪個(gè)項(xiàng)目的引用。測(cè)試方法上面要添加特性[TestMethod],表示是一個(gè)測(cè)試方法。添加是否是三角形方法的測(cè)試代碼,測(cè)試代碼如下:
/// <summary>
/// 測(cè)試是否是三角形這個(gè)方法
/// </summary>
[TestMethod]
public void IsTriangleTest()
{
#region 測(cè)試用例一
// 初始化屬性
float SideLength1 = 0f;
float SideLength2 = 0f;
float SideLength3 = 0f;
// 實(shí)例化
riangle target = new Triangle(SideLength1, SideLength2, SideLength3);
// 定義一個(gè)變量,保存期待的結(jié)果
bool excepted = false;
// 定義一個(gè)變量,保存實(shí)際的結(jié)果
bool actual;
actual = target.IsTriangle();
// 斷言期待的結(jié)果和實(shí)際的結(jié)果是否相等,如果相等表示測(cè)試通過,否則測(cè)試失敗
Assert.AreEqual(excepted, actual);
#endregion
}7、運(yùn)行測(cè)試代碼
在運(yùn)行測(cè)試代碼以前,需要打開測(cè)試資源管理器窗口和代碼覆蓋率結(jié)果窗口,在菜單欄的測(cè)試?yán)锩娲蜷_

運(yùn)行測(cè)試代碼,可以在測(cè)試方法上面右鍵選擇運(yùn)行測(cè)試:

或者選擇菜單欄測(cè)試?yán)锩娴倪\(yùn)行:

或者是在測(cè)試資源管理器里面的測(cè)試方法上面直接右鍵:

運(yùn)行測(cè)試代碼,查看測(cè)試結(jié)果:

表示測(cè)試通過。
注意:在測(cè)試方法里面添加斷點(diǎn),可以進(jìn)行調(diào)試,可以按照上面的三種方式選擇調(diào)試測(cè)試。
查看代碼覆蓋率:

從上面的截圖中可以看出,代碼覆蓋率只要25%,說明測(cè)試代碼寫的還不夠全面。需要繼續(xù)完善單元測(cè)試的代碼。
8、Assert類
Assert:斷言
在Microsoft.VisualStudio.TestTools.UnitTesting命名空間中。
Assert類是一個(gè)靜態(tài)類。
| 序號(hào) | 方法 | 描述 |
|---|---|---|
| 1 | AreEqual | 判斷兩個(gè)值是否相等,如果兩個(gè)值不相等,則測(cè)試失敗。有多個(gè)重載 |
| 2 | AreNotEqual | 判斷兩個(gè)值是否不相等,如果兩個(gè)值相等,則測(cè)試失敗。有多個(gè)重載 |
| 3 | AreSame | 判斷引用的對(duì)象是否相同。如果兩個(gè)輸入內(nèi)容引用不相同的對(duì)象,則測(cè)試失敗。 |
| 4 | AreNotSame | 判斷引用的對(duì)象是否不相同。如果兩個(gè)輸入內(nèi)容引用相同的對(duì)象,則測(cè)試失敗。 |
| 5 | Fail | 斷言失敗 |
| 6 | Inconclusive | 表示無法證明為true或false的測(cè)試結(jié)果 |
| 7 | IsFalse | 指定的條件是否為false。如果該條件為true,則測(cè)試失敗。 |
| 8 | IsTrue | 指定的條件是否為true。如果該條件為false,則測(cè)試失敗。 |
| 9 | IsInstanceofType | 測(cè)試指定的對(duì)象是否為所需類型的實(shí)例。如果所需的實(shí)例不在該對(duì)象的繼承層次結(jié)構(gòu)中,則測(cè)試失敗。 |
| 10 | IsNotInstanceOfType | 測(cè)試指定的對(duì)象是否為所需類型的實(shí)例。如果所需的實(shí)例在該對(duì)象的繼承層次結(jié)構(gòu)中,則測(cè)試失敗。 |
| 11 | IsNull | 測(cè)試指定的對(duì)象是否為空。 |
| 12 | IsNotNull | 測(cè)試指定的對(duì)象是否為非空。 |
9、單元測(cè)試中的特性
TestClass特性
用于標(biāo)識(shí)類是一個(gè)測(cè)試類。
用法:在類上面標(biāo)注[TestClass]
測(cè)試類的命名方式:<被測(cè)試類的類名>Test
TestMethod特性
用于標(biāo)識(shí)一個(gè)測(cè)試方法。
用法:在測(cè)試方法上面標(biāo)注[TestMethod]
測(cè)試方法的命名方式:<被測(cè)試方法的方法名>Test
注意:在測(cè)試方法上面一定要添加TestMethod特性,否則該方法不會(huì)被執(zhí)行。
10、代碼覆蓋率
代碼覆蓋率是單元測(cè)試寫的是否合理或是否達(dá)到要求的一個(gè)唯一的標(biāo)準(zhǔn)。
代碼覆蓋率是測(cè)試代碼所運(yùn)行到的實(shí)際程序路徑的覆蓋率。
四、單元測(cè)試的標(biāo)準(zhǔn)
1、哪些代碼需要單元測(cè)試
a、既有代碼添加單元測(cè)試的步驟
第一步:對(duì)所有程序集中的公開類以及公開類里面的公開方法添加單元測(cè)試。
第二步:對(duì)于構(gòu)造函數(shù)和公共屬性進(jìn)行單元測(cè)試。
第三步:添加全面單元測(cè)試。
b、給哪些代碼添加單元測(cè)試
針對(duì)屬于框架技術(shù)中的代碼添加單元測(cè)試。
為業(yè)務(wù)邏輯層對(duì)界面公開的方法添加單元測(cè)試。
c、對(duì)應(yīng)剛開始的項(xiàng)目,應(yīng)該對(duì)所有公開的方法和屬性都添加單元測(cè)試。
2、單元測(cè)試代碼的寫法
a、編寫單元測(cè)試代碼時(shí)注意事項(xiàng)
所測(cè)試的方法的代碼覆蓋率必須達(dá)到100%。
所測(cè)試的代碼內(nèi)部的狀態(tài)。
被測(cè)試的代碼所使用的外部設(shè)備的狀態(tài)。(比如打印機(jī)的狀態(tài))
b、怎么提高代碼覆蓋率
邊界條件數(shù)據(jù)。
空數(shù)據(jù)。
格式不正確數(shù)據(jù)。
3、單元測(cè)試是否達(dá)到預(yù)期值
代碼覆蓋率100%并不能完全保證代碼正確。
需要對(duì)執(zhí)行的結(jié)果進(jìn)行斷言。
平均每5行測(cè)試代碼要有一個(gè)斷言。
測(cè)試外部設(shè)備狀態(tài)更改時(shí),測(cè)試是否正常通過。
到此這篇關(guān)于Visual Studio編寫單元測(cè)試的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用Asp.Net Core的MiddleWare思想如何處理復(fù)雜業(yè)務(wù)流程詳解
這篇文章主要給大家介紹了關(guān)于利用Asp.Net Core的MiddleWare思想如何處理復(fù)雜業(yè)務(wù)流程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧2018-08-08
.Net?Core使用Coravel實(shí)現(xiàn)任務(wù)調(diào)度的完整步驟
最近在使用調(diào)度程序創(chuàng)建簡(jiǎn)單的服務(wù),該服務(wù)將執(zhí)行一些重復(fù)的IO操作,使用的是Coravel調(diào)度庫,下面這篇文章主要給大家介紹了關(guān)于.Net?Core使用Coravel實(shí)現(xiàn)任務(wù)調(diào)度的完整步驟,需要的朋友可以參考下2022-08-08
時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7的方法
這篇文章主要介紹了時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
MVC文件上傳支持批量上傳拖拽及預(yù)覽文件內(nèi)容校驗(yàn)功能
這篇文章主要介紹了MVC文件上傳支持批量上傳拖拽及預(yù)覽文件內(nèi)容校驗(yàn)功能,需要的朋友可以參考下2017-03-03
ASP.NET?Core?Web?API中實(shí)現(xiàn)監(jiān)控的方法
本文介紹了在ASP.NETCoreWebAPI中實(shí)現(xiàn)監(jiān)控的幾種流行開源工具,可以監(jiān)控API的性能、請(qǐng)求、響應(yīng)時(shí)間、錯(cuò)誤率等,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
C#中實(shí)現(xiàn)偽靜態(tài)頁面兩種方式介紹
偽靜態(tài)技術(shù)的誕生,帶動(dòng)了于搜索引擎友好C#中實(shí)現(xiàn)偽靜態(tài)頁面有兩種方式,本文將一一詳解,感興趣的朋友可以參考下,希望本文對(duì)你學(xué)習(xí)偽靜態(tài)有所幫助2013-01-01
.net后臺(tái)頁面統(tǒng)一驗(yàn)證是否登錄
這篇文章主要為大家詳細(xì)介紹了.net后臺(tái)頁面統(tǒng)一驗(yàn)證是否登錄的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04

