首頁 > 軟體

使用Visual Studio編寫單元測試

2022-03-09 10:00:28

一、什麼是單元測試

單元測試就是編寫一段程式碼,用來檢查某個特定條件下,另外一段程式碼的行為是否符合我們的預期。
單元測試的程式碼與實際程式的程式碼具有同等的重要性。
每一個單元測試,都是用來定向測試它所對應的一個單元的程式碼是否正確執行(一般只的是對方法的測試)。
單元測試應該由被測試程式碼的編寫者來完成(即程式設計師自己來完成,因為只有程式設計師自己才知道程式的效果)。

二、單元測試的好處

能夠協助程式設計師儘快找到程式碼中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
{
    /// <summary>
    /// 三角形
    /// </summary>
    public class Triangle
    {
        // 定義三角形三邊長的屬性
        public float SideLength1 { get; private set; }
        public float SideLength2 { get; private set; }
        public float SideLength3 { get; private set; }

        /// <summary>
        /// 建構函式,用來給屬性賦值
        /// </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>
        /// 判斷是否是一個三角形
        /// 1、每條邊都是正數
        /// 2、兩邊之和大於第三邊
        /// </summary>
        /// <returns></returns>
        public bool IsTriangle()
        {
            // 三邊長度有不是正數的返回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、新建單元測試專案

在解決方案上面右鍵,選擇“新增”->新建專案:

在開啟的對話方塊中選擇測試下面的單元測試專案,專案名稱:要測試的類名+Test

建立的單元測試專案結構如下:

UnitTest1是預設生成的測試類,可以刪掉。

5、新建測試類

在單元測試專案上右鍵,選擇“新增”->“類”,然後選擇測試下面的單元測試

約定:要測試的類和測試的方法以Test結尾。

單元測試預設在Microsoft.VisualStudio.TestTools.UnitTesting名稱空間下面。

6、編寫測試程式碼

編寫測試程式碼前首先要新增對測試專案的參照,要測試哪個專案就要新增對哪個專案的參照。測試方法上面要新增特性[TestMethod],表示是一個測試方法。新增是否是三角形方法的測試程式碼,測試程式碼如下:

/// <summary>
/// 測試是否是三角形這個方法
/// </summary>
[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類是一個靜態類。

序號方法描述
1AreEqual判斷兩個值是否相等,如果兩個值不相等,則測試失敗。有多個過載
2AreNotEqual判斷兩個值是否不相等,如果兩個值相等,則測試失敗。有多個過載
3AreSame判斷參照的物件是否相同。如果兩個輸入內容參照不相同的物件,則測試失敗。
4AreNotSame判斷參照的物件是否不相同。如果兩個輸入內容參照相同的物件,則測試失敗。
5Fail斷言失敗
6Inconclusive表示無法證明為true或false的測試結果
7IsFalse指定的條件是否為false。如果該條件為true,則測試失敗。
8IsTrue指定的條件是否為true。如果該條件為false,則測試失敗。
9IsInstanceofType測試指定的物件是否為所需型別的範例。如果所需的範例不在該物件的繼承層次結構中,則測試失敗。
10IsNotInstanceOfType測試指定的物件是否為所需型別的範例。如果所需的範例在該物件的繼承層次結構中,則測試失敗。
11IsNull測試指定的物件是否為空。
12IsNotNull測試指定的物件是否為非空。

9、單元測試中的特性

TestClass特性

用於標識類是一個測試類。

用法:在類上面標註[TestClass]

測試類的命名方式:<被測試類的類名>Test

TestMethod特性

用於標識一個測試方法。

用法:在測試方法上面標註[TestMethod]

測試方法的命名方式:<被測試方法的方法名>Test

注意:在測試方法上面一定要新增TestMethod特性,否則該方法不會被執行。

10、程式碼覆蓋率

程式碼覆蓋率是單元測試寫的是否合理或是否達到要求的一個唯一的標準。

程式碼覆蓋率是測試程式碼所執行到的實際程式路徑的覆蓋率。

四、單元測試的標準

1、哪些程式碼需要單元測試

a、既有程式碼新增單元測試的步驟

第一步:對所有程式集中的公開類以及公開類裡面的公開方法新增單元測試。

第二步:對於建構函式和公共屬性進行單元測試。

第三步:新增全面單元測試。

b、給哪些程式碼新增單元測試

針對屬於框架技術中的程式碼新增單元測試。

為業務邏輯層對介面公開的方法新增單元測試。

c、對應剛開始的專案,應該對所有公開的方法和屬性都新增單元測試。

2、單元測試程式碼的寫法

a、編寫單元測試程式碼時注意事項

所測試的方法的程式碼覆蓋率必須達到100%。

所測試的程式碼內部的狀態。

被測試的程式碼所使用的外部裝置的狀態。(比如印表機的狀態)

b、怎麼提高程式碼覆蓋率

邊界條件資料。

空資料。

格式不正確資料。

3、單元測試是否達到預期值

程式碼覆蓋率100%並不能完全保證程式碼正確。

需要對執行的結果進行斷言。

平均每5行測試程式碼要有一個斷言。

測試外部裝置狀態更改時,測試是否正常通過。

到此這篇關於Visual Studio編寫單元測試的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com