.NET 帮助

C# 单元测试(它如何为开发人员工作)

发布 2024年四月3日
分享:

C#单元测试简介

单元测试验证是软件开发的一个关键阶段,有助于开发人员验证源代码各个单元的功能。 在 C# 中,单元测试可确保每个组件或方法在各种条件下正确运行。 单元测试可以隔离程序的各个部分,并证明各个部分没有错误,从而大大提高应用程序的可靠性。 在本文中,我们将探讨 C# 单元测试项目的基础知识和用于.NET的IronPDF库.

在 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 文件或数据库)指定测试数据。

理解并有效使用断言

断言是测试方法的核心,因为它们可以验证测试结果。 了解测试框架中可用的各种断言方法,并适当使用它们来检查预期值、异常或条件。 使用正确的断言可以使您的测试更清晰、更强大。

持续集成和测试自动化

将单元测试集成到持续集成中(CI)管道。这可以确保每次对代码库进行修改时都能自动运行测试,从而有助于及早发现和解决问题。 自动化还有助于频繁、持续地运行测试,这对维护健康的代码库至关重要。

保持测试与生产代码同步

只有与生产代码保持一致,您的单元测试才能达到最佳效果。 确保在相应的单元测试中反映功能的任何变化。 这种做法可以防止过时的测试错误通过,并确保您的测试套件准确地反映应用程序的状态。

从失败的测试中学习

测试失败是学习和改进的机会。 失败的测试可能会揭示出意想不到的行为、不正确的假设,或者代码中比必要的更复杂、更容易出错的地方。 仔细分析失败的测试,了解其根本原因,并利用这些见解来改进您的测试和生产代码。

IronPDF 介绍

C# 单元测试(如何为开发人员工作):图 2 - IronPDF 网站

IronPDF for .NET PDF 开发PDF 是一个专为 .NET 开发人员设计的综合库,使他们能够在应用程序中生成、处理和读取 PDF 文档。 IronPDF 因其能够生成从 HTML 直接生成 PDF您还可以使用代码、CSS、图像和 JavaScript 创建最佳 PDF。 它支持广泛的 .NET 项目类型和应用环境,包括 Web 和桌面应用程序、服务等,可跨各种操作系统(如 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 的测试资源管理器运行测试以及使用代码覆盖工具,您可以确保 C# 应用程序的可靠性并保持高质量标准。 通过理解和应用测试驱动开发原则,您可以进一步提高 C# 单元测试项目的质量。 请记住,单元测试的目的不仅仅是查找错误,而是为您的应用程序打下坚实的基础,以便于更新、调试和功能添加。 了解 IronPDF 许可选项许可证选项从 $749开始。

< 前一页
CQRS 模式 C#(开发人员的工作原理)
下一步 >
C# URL 编码(它是如何为开发人员工作的)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >