写点什么

使用 xUnit 快速编写 .NET 应用单元测试

作者:追逐时光者
  • 2025-10-08
    广东
  • 本文字数:3001 字

    阅读完需:约 10 分钟

前言

在当今快速迭代的软件开发环境中,单元测试已成为保障代码质量和项目可靠性的重要基石。今天大姚给大家分享一个 .NET 开源、免费、以社区为中心的单元测试框架:xUnit。

项目介绍

xUnit 是一个开源、免费、以社区为中心的 .NET 单元测试框架,是用于 C# 和 F#(其他 .NET 语言可能也能运行,但未提供官方支持)进行单元测试的最新技术。xUnit 能够与 Visual Studio、Visual Studio Code、ReSharper、CodeRush 和 TestDriven.NET 兼容。它是.NET 基金会的一部分,并遵循其行为准则。

单元测试最佳做法

微软官方出品的 .NET 单元测试最佳做法:https://learn.microsoft.com/zh-cn/dotnet/core/testing/unit-testing-best-practices

  • 避免基础结构依赖项。

  • 以最精简方式编写通过测试。

  • 避免使用魔法字符串。

  • 避免在单元测试中编写代码逻辑。

  • 遵循测试命名标准:要测试的方法的名称。测试方法的情境。调用方案时的预期行为。

命名标准非常重要,因为它们有助于表达测试目的和应用程序。测试不仅仅是确保代码正常工作。它们还提供文档。只需查看单元测试套件,即可推断代码的行为,不必查看代码本身。此外,测试失败时,可以确切地看到哪些方案不符合预期。

单元测试基本步骤

我们在编写单元测试的时候通常遵循 3A 模式(Arrange-Act-Assert),这是单元测试的核心方法论:

  • Arrange(准备阶段): 该阶段用于模拟数据、初始化对象等准备工作。

  • Act(执行阶段): 该阶段用于准备好的数据调用要测试的最小单元方法。

  • Assert(断言阶段): 该阶段是单元测试中的验证环节,它通过将目标方法返回的实际结果与预期结果进行比对,来判定测试是否通过。

创建单元测试项目

因为 xUnit 框架与 Visual Studio 是兼容的,我们可以直接在 Visual Studio 中搜索:xUnit 测试项目 模板,然后创建一个名为:xUnitExercise 的 .NET 9 单元测试项目。


编写简单的单元测试

    public class UnitTest    {        /// <summary>        /// 测试 Calculator 的 Add 方法功能        /// 验证两个正数相加返回正确的和        /// </summary>        [Fact]// 标识这是一个独立的测试用例        public void Add_TwoPositiveNumbers_ReturnsCorrectSum()        {            // ===== Arrange(准备阶段) =====            var calculator = new Calculator();            int num1 = 5;            int num2 = 7;            int expected = 12;
            // ===== Act(执行阶段) =====            int actual = calculator.Add(num1, num2);
            // ===== Assert(断言阶段) =====            Assert.Equal(expected, actual);        }
        /// <summary>        /// 测试 Calculator 的 Divide 方法异常处理        /// 验证除数为零时正确抛出 DivideByZeroException 异常        /// </summary>        [Fact]        public void Divide_ByZero_ThrowsDivideByZeroException()        {            // Arrange            var calculator = new Calculator();            int dividend = 10;            int divisor = 0; //触发异常的除数
            // Act & Assert            // 验证执行除法时是否抛出特定异常            var exception = Assert.Throws<DivideByZeroException>(                () => calculator.Divide(dividend, divisor));
            // 验证异常消息是否符合预期            Assert.Equal("除数不能为零", exception.Message);        }
        /// <summary>        /// 参数化测试 Calculator 的 IsEven 方法功能        /// 验证不同输入数值的奇偶判断是否正确        /// </summary>        /// <param name="number">测试输入值</param>        /// <param name="expected">预期结果(true=偶数,false=奇数)</param>        [Theory] // 标识这是一个参数化测试        [InlineData(4, true)]   // 测试数据1:偶数4,预期true        [InlineData(7, false)]  // 测试数据2:奇数7,预期false        [InlineData(8, false)]  // 测试数据3:偶数8,预期false 【这里是特意为了查看预期结果不一致的情况】        public void IsEven_Number_ReturnsCorrectResult(int number, bool expected)        {            // Arrange            var calculator = new Calculator();
            // Act            bool actual = calculator.IsEven(number);
            // Assert            Assert.Equal(expected, actual);        }
        public class Calculator        {            public int Add(int a, int b)            {                return a + b;            }
            public bool IsEven(int number)            {                return number % 2 == 0;            }
            public double Divide(int dividend, int divisor)            {                if (divisor == 0)                    throw new DivideByZeroException("除数不能为零");
                return (double)dividend / divisor;            }        }    }
复制代码

运行单元测试

选择项目右键 => 运行测试:


或者直接在对应的方法正上方选择 Run:


调试单元测试

选择项目右键 => 运行调试:


或者直接在对应的方法正上方选择 Debug:


项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个 Star 支持💖。

优秀项目和框架精选

该项目已收录到 C#/.NET/.NET Core 优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解 C#、.NET 和.NET Core 领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交 PR 推荐或自荐(让优秀的项目和框架不被埋没🤞)。

发布于: 刚刚阅读数: 3
用户头像

不积跬步无以至千里,不积小流无以成江海! 2020-01-14 加入

微软MVP、华为云HCDE、华为云云享专家、51CTO专家博主、阿里云专家博主、博客园推荐博客、CSDN博客专家、腾讯云创作之星、掘金优秀创作者,一个热爱开源的全栈软件工程师,擅长C#、.NET、Vue等相关技术开发。

评论

发布
暂无评论
使用 xUnit 快速编写 .NET 应用单元测试_C#_追逐时光者_InfoQ写作社区