前言

在当今快速迭代的软件开发环境中,单元测试已成为保障代码质量和项目可靠性的重要基石,通过验证程序最小单元(如函数、方法、类等)的独立行为,能够在开发阶段快速发现逻辑错误或边界条件问题。今天大姚将带领大家使用 xUnit 快速编写 .NET 应用单元测试。

项目介绍

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推荐或自荐(让优秀的项目和框架不被埋没)。

使用 xUnit 快速编写 .NET 应用单元测试的更多相关文章

  1. 运用Spock编写高质量单元测试

    单元测试作为提升代码质量的有效方法,目前在国内各大互联网公司的开发团队中,尤其是业务团队中却鲜少被使用.这主要由于大家对于单元测试有一些认知错误,或者没有正确的打开方式.至今我们团队在小剧场.零代码运 ...

  2. Emmet:HTML/CSS代码快速编写神器

    本文来源:http://www.iteye.com/news/27580    ,还可参考:http://www.w3cplus.com/tools/emmet-cheat-sheet.html Em ...

  3. 转载: Emmet:HTML/CSS代码快速编写神器

    Emmet:HTML/CSS代码快速编写神器 因为文章严禁转载,那本着做一个遵纪守法的好公民,我就不转载了,把链接放下面,方便查阅. http://www.iteye.com/news/27580

  4. 快速编写HTML,CSS代码的有力工具Emmet插件

    Emmet 是一个编辑器插件,它以一种简写的语法规则可用于快速编写html或css文档内容,它支持多种编辑器. 从官网:http://emmet.io/ 可下载各个编辑器的插件.notepad++ 插 ...

  5. Emmet:HTML/CSS代码快速编写神器(转)

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  6. Sublime Text 3插件之Emmet:HTML/CSS代码快速编写神器

    一.快速编写HTML代码 1.  初始化 HTML文档需要包含一些固定的标签,比如<html>.<head>.<body>等,现在你只需要1秒钟就可以输入这些标签. ...

  7. Emmet 快速编写html代码

    简介 快速编写HTML代码 语法简单,语法类似css选择器,30分钟内你就可以搞定它.开发商为sublime.atom.brackets.hbuilder.webstrom等编辑器或IDE提供对应的插 ...

  8. Sublime Text、webstorm等编译器快速编写HTML/CSS代码的技巧

    Sublime Text.webstorm等编译器,如果你从事Web前端开发的话,对这几款软件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演 ...

  9. Emmet for Dreamweaver:HTML/CSS代码快速编写神器

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  10. Emmet:HTML/CSS代码快速编写神器教程

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

随机推荐

  1. Visual Studio 外部工具中添加 git-bash

    引言 旧版的 Visual Studio 没有集成 git 工具,并且自己也习惯用 git-bash 命令行来操作, 那么如何在旧版的 Visual Studio 快速打开 git-bash 终端呢? ...

  2. 延迟补偿在C/S架构游戏协议设计和优化中的应用

    延迟补偿在C/S架构游戏协议设计和优化中的应用 1 分钟读完 1.综述Permalink 第一人称角色网络游戏的设计是一项很有挑战性的工作.网络环境下的健壮性,是动作游戏能否成功的一个重要因素.另外, ...

  3. Redis 分布式锁的正确实现原理演化历程与 Redission的源码

    当线程A,加锁并设置过期时间-->执行业务-->判断锁id完成后,但这时CPU线程调度其它工作了在这里卡住了, 而且也到了锁的过期时间了被动被删除,当线程B,加锁并设置过期时间--> ...

  4. hybrid应用自动化

    一.hybrid介绍 hybrid是一种混合app,将h5页面嵌入native原生页面. 基于uiautomator+chromedriver.native部分走uiautomator,web部分走c ...

  5. linux期末考试题(2)

    linux期末考试题 一.选择题(共30分,每小题2分) 1.以下关于自由软件的说法,正确的是(D) A.自由软件是一种有版权保护的软件 B.修改自由软件应取得原作者的许可 C.微软的 Ofice 软 ...

  6. 传统的可扩展架构模式:分层架构和SOA

    极客时间:<从 0 开始学架构>:传统的可扩展架构模式:分层架构和SOA 分层架构 分层架构是很常见的架构模式,它也叫 N 层架构,通常情况下,N 至少是 2 层.例如,C/S 架构.B/ ...

  7. String Manipulation related with pandas

    String Manipulation related with pandas String object Methods import pandas as pd import numpy as np ...

  8. PHP MD5强碰撞

    MD5强碰撞 搬得这个师傅的 https://www.cnblogs.com/kuaile1314/p/11968108.html 可以看到,使用了三个等号,这个时候PHP会先检查两边的变量类型,如果 ...

  9. Win32汇编学习笔记07.筛选器异常

    Win32汇编学习笔记07.筛选器异常-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 钢琴 od调试老师给的多媒体钢琴 运行找到Piano的过程函数里去 找到处理 ...

  10. 基于 Streamlit 和 OpenAI 实现的小红书爆款文案生成器

    项目介绍 在当今自媒体时代,高质量的文案是吸引流量的关键.特别是在小红书这样的平台上,一个吸引人的标题和富有情感的正文可以显著提高内容的曝光率. 本文将介绍一个基于OpenAI API和Streaml ...