.NET 幫助

C# 單元測試(開發者如何運作)

發佈 2024年4月3日
分享:

C# 單元測試介紹

單元測試在軟體開發中,這是一個關鍵階段,有助於開發人員驗證單個源代碼單元的功能。 在 C# 中,單元測試確保每個組件或方法在各種情況下正確運行。 通過隔離程式的每個部分並證明個別部分無錯,單元測試大大提高了應用程式的可靠性。 在本文中,我們將探討 C# 單元測試項目的基礎知識及其IronPDF 程式庫 for .NET.

在 Visual Studio 中設置您的第一個單元測試

建立單元測試專案

要開始在 C# 中進行單元測試,您需要在 Visual Studio 中設置一個單元測試專案。 Visual Studio 提供內建的單元測試框架,使其成為一個簡單的開始。 當您創建一個新專案時,請在 C# 類別下選擇“單元測試專案”範本。 此模板設置了創建單元測試並有效執行所需的一切。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
namespace Unit_Test_Project_Example
{
    public class Calculator
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
    [TestClass]
    public class CalculatorTests
    {
        [TestMethod]
        public void Add_ShouldReturnCorrectSum()
        {
            // Arrange
            var calculator = new Calculator();
            // Act
            var result = calculator.Add(2, 2);
            // Assert
            Assert.AreEqual(4, result);
        }
    }
}
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
namespace Unit_Test_Project_Example
{
    public class Calculator
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
    [TestClass]
    public class CalculatorTests
    {
        [TestMethod]
        public void Add_ShouldReturnCorrectSum()
        {
            // Arrange
            var calculator = new Calculator();
            // Act
            var result = calculator.Add(2, 2);
            // Assert
            Assert.AreEqual(4, result);
        }
    }
}
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System
Namespace Unit_Test_Project_Example
	Public Class Calculator
		Public Function Add(ByVal a As Integer, ByVal b As Integer) As Integer
			Return a + b
		End Function
	End Class
	<TestClass>
	Public Class CalculatorTests
		<TestMethod>
		Public Sub Add_ShouldReturnCorrectSum()
			' Arrange
			Dim calculator As New Calculator()
			' Act
			Dim result = calculator.Add(2, 2)
			' Assert
			Assert.AreEqual(4, result)
		End Sub
	End Class
End Namespace
VB   C#

理解測試方法和測試類別

在單元測試專案中,您將測試組織成類別和方法。 測試類別表示應該一起運行的單元測試方法的集合。 每個單元測試方法,以裝飾[測試方法] 屬性,包含測試您代碼中特定功能的邏輯。 測試類別本身被標記為 [測試類別]屬性,向測試框架發出訊號,表明它包含要執行的測試。

運行和理解您的測試

在 Visual Studio 中使用測試資源管理器

Visual Studio 測試總管視窗是您運行和管理所有測試方法的核心中心。 您可以運行所有測試、選擇測試或單獨測試。 在運行測試後,測試資源管理器提供已通過和未通過測試的詳細摘要,使您能夠快速識別和解決問題。

解釋測試結果

  • 通過的測試:這些測試成功運行,表明被測代碼在指定條件下表現如預期。
  • 失敗的測試:這些表明預期結果和實際結果之間的差異,顯示可能的錯誤或對需求或測試代碼的誤解。

    及時調查失敗的測試是至關重要的,因為它們可以提供代碼庫中問題的早期警告信號。

    C# 單元測試(開發人員的運作方式):圖 1 - 在 Visual Studio 中通过的單元測試範例

撰寫 C# 單元測試的進階技巧與最佳實踐

除了撰寫和運行測試之外,掌握 C# 的單元測試還需理解一些高級技巧和最佳實踐。 這些方法可以幫助您撰寫更高效且更有效的測試,確保您的應用程式可靠且易於維護。

有效地組織測試

良好的組織是維持大量測試套件的關鍵。 將您的測試按其涵蓋的功能進行邏輯分組。 為您的測試方法和類別使用描述性名稱,以指示每個測試在驗證什麼。 此方法能讓您在測試套件擴展時,更容易找到並理解測試。

模擬和依賴注入

通常,您正在測試的代碼會與外部資源或應用程序的其他部分交互。 在這種情況下,使用像 Moq 或 NSubstitute 這樣的模擬框架來創建模擬對象。 這些替身模擬了真實對象的行為,使您可以在獨立環境中測試您的代碼。 依賴注入使您的代碼更易於測試,因為它允許您在測試過程中用模擬或存根替換實際的依賴項。

// Example of using a mock
[TestClass]
public class ProductServiceTests
{
    [TestMethod]
    public void GetProductById_ShouldReturnCorrectProduct()
    {
        // Arrange
        var mockRepository = new Mock<IProductRepository>();
        mockRepository.Setup(x => x.FindById(1)).Returns(new Product { Id = 1, Name = "Laptop" });
        ProductService productService = new ProductService(mockRepository.Object);
        // Act
        Product result = productService.GetProductById(1);
        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Laptop", result.Name);
    }
}
// Example of using a mock
[TestClass]
public class ProductServiceTests
{
    [TestMethod]
    public void GetProductById_ShouldReturnCorrectProduct()
    {
        // Arrange
        var mockRepository = new Mock<IProductRepository>();
        mockRepository.Setup(x => x.FindById(1)).Returns(new Product { Id = 1, Name = "Laptop" });
        ProductService productService = new ProductService(mockRepository.Object);
        // Act
        Product result = productService.GetProductById(1);
        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Laptop", result.Name);
    }
}
' Example of using a mock
<TestClass>
Public Class ProductServiceTests
	<TestMethod>
	Public Sub GetProductById_ShouldReturnCorrectProduct()
		' Arrange
		Dim mockRepository = New Mock(Of IProductRepository)()
		mockRepository.Setup(Function(x) x.FindById(1)).Returns(New Product With {
			.Id = 1,
			.Name = "Laptop"
		})
		Dim productService As New ProductService(mockRepository.Object)
		' Act
		Dim result As Product = productService.GetProductById(1)
		' Assert
		Assert.IsNotNull(result)
		Assert.AreEqual("Laptop", result.Name)
	End Sub
End Class
VB   C#

利用數據驅動測試

資料驅動測試允許您使用不同的輸入數據多次運行相同的測試方法。 這種技術特別適合在不編寫多個測試方法的情況下測試廣泛的輸入和情境。 Visual Studio 支援資料驅動測試,讓您可以從多種來源指定測試資料,例如內嵌資料、CSV 文件或資料庫。

有效理解和使用斷言

斷言是測試方法的核心,因為它們驗證測試的結果。 了解您測試框架中可用的各種斷言方法,並適當使用它們來檢查預期的值、異常或條件。 使用正確的斷言可以使您的測試更清晰且更穩固。

持續整合與測試自動化

將單元測試整合到持續集成中(持續整合)管道。這確保了每次對代碼庫進行更改時,自動執行測試,有助於及早發現和修復問題。 自動化還有助於經常且一致地運行測試,這對於維護良好的代碼庫至關重要。

保持測試與生產代碼同步

你的單元測試只有和生產代碼一致時才有效。 確保任何功能的變更在相應的單元測試中得到反映。 此做法可以防止過時的測試錯誤地通過,並確保您的測試套件準確反映應用程式的狀態。

從失敗測試中學習

當測試失敗時,這是學習和改進的機會。 失敗的測試可以揭示出意料之外的行為、不正確的假設,或是你的代碼中比起必要更加複雜和容易出錯的部分。 仔細分析失敗的測試,了解其根本原因,並利用這些見解來改進你的測試和生產代碼。

IronPDF 介紹

C# 單元測試(開發人員如何操作):圖 2 - IronPDF 網站

IronPDF for .NET PDF 開發是一個為 .NET 開發者設計的全面性程式庫,使其能夠在應用程式中生成、操作和讀取 PDF 文件。 IronPDF 以其生成 PDF 的能力而聞名直接從 HTML 轉換為 PDF程式碼、CSS、圖像和JavaScript來創建最佳PDF。 它支持廣泛的 .NET 專案類型和應用環境,包括網頁和桌面應用程式、服務等,適用於各種作業系統,例如 Windows、Linux 和 macOS,以及 Docker 和雲端環境如 Azure 和 AWS。

範例程式碼

以下是一個在 C# 單元測試場景中使用 IronPDF 的範例。 假設您想測試一個從 HTML 內容生成 PDF 的函數。 您可以使用 IronPDF 將 HTML 渲染為 PDF,然後在測試中驗證 PDF 的存在或內容:

using IronPdf;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.ComponentModel;
using System.IO;
[TestClass]
public class PdfGenerationTests
{
    [TestMethod]
    public void TestHtmlToPdfGeneration()
    {
        IronPdf.License.LicenseKey = "License-Key";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, world!</h1>");
        string filePath = Path.Combine(Path.GetTempPath(), "test.pdf");
        pdf.SaveAs(filePath);
        Assert.IsTrue(File.Exists(filePath), "The generated PDF does not exist.");
        // Additional assertions to verify the PDF content could be added here
        // Clean up
        File.Delete(filePath);
    }
}
using IronPdf;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.ComponentModel;
using System.IO;
[TestClass]
public class PdfGenerationTests
{
    [TestMethod]
    public void TestHtmlToPdfGeneration()
    {
        IronPdf.License.LicenseKey = "License-Key";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, world!</h1>");
        string filePath = Path.Combine(Path.GetTempPath(), "test.pdf");
        pdf.SaveAs(filePath);
        Assert.IsTrue(File.Exists(filePath), "The generated PDF does not exist.");
        // Additional assertions to verify the PDF content could be added here
        // Clean up
        File.Delete(filePath);
    }
}
Imports IronPdf
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System
Imports System.ComponentModel
Imports System.IO
<TestClass>
Public Class PdfGenerationTests
	<TestMethod>
	Public Sub TestHtmlToPdfGeneration()
		IronPdf.License.LicenseKey = "License-Key"
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello, world!</h1>")
		Dim filePath As String = Path.Combine(Path.GetTempPath(), "test.pdf")
		pdf.SaveAs(filePath)
		Assert.IsTrue(File.Exists(filePath), "The generated PDF does not exist.")
		' Additional assertions to verify the PDF content could be added here
		' Clean up
		File.Delete(filePath)
	End Sub
End Class
VB   C#

本範例展示了一個簡單的單元測試,使用 IronPDF 從 HTML 字串生成 PDF,將其保存到臨時文件,然後驗證該文件的存在。

C# 單元測試(開發人員如何使用):圖 3 - 之前的測試通過

結論

C# 單元測試(開發人員如何使用):圖 4 - IronPDF 授權頁面

單元測試是軟體開發生命週期中不可或缺的一部分。 透過建立和編寫有效的測試,通過 Visual Studio 的 Test Explorer 執行測試,以及使用程式碼涵蓋工具,您可以確保 C# 應用程式的可靠性並保持高品質標準。 通過理解和應用測試驅動開發原則,你可以進一步提升你的 C# 單元測試專案的質量。 請記住,單元測試的目標不僅是發現錯誤,而是為應用程式創建一個穩固的基礎,以便更輕鬆地進行更新、調試和新增功能。 探索 IronPDF 授權選項提供從 $749 開始的授權選項。

< 上一頁
CQRS 模式 C#(它如何對開發者起作用)
下一個 >
C# URL 編碼(開發人員如何操作)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,810,873 查看許可證 >