跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 单元测试
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#单元测试 = 单元测试是软件开发中的一种测试方法,用于验证代码中最小可测试单元(通常是方法或函数)的行为是否符合预期。在C#中,单元测试通常通过专门的测试框架(如NUnit、xUnit或MSTest)来实现。本节将详细介绍如何在C#中编写和运行单元测试,并探讨其最佳实践。 == 什么是单元测试? == 单元测试是一种自动化测试方法,用于验证代码的单个组件(如方法、类或模块)是否按预期工作。它的核心目标是: * 快速验证代码的正确性 * 在早期发现错误 * 提供代码变更的安全网 * 作为代码文档的一种形式 在C#中,单元测试通常遵循"Arrange-Act-Assert"(AAA)模式: # '''Arrange''':设置测试所需的初始条件和输入 # '''Act''':执行被测试的代码 # '''Assert''':验证结果是否符合预期 == 常用C#测试框架 == C#生态系统中有几个流行的单元测试框架: {| class="wikitable" |- ! 框架 !! 特点 |- | MSTest || Microsoft官方测试框架,与Visual Studio深度集成 |- | NUnit || 功能丰富,社区支持强大 |- | xUnit || 现代化设计,更简洁的语法 |} == 基本单元测试示例 == 以下是一个简单的C#方法和对应的单元测试示例: <syntaxhighlight lang="csharp"> // 被测试的类 public class Calculator { public int Add(int a, int b) { return a + b; } public int Divide(int a, int b) { if (b == 0) throw new DivideByZeroException("Cannot divide by zero."); return a / b; } } </syntaxhighlight> 使用xUnit框架编写的测试: <syntaxhighlight lang="csharp"> using Xunit; public class CalculatorTests { [Fact] public void Add_TwoNumbers_ReturnsSum() { // Arrange var calculator = new Calculator(); // Act var result = calculator.Add(3, 5); // Assert Assert.Equal(8, result); } [Fact] public void Divide_DivideByZero_ThrowsException() { // Arrange var calculator = new Calculator(); // Act & Assert Assert.Throws<DivideByZeroException>(() => calculator.Divide(10, 0)); } } </syntaxhighlight> == 测试驱动开发(TDD) == 测试驱动开发是一种先写测试再实现功能的开发方法: <mermaid> graph LR A[编写失败的测试] --> B[实现最小功能使测试通过] B --> C[重构代码] C --> A </mermaid> TDD循环的三个阶段: 1. '''红''':编写一个会失败的测试 2. '''绿''':编写刚好能让测试通过的代码 3. '''重构''':改进代码结构而不改变行为 == 高级测试技术 == === 参数化测试 === 允许使用不同输入多次运行同一测试: <syntaxhighlight lang="csharp"> [Theory] [InlineData(1, 2, 3)] [InlineData(0, 0, 0)] [InlineData(-1, 1, 0)] public void Add_WithVariousInputs_ReturnsCorrectSum(int a, int b, int expected) { // Arrange var calculator = new Calculator(); // Act var result = calculator.Add(a, b); // Assert Assert.Equal(expected, result); } </syntaxhighlight> === 模拟对象(Mocking) === 当测试代码依赖外部服务时,可以使用模拟对象: <syntaxhighlight lang="csharp"> // 使用Moq框架的示例 [Fact] public void ProcessOrder_WithValidOrder_CallsPaymentService() { // Arrange var mockPaymentService = new Mock<IPaymentService>(); var orderProcessor = new OrderProcessor(mockPaymentService.Object); var order = new Order { Total = 100.00m }; // Act orderProcessor.ProcessOrder(order); // Assert mockPaymentService.Verify( ps => ps.ProcessPayment(order.Total), Times.Once); } </syntaxhighlight> == 测试最佳实践 == * 测试名称应清晰描述测试目的(如"MethodName_StateUnderTest_ExpectedBehavior") * 每个测试应只验证一件事 * 避免测试中有逻辑(如if语句) * 测试应独立运行,不依赖其他测试 * 测试应快速执行(理想情况下整个测试套件应在几秒内完成) * 测试应具有确定性(相同输入总是产生相同结果) == 实际应用案例 == 考虑一个电子商务系统中的折扣计算器: <syntaxhighlight lang="csharp"> public class DiscountCalculator { public decimal CalculateDiscount(Customer customer, decimal orderTotal) { if (customer.IsPremium) { return orderTotal * 0.15m; // 15%折扣 } else if (orderTotal > 1000) { return orderTotal * 0.10m; // 10%折扣 } return 0; } } </syntaxhighlight> 对应的测试可能包括: <syntaxhighlight lang="csharp"> [Fact] public void CalculateDiscount_PremiumCustomer_Returns15Percent() { // Arrange var calculator = new DiscountCalculator(); var customer = new Customer { IsPremium = true }; // Act var discount = calculator.CalculateDiscount(customer, 100.00m); // Assert Assert.Equal(15.00m, discount); } [Fact] public void CalculateDiscount_LargeOrder_Returns10Percent() { // Arrange var calculator = new DiscountCalculator(); var customer = new Customer { IsPremium = false }; // Act var discount = calculator.CalculateDiscount(customer, 1500.00m); // Assert Assert.Equal(150.00m, discount); } [Fact] public void CalculateDiscount_RegularSmallOrder_ReturnsNoDiscount() { // Arrange var calculator = new DiscountCalculator(); var customer = new Customer { IsPremium = false }; // Act var discount = calculator.CalculateDiscount(customer, 100.00m); // Assert Assert.Equal(0, discount); } </syntaxhighlight> == 数学公式示例 == 在某些情况下,测试可能涉及数学验证。例如,测试一个金融计算器: <math> FV = PV \times (1 + r)^n </math> 其中: * FV = 未来值 * PV = 现值 * r = 利率 * n = 期数 对应的测试可能验证这个公式的正确实现。 == 结论 == 单元测试是C#开发中不可或缺的一部分,它能显著提高代码质量和开发效率。通过: * 选择合适的测试框架 * 遵循AAA模式 * 编写清晰、独立的测试 * 应用适当的测试技术(如参数化测试和模拟) 开发者可以构建更可靠、更易维护的应用程序。随着经验的积累,单元测试将成为开发流程中自然的一部分,而不是额外的负担。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 高级主题]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)