使用 xUnit 快速编写 .NET 应用单元测试
前言
在当今快速迭代的软件开发环境中,单元测试已成为保障代码质量和项目可靠性的重要基石,通过验证程序最小单元(如函数、方法、类等)的独立行为,能够在开发阶段快速发现逻辑错误或边界条件问题。今天大姚将带领大家使用 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支持。
- GitHub开源地址:https://github.com/xunit/xunit
- 本文示例源码地址:https://github.com/YSGStudyHards/DotNetExercises/tree/master/xUnitExercise
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没)。
- GitHub开源地址:https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
- Gitee开源地址:https://gitee.com/ysgdaydayup/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
使用 xUnit 快速编写 .NET 应用单元测试的更多相关文章
- 运用Spock编写高质量单元测试
单元测试作为提升代码质量的有效方法,目前在国内各大互联网公司的开发团队中,尤其是业务团队中却鲜少被使用.这主要由于大家对于单元测试有一些认知错误,或者没有正确的打开方式.至今我们团队在小剧场.零代码运 ...
- Emmet:HTML/CSS代码快速编写神器
本文来源:http://www.iteye.com/news/27580 ,还可参考:http://www.w3cplus.com/tools/emmet-cheat-sheet.html Em ...
- 转载: Emmet:HTML/CSS代码快速编写神器
Emmet:HTML/CSS代码快速编写神器 因为文章严禁转载,那本着做一个遵纪守法的好公民,我就不转载了,把链接放下面,方便查阅. http://www.iteye.com/news/27580
- 快速编写HTML,CSS代码的有力工具Emmet插件
Emmet 是一个编辑器插件,它以一种简写的语法规则可用于快速编写html或css文档内容,它支持多种编辑器. 从官网:http://emmet.io/ 可下载各个编辑器的插件.notepad++ 插 ...
- Emmet:HTML/CSS代码快速编写神器(转)
Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...
- Sublime Text 3插件之Emmet:HTML/CSS代码快速编写神器
一.快速编写HTML代码 1. 初始化 HTML文档需要包含一些固定的标签,比如<html>.<head>.<body>等,现在你只需要1秒钟就可以输入这些标签. ...
- Emmet 快速编写html代码
简介 快速编写HTML代码 语法简单,语法类似css选择器,30分钟内你就可以搞定它.开发商为sublime.atom.brackets.hbuilder.webstrom等编辑器或IDE提供对应的插 ...
- Sublime Text、webstorm等编译器快速编写HTML/CSS代码的技巧
Sublime Text.webstorm等编译器,如果你从事Web前端开发的话,对这几款软件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演 ...
- Emmet for Dreamweaver:HTML/CSS代码快速编写神器
Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...
- Emmet:HTML/CSS代码快速编写神器教程
Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...
随机推荐
- 关于DevExpress VCL汉化方法
用法1:在工程中加入控件cxLocalizer; 在程序中加入如下语句: Localizer.LoadFromFile('DevLocal.ini'); Localizer.Language := ' ...
- 从零开始开发一个 MCP Server!
大家好!我是韩老师. 最近,在 AI 开发领域,MCP (Model Context Protocol) 是越来越火了! 前几天,我我也开发了一款 Code Runner MCP Server: Co ...
- gmpy2库
在密码计算中会牵扯大素数的计算模逆等,gmpy2库就是一个这种库 求整数a.b的最大公因数 a = gmpy2.gcd(3,12) 判断一个数是否为素数 a = gmpy2.is_prime(5) 判 ...
- api使用流程、Scanner键盘录入字符串
1.api介绍 2.api使用流程 API帮助文档的使用流程 在索引位置搜索自己要查看的类 看包 目的: 是不是java.lang包(核心包), 不需要编写导包代码(import) - 不是java. ...
- 《机器人SLAM导航核心技术与实战》第1季:第5章_机器人主机
<机器人SLAM导航核心技术与实战>第1季:第5章_机器人主机 视频讲解 [第1季]5.第5章_机器人主机-视频讲解 [第1季]5.1.第5章_机器人主机_X86与ARM主机对比-视频讲解 ...
- PandasAI:当数据分析遇上自然语言处理
数据科学的新范式 在数据爆炸的时代,传统的数据分析工具正面临着前所未有的挑战.数据科学家们常常需要花费70%的时间在数据清洗和探索上,而真正的价值创造时间却被大幅压缩.PandasAI的出现,正在改变 ...
- volatile修饰全局变量,可以保证线程并发安全吗?
今天被人问到volatile能不能保证并发安全? 呵,这能难倒我? 直接上代码: public class ThreadTest { // 使用volatile修饰变量 private static ...
- C#之值类型与引用类型--out参数--ref参数-"=="、Equals和ReferenceEquals之间的区别
一.值类型和引用类型 1.值类型 (1)值类型的大小是固定的 (2)值类型都派生自ValueType (3)值类型不能继承,只能实现接口 2.值类型:int.char.double.float.lon ...
- 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
数据模型的设计是编辑器的核心基础,其直接影响了选区模型.DOM模型.状态管理等模块的设计.例如在quill中的选区模型是index + len的表达,而slate中则是anchor + focus的表 ...
- WIN10 由于找不到mfc140u.dll,无法继续执行代码
最近遇到win10提示mfc140u.dll找不到,总是弹窗的问题. 网上一番百度搜索后发现给的方法都不能很好的解决,DLL修复工具需登录且收费 去下载mfc140u.dll 根本不可能找到,都是垃圾 ...