網站首頁 編程語言 正文
一、什么是單元測試
單元測試就是編寫一段代碼,用來檢查某個特定條件下,另外一段代碼的行為是否符合我們的預期。
單元測試的代碼與實際程序的代碼具有同等的重要性。
每一個單元測試,都是用來定向測試它所對應的一個單元的代碼是否正確執行(一般只的是對方法的測試)。
單元測試應該由被測試代碼的編寫者來完成(即程序員自己來完成,因為只有程序員自己才知道程序的效果)。
二、單元測試的好處
能夠協助程序員盡快找到代碼中bug的具體位置。
能夠讓程序員對自己的程序更有自信。
能夠讓程序員在提交項目之前就將代碼變得更加的強壯。
能夠協助程序員更好的進行開發。
能夠向其他的程序員展示你寫的程序該如何調用。
能夠讓項目主管更了解系統當前的情況。
三、編寫單元測試
VSTS中的測試工具可以對任何類、接口、結構等實體中的字段、屬性、構造函數、方法等進行單元測試。用的最多的是對方法進行測試。
單元測試分為兩種:
1、整體測試。
2、單獨測試。
通常在解決方案中添加一個測試項目,用于單元測試。將單元測試代碼和業務代碼分開。
1、新建一個空白的解決方案,命名為:UnitTestingSolution
2、新建一個控制臺應用程序,作為業務代碼進行測試
3、在控制臺應用程序中新建一個Triangle類,對Triangle類里面的方法進行測試,Triangle類定義如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace UnitTestingCon { ////// 三角形 /// public class Triangle { // 定義三角形三邊長的屬性 public float SideLength1 { get; private set; } public float SideLength2 { get; private set; } public float SideLength3 { get; private set; } ////// 構造函數,用來給屬性賦值 /// /// /// /// public Triangle(float sideLength1, float sideLength2, float sideLength3) { SideLength1 = sideLength1; SideLength2 = sideLength2; SideLength3 = SideLength3; } ////// 判斷是否是一個三角形 /// 1、每條邊都是正數 /// 2、兩邊之和大于第三邊 /// ///public bool IsTriangle() { // 三邊長度有不是正數的返回false if((SideLength1<=0)|| (SideLength2 <= 0)|| (SideLength3 <= 0)) { return false; } else { return (((SideLength1+SideLength2)>SideLength3) &&((SideLength1+SideLength3))>SideLength2 &&((SideLength2+SideLength3)>SideLength1)); } } /// /// 判斷是否為等邊三角形 /// 1、必須是三角形 /// 2、三條邊必須都相等 /// ///public bool IsEquilateralTriangle() { if(!IsTriangle()) { return false; } else { return ((SideLength1==SideLength2)&&(SideLength1==SideLength3)&&(SideLength2==SideLength3)); } } /// /// 獲取三角形的面積 /// 1、如果不是三角形,面積為0 /// 2、如果s為三角形的三邊(a、b、c)和的一半 /// 三角形的面積為(s*(s-a)*(s-b)*(s-c))的平方根 /// ///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、新建單元測試項目
在解決方案上面右鍵,選擇“添加”->新建項目:
在打開的對話框中選擇測試下面的單元測試項目,項目名稱:要測試的類名+Test
創建的單元測試項目結構如下:
UnitTest1是默認生成的測試類,可以刪掉。
5、新建測試類
在單元測試項目上右鍵,選擇“添加”->“類”,然后選擇測試下面的單元測試
約定:要測試的類和測試的方法以Test結尾。
單元測試默認在Microsoft.VisualStudio.TestTools.UnitTesting命名空間下面。
6、編寫測試代碼
編寫測試代碼前首先要添加對測試項目的引用,要測試哪個項目就要添加對哪個項目的引用。測試方法上面要添加特性[TestMethod],表示是一個測試方法。添加是否是三角形方法的測試代碼,測試代碼如下:
////// 測試是否是三角形這個方法 /// [TestMethod] public void IsTriangleTest() { #region 測試用例一 // 初始化屬性 float SideLength1 = 0f; float SideLength2 = 0f; float SideLength3 = 0f; // 實例化 riangle target = new Triangle(SideLength1, SideLength2, SideLength3); // 定義一個變量,保存期待的結果 bool excepted = false; // 定義一個變量,保存實際的結果 bool actual; actual = target.IsTriangle(); // 斷言期待的結果和實際的結果是否相等,如果相等表示測試通過,否則測試失敗 Assert.AreEqual(excepted, actual); #endregion }
7、運行測試代碼
在運行測試代碼以前,需要打開測試資源管理器窗口和代碼覆蓋率結果窗口,在菜單欄的測試里面打開
運行測試代碼,可以在測試方法上面右鍵選擇運行測試:
或者選擇菜單欄測試里面的運行:
或者是在測試資源管理器里面的測試方法上面直接右鍵:
運行測試代碼,查看測試結果:
表示測試通過。
注意:在測試方法里面添加斷點,可以進行調試,可以按照上面的三種方式選擇調試測試。
查看代碼覆蓋率:
從上面的截圖中可以看出,代碼覆蓋率只要25%,說明測試代碼寫的還不夠全面。需要繼續完善單元測試的代碼。
8、Assert類
Assert:斷言
在Microsoft.VisualStudio.TestTools.UnitTesting命名空間中。
Assert類是一個靜態類。
序號 | 方法 | 描述 |
---|---|---|
1 | AreEqual | 判斷兩個值是否相等,如果兩個值不相等,則測試失敗。有多個重載 |
2 | AreNotEqual | 判斷兩個值是否不相等,如果兩個值相等,則測試失敗。有多個重載 |
3 | AreSame | 判斷引用的對象是否相同。如果兩個輸入內容引用不相同的對象,則測試失敗。 |
4 | AreNotSame | 判斷引用的對象是否不相同。如果兩個輸入內容引用相同的對象,則測試失敗。 |
5 | Fail | 斷言失敗 |
6 | Inconclusive | 表示無法證明為true或false的測試結果 |
7 | IsFalse | 指定的條件是否為false。如果該條件為true,則測試失敗。 |
8 | IsTrue | 指定的條件是否為true。如果該條件為false,則測試失敗。 |
9 | IsInstanceofType | 測試指定的對象是否為所需類型的實例。如果所需的實例不在該對象的繼承層次結構中,則測試失敗。 |
10 | IsNotInstanceOfType | 測試指定的對象是否為所需類型的實例。如果所需的實例在該對象的繼承層次結構中,則測試失敗。 |
11 | IsNull | 測試指定的對象是否為空。 |
12 | IsNotNull | 測試指定的對象是否為非空。 |
9、單元測試中的特性
TestClass特性
用于標識類是一個測試類。
用法:在類上面標注[TestClass]
測試類的命名方式:<被測試類的類名>Test
TestMethod特性
用于標識一個測試方法。
用法:在測試方法上面標注[TestMethod]
測試方法的命名方式:<被測試方法的方法名>Test
注意:在測試方法上面一定要添加TestMethod特性,否則該方法不會被執行。
10、代碼覆蓋率
代碼覆蓋率是單元測試寫的是否合理或是否達到要求的一個唯一的標準。
代碼覆蓋率是測試代碼所運行到的實際程序路徑的覆蓋率。
四、單元測試的標準
1、哪些代碼需要單元測試
a、既有代碼添加單元測試的步驟
第一步:對所有程序集中的公開類以及公開類里面的公開方法添加單元測試。
第二步:對于構造函數和公共屬性進行單元測試。
第三步:添加全面單元測試。
b、給哪些代碼添加單元測試
針對屬于框架技術中的代碼添加單元測試。
為業務邏輯層對界面公開的方法添加單元測試。
c、對應剛開始的項目,應該對所有公開的方法和屬性都添加單元測試。
2、單元測試代碼的寫法
a、編寫單元測試代碼時注意事項
所測試的方法的代碼覆蓋率必須達到100%。
所測試的代碼內部的狀態。
被測試的代碼所使用的外部設備的狀態。(比如打印機的狀態)
b、怎么提高代碼覆蓋率
邊界條件數據。
空數據。
格式不正確數據。
3、單元測試是否達到預期值
代碼覆蓋率100%并不能完全保證代碼正確。
需要對執行的結果進行斷言。
平均每5行測試代碼要有一個斷言。
測試外部設備狀態更改時,測試是否正常通過。
原文鏈接:https://www.cnblogs.com/dotnet261010/p/9043999.html
相關推薦
- 2024-03-09 【Spring Boot】實現全局異常處理
- 2022-09-04 python開發任意表達式求值全功能示例_python
- 2022-08-07 pd.drop_duplicates刪除重復行的方法實現_python
- 2022-10-23 C#中new操作符的工作機制_C#教程
- 2022-07-04 C語言植物大戰數據結構堆排序圖文示例_C 語言
- 2022-05-26 openwrt安裝docker并啟動的操作方法_docker
- 2023-03-01 getopts解析shell腳本命令行參數的方法_linux shell
- 2022-05-25 Postman動態獲取值(動態設置全局變量)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支