news 2026/10/27 2:00:07

在 C# 中,单元测试聚焦于隔离验证单个方法或类的逻辑,不依赖数据库、网络等外部资源;集成测试则验证多个组件(如 API、数据库、中间件)协同工作是否正常

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 C# 中,单元测试聚焦于隔离验证单个方法或类的逻辑,不依赖数据库、网络等外部资源;集成测试则验证多个组件(如 API、数据库、中间件)协同工作是否正常

在 C# 中,单元测试聚焦于隔离验证单个方法或类的逻辑,不依赖数据库、网络等外部资源;集成测试则验证多个组件(如 API、数据库、中间件)协同工作是否正常。两者通常分属不同的测试项目,使用 MSTest、xUnit 或 NUnit 框架编写,并通过dotnet test或 Visual Studio 测试资源管理器运行。

单元测试怎么写

核心原则:每个测试只验证一个行为,遵循 Arrange(准备)—Act(执行)—Assert(断言)的 3A 模式,避免依赖外部资源。

创建测试项目:在解决方案中新增一个测试项目(如 MSTest 或 xUnit 模板),并添加对被测项目的引用。若使用 CLI,可执行dotnet new xunit -o MyProject.Tests,再通过dotnet add reference添加项目引用。

编写测试方法:以 MSTest 为例,测试类标记[TestClass],测试方法标记[TestMethod],方法必须为public void且无参数。xUnit 则用[Fact]标记独立测试,[Theory]配合[InlineData]做参数化测试。

示例:假设有一个BankAccount类,测试其Debit方法在合法金额下是否正确扣款。

[TestClass]publicclassBankAccountTests{[TestMethod]publicvoidDebit_WithValidAmount_UpdatesBalance(){// ArrangedoublebeginningBalance=11.99;doubledebitAmount=4.55;doubleexpected=7.44;varaccount=newBankAccount("Mr. Walton",beginningBalance);// Actaccount.Debit(debitAmount);// AssertAssert.AreEqual(expected,account.Balance,0.001,"扣款金额不正确");}}

上述代码来自 Microsoft 官方演练,测试失败时会明确提示预期值与实际值的差异。对于异常测试,可用Assert.ThrowsException<ArgumentOutOfRangeException>(() => account.Debit(-100))验证是否抛出预期异常。

运行测试:Visual Studio 中打开“测试资源管理器”点击“全部运行”;CLI 中在解决方案目录执行dotnet test。

集成测试怎么写(以 ASP.NET Core API 为例)

核心工具:使用Microsoft.AspNetCore.Mvc.Testing包中的WebApplicationFactory<TProgram>,它能在内存中启动完整的应用管道,让你用HttpClient发送真实 HTTP 请求,而无需部署到服务器。

基本步骤:在测试项目中引用 Web 项目,并添加Microsoft.AspNetCore.Mvc.TestingNuGet 包。在 Web 项目的Program.cs末尾添加public partial class Program { },以便测试项目能访问到入口点。

自定义工厂:若需替换数据库(如用内存数据库代替真实 SQL Server),继承WebApplicationFactory<Program>并重写ConfigureWebHost,在ConfigureServices中移除原有的数据库注册,替换为测试用的数据库上下文。

示例测试:以下测试验证 GET 请求/返回成功状态码。

publicclassIndexPageTests:IClassFixture<CustomWebApplicationFactory<Program>>{privatereadonlyHttpClient_client;publicIndexPageTests(CustomWebApplicationFactory<Program>factory){_client=factory.CreateClient();}[Fact]publicasyncTaskGet_Root_ReturnsSuccess(){// Actvarresponse=await_client.GetAsync("/");// Assertresponse.EnsureSuccessStatusCode();// 若状态码非 2xx 则失败}}

对于需要验证具体内容的测试(如检查页面中的某个元素),可以获取响应字符串后用 HTML 解析库(如 AngleSharp)处理。若需模拟已登录用户,可通过自定义AuthenticationHandler注入测试身份,或直接在请求头中携带测试令牌。

关键区别与选择建议

维度单元测试集成测试
范围单个类/方法多个组件协作(API + DB + 中间件)
速度毫秒级,极快相对较慢(需启动管道、初始化 DB)
依赖无外部依赖(用 Mock 隔离)有依赖(但可用内存数据库/Testcontainers 替代)
失败定位直接指向具体方法逻辑需排查是哪个环节出问题

实践建议:大量编写单元测试覆盖核心业务逻辑与边界条件,少量集成测试覆盖关键 API 端点和数据访问路径。单元测试中若被测类依赖外部服务,使用 Moq 等框架模拟接口,确保测试纯粹且快速。集成测试中若需接近生产环境的数据库行为,可考虑用 Testcontainers 启动真实数据库容器,但会牺牲一些速度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 1:59:38

【电子通识】UV固化三防涂层过了UV灯就万事大吉了?

UV灯亮了&#xff0c;涂层就固化“好了”&#xff1f;干了这么多年硬件&#xff0c;我发现最容易骗过自己的就是眼睛做工程久了&#xff0c;会养成一种职业病&#xff1a;相信“过了设备”就等于“做完了” 。PCB从回流焊里出来&#xff0c;过了就是焊好了。从清洗机里出来&…

作者头像 李华
网站建设 2026/10/27 1:58:50

从财务呈现到经营导航:FPA正助力企业摆脱滞后管理

当外部环境从增量扩张转向存量博弈&#xff0c;传统财务计划与分析&#xff08;FP&A&#xff09;职能正被迫经历一场变革。它不再只是年底关账后的“数据整理员”&#xff0c;而是被推到了战略决策的中心舞台&#xff0c;成为业务方向的塑造者与决策质量的赋能者。这种从被…

作者头像 李华
网站建设 2026/10/27 1:58:12

与服务器之间的文件传输工具全整理:常用工具与安装包下载地址

一、为什么需要专门的文件传输工具 在日常运维、开发和部署过程中&#xff0c;我们经常需要在本地电脑与远程服务器之间来回搬运文件&#xff1a;上传代码包、下载日志、同步配置文件、备份数据库导出结果等。虽然 scp、sftp 这类命令行工具已经能满足基本需求&#xff0c;但在…

作者头像 李华
网站建设 2026/10/27 1:57:26

行测—言语理解

第一部分 中心理解题一、提问方式这段文字主要/旨在/重在/意在/想要说明&#xff08;论述/强调&#xff09;的是......这段文字的主旨/主题/观点是......对这段文字概括最恰当的是......这段文字表达了作者......从这段文字中我们可以看出作者的意圈/态度是......这段文字出自一…

作者头像 李华
网站建设 2026/10/27 1:56:51

助贷CRM合规数据留痕模块技术实现:操作日志存证与防篡改方案

摘要在助贷业务SaaS系统建设中&#xff0c;操作日志不只是简单的审计追溯能力&#xff0c;更是满足业务流程可追溯、行为可核验的基础能力。本文围绕CRM系统合规留痕场景&#xff0c;从需求分析、方案选型、技术架构、核心代码实现、校验机制、运维监控几个维度&#xff0c;讲解…

作者头像 李华
网站建设 2026/10/27 1:56:49

小白程序员必备:收藏这份 Agent 图编排指南,轻松玩转大模型任务流

本文深入浅出地介绍了 Agent 图编排的核心概念与实现方式&#xff0c;帮助初学者理解如何通过图结构优化 Agent 任务流设计。文章重点阐述了节点与边的设计原则、数据流优化方法&#xff0c;并探讨了并行处理、故障隔离、验证机制等关键技巧。通过学习本文&#xff0c;读者能掌…

作者头像 李华