C# 軟件開發之單元測試

在日常開發中,一般通過啓動調試或運行程序來查看功能是否符合預期,如果不符合預期,則需要優化程序,再次運行,如此反覆,直到程序的輸出符合預期需求爲止。隨着程序的不斷複雜化,某些功能的測試也變得越來越複雜,可能爲了驗證一個很小的改動項,就需要操作很多步驟,才能驗證成功,如果驗證不成功,則需要多次重複驗證,這對於開發者來說,將大大的拖延了開發進度。如何才能將複雜的功能進行拆分,每一個都可以單獨進行驗證呢?如果其他的功能沒有問題,則只需要驗證修改的那部分內容即可,這就是本篇文章需要介紹的單元測試。通過創建和運行單元測試,檢查代碼是否按預期工作。

 

什麼是單元測試?

 

單元測試,是指對軟件中的最小可測試單元進行檢查和驗證。至於如何裁定最小可測試單元,則需要根據實際情況進行分析,一般情況下,一個類,一個函數,一個頁面,一個按鈕事件,都可以作爲一個測試單元。總的來說,單元就是人爲規定的最小的被測功能模塊。對這些模塊進行的測試,就稱之爲單元測試。

 

單元測試的好處?

 

通過單元測試,可以儘早的發現程序的BUG,便於後期的開發及調試,維護。可以使得程序更加健壯,我們對自己的代碼也更加有信心,也便於問題的排查與定位。

 

單元測試環境

 

本示例主要基於以下環境進行單元測試:

  1. 開發工具:Visual Studio 2022
  2. 開發目標平臺:.NET 6.0

 

創建目標項目

 

首先創建一個控制檯應用程序DemoOne,步驟如下所示:

項目模板選擇控制檯項目,然後進入配置新項目頁面,輸入項目名稱,點擊下一步,如下所示:

選擇目標框架,.NET 6.0(長期支持),並勾選不使用頂級語句,然後點擊創建,如下所示:

創建成功後,如下所示:

 

創建功能類

 

我們有如下一個功能類Calculator,實現兩個整數的加,減,乘,除,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoOne
{
    /// <summary>
    /// 實現整數的加減乘除
    /// </summary>
    public class Calculator
    {
        public int Add(int x, int y)
        {
            return x + y;
        }

        public int Sub(int x, int y)
        {
            return x - y;
        }

        public int Multiply(int x, int y)
        {
            return x * y;
        }

        public int Divide(int x, int y)
        {
            return x / y;
        }
    }
}

 

創建單元測試項目

 

在解決方案名稱上,點擊右鍵菜單,添加新建項目,然後選擇NUnit測試項目,然後點擊下一步,如下所示:

輸入項目名稱DemoOne.Test,如下所示:

選擇目標測試框架.NET 6.0(長期支持),然後點擊創建,如下所示:

創建成功後的項目,如下所示:

 

添加項目引用並創建測試類

 

在DemoOne.Test項目中,添加DemoOne項目引用,並創建CalculatorTest測試類,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoOne.Test
{
    public class CalculatorTest
    {
        [Test]
        public void TestAdd()
        {
            var calculator=new Calculator();
            int a = 10;
            int b = 8;
            int c = calculator.Add(a, b);
            Assert.AreEqual(c, 18);
        }

        [Test]
        public void TestSub()
        {
            var calculator = new Calculator();
            int a = 10;
            int b = 8;
            int c = calculator.Sub(a, b);
            Assert.AreEqual(c, 2);
        }

        [Test]
        public void TestMultipy()
        {
            var calculator = new Calculator();
            int a = 10;
            int b = 8;
            int c = calculator.Multiply(a, b);
            Assert.AreEqual(c, 80);  
        }

        [Test]
        public void TestDivide()
        {
            var calculator = new Calculator();
            int a = 10;
            int b = 8;
            int c = calculator.Divide(a, b);
            Assert.AreEqual(c, 1);
        }
    }
}

注意:其中方法上方添加[Test]表示此方法是一個單元測試方法。

 

測試資源管理器

 

在VisualStudio中,單擊測試(S),選擇測試資源管理器(Ctrl+E,T),打開測試資源管理器窗口,如下所示:

在資源管理器窗口,可看到剛剛創建的4個單元測試,且處於未運行狀態。點擊測試資源管理器中的運行按鈕,即可運行單元測試,如下所示:

運行成功後,可以看到單元測試的運行結果。如下所示:

 

單元測試異常輸出

 

通過修改單元測試中除法的代碼,如下所示:

[Test]
public void TestDivide()
{
	var calculator = new Calculator();
	int a = 10;
	int b = 0;
	int c = calculator.Divide(a, b);
	Assert.AreEqual(c, 0);
}

 在上述代碼中,被除數爲0,會拋出異常,再次運行單元測試,則會運行不通過,並提示錯誤信息,如下所示:

 經過單元測試後,發現被除數爲0時拋出異常,則需要優化代碼,經過優化後的代碼,如下所示:

public int Divide(int x, int y)
{
	if (y == 0)
	{
		return 0;
	}
	else
	{
		return x / y;
	}
	
}

優化成功後,再次運行單元測試,如下所示:

 

 以上示例,也從另外一個方面說明了,通過單元測試,可以使我們的程序,更加健壯。

 

Assert斷言

 

在上述代碼示例中,使用到了Assert.AreEqual方法,判斷兩個數是否相等。常用的有:

  1. Assert.IsTrue 判斷是否爲真
  2. Assert.IsFalse 判斷是否爲假
  3. Assert.AreEqual 判斷是否相等。

Assert還有很多方法,本文不再一一列舉,具體可參考:

https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.visualstudio.testtools.unittesting.assert?view=visualstudiosdk-2022

以上就是C#軟件開發之單元測試的全部內容。希望可以拋磚引玉,一起學習,共同進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章