经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
在C#中进行单元测试
来源:cnblogs  作者:妙妙屋(zy)  时间:2024/6/28 9:33:32  对本文有异议

单元测试

前言

时隔多个月,终于抽空学习了点新知识,那么这次来记录一下C#怎么进行单元测试,单元测试是做什么的。

我相信大部分刚毕业的都很疑惑单元测试是干什么的?在小厂实习了6个月后,我发现每天除了写CRUD就是写CRUD,几乎用不到单元测试。写完一个功能直接上手去测,当然这只是我个人感受,仅供参考。

然后当我还在抱怨测试好烦的时候,大佬跟我说为什么不用单元测试和集成测试,我这也是有苦说不出。要知道光学会理论知识,没有实践作为基础,都是扯淡,入职这么久还真没用过单元测试,吓得我赶紧去找资料学习。

那么也是通过观看B站某位Up主的视频,然后有点想法写下这篇文章,虽然up主的主题是探究接口的作用和意义,但是视频中也讲解了怎么进行单元测试,所以对于接口理解不够的可以去本文底部观看视频学习。

那么本篇文章就简单的讲解下C#中如何做单元测试,博主也是处于学习阶段,有不对的地方欢迎指出改正。

单元测试简述

单元测试(Unit Testing)是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是方法或函数)是否按照预期进行工作。这些单元通常是独立于其他代码部分进行测试的,以确保其正确性和可靠性。

单元测试的主要作用:

  • 确保每个单元能正确执行预期功能
  • 能够尽快找到Bug的具体位置

开始测试

本文以当前时间去返回早上好、中午好、晚上好来讲解单元测试。

通过传入不同的时间(边界值)来确保代码能够正确处理各种情况以及是否达到了预期的功能。

预期结果为:

  • 早上好...
  • 中午好...
  • 晚上好..

项目搭建

主程序

首先需要创建一个控制台项目,起名为UnitTesting

并安装Microsoft.Extensions.DependencyInjection包,管理IOC容器。

创建ITimeProvider接口,并创建SystemTimeProvider类去实现这个接口

  1. public interface ITimeProvider
  2. {
  3. int GetHour();
  4. }
  5. //返回当前时间
  6. public class SystemTimeProvider: ITimeProvider
  7. {
  8. public int GetHour()
  9. {
  10. return DateTime.Now.Hour;
  11. }
  12. }

创建GreetingService

  1. public class GreetingService
  2. {
  3. private readonly ITimeProvider _timeProvider;
  4. public GreetingService(ITimeProvider timeProvider)
  5. {
  6. _timeProvider = timeProvider;
  7. }
  8. /// <summary>
  9. /// 通过当前时间来打返回问候语
  10. /// </summary>
  11. /// <param name="name"></param>
  12. /// <returns></returns>
  13. public string Greet(string name)
  14. {
  15. var hour = _timeProvider.GetHour();
  16. return hour switch
  17. {
  18. < 12 => $"Good Morning,{name}",
  19. < 18 => $"Good Afternoon,{name}",
  20. _ => $"Good Evening,{name}"
  21. };
  22. }
  23. }

Program.cs使用IOC容器注入服务并调用Greet方法

  1. using Microsoft.Extensions.DependencyInjection;
  2. using UnitTesting.Services;
  3. var container = new ServiceCollection();
  4. container.AddSingleton<ITimeProvider,SystemTimeProvider>();
  5. container.AddTransient<GreetingService>();
  6. var services = container.BuildServiceProvider();
  7. var greetingService = services.GetRequiredService<GreetingService>();
  8. var greeting = greetingService.Greet("吗喽");
  9. Console.WriteLine(greeting);

测试程序

xUnit模版创建单元测试,名为UnitTesting.Test,并添加UnitTesting项目引用,还需安装Moq包:

Moq包(全称Mocking Objects in C#,简称Moq)是一个流行的模拟框架,其主要作用在于模拟和验证对象的行为,以支持更加可靠和可重复的测试,简单来讲就是模拟创建对象。

回到GreetingService类,这里使用Rider提供的快捷方式创建测试类,当然也可以手动创建。如图:

image

测试流程:

  • Arrange:准备阶段,创建ITimeProvider的模拟对象provider,并指定时间参数且调用GetHour()方法,使用这个模拟对象创建GreetingService实例。
  • Act:执行阶段,调用GreetingServiceGreet方法
  • Assert:断言阶段,验证返回的消息是否与预期的结果相同。
  1. using JetBrains.Annotations;
  2. using Moq;
  3. using UnitTesting.Services;
  4. namespace UnitTesting.Tes.Services;
  5. [TestSubject(typeof(GreetingService))]
  6. public class GreetingServiceTests
  7. {
  8. [Fact]
  9. public void GreetReturnsMorningMessage()
  10. {
  11. // Arrange
  12. var provider = new Mock<ITimeProvider>();
  13. provider.Setup(x => x.GetHour()).Returns(10);
  14. var service = new GreetingService(provider.Object);
  15. // Act
  16. var message = service.Greet("吗喽");
  17. // Assert
  18. Assert.Equal("Good Morning,吗喽", message);
  19. }
  20. [Fact]
  21. public void GreetReturnsAfternoonMessage()
  22. {
  23. // Arrange
  24. var provider = new Mock<ITimeProvider>();
  25. provider.Setup(x => x.GetHour()).Returns(15);
  26. var service = new GreetingService(provider.Object);
  27. // Act
  28. var message = service.Greet("吗喽");
  29. // Assert
  30. Assert.Equal("Good Afternoon,吗喽", message);
  31. }
  32. [Fact]
  33. public void GreetReturnsEveningMessage()
  34. {
  35. // Arrange
  36. var provider = new Mock<ITimeProvider>();
  37. provider.Setup(x => x.GetHour()).Returns(20);
  38. var service = new GreetingService(provider.Object);
  39. // Act
  40. var message = service.Greet("吗喽");
  41. // Assert
  42. Assert.Equal("Good Evening,吗喽", message);
  43. }
  44. }

效果截图

主程序没什么好讲的,通过当前时间返回问候语。

image

测试程序通过3个测试方法测试了3种情况,早上好、中午好、晚上好,并全部测试通过。

image

总结

本文讲解了如何创建单元测试,并且通过单元测试来测试Greet方法,在传入不同的时间参数的情况下,判断是否满足3种情况。

本文提到了IOC容器、依赖注入、Moq、xUnit等知识点。

参考链接

原文链接:https://www.cnblogs.com/ZYPLJ/p/18270869

 友情链接:直通硅谷  点职佳

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号