tnblog
首页
视频
资源
登录

.Net 5 XUnit 单元测试

6103人阅读 2022/3/25 18:23 总访问:3467226 评论:0 收藏:0 手机
分类: .net后台框架

.netcore

.Net 5 XUnit 单元测试


xUnit.net 是一个免费的、开源的、以社区为中心的 .NET Framework 单元测试工具。xUnit.net 由 NUnit v2 的原始发明者编写,是用于单元测试 C#、F#、VB.NET 和其他 .NET 语言的最新技术。xUnit.net 可与 ReSharper、CodeRush、TestDriven.NET 和 Xamarin 一起使用。它是.NET 基金会的一部分,按照他们的行为准则运作。它在Apache 2(OSI 批准的许可证)下获得许可。

Demo

创建项目

添加相关代码

  1. public class UnitTest1
  2. {
  3. [Fact]
  4. public void PassingTest()
  5. {
  6. Assert.Equal(4, Add(2, 2));
  7. }
  8. [Fact]
  9. public void FailingTest()
  10. {
  11. Assert.Equal(5, Add(2, 2));
  12. }
  13. int Add(int x, int y)
  14. {
  15. return x + y;
  16. }
  17. }

测试代码

Assert这个类是断言,它可以判断代码的结果是否是你想要的结果。(后续我们还会讲到)

属性

NUnit 3.x MSTest 15.x xUnit.net 2.x 注释
[Test] [TestMethod] [Fact] 标记测试方法。
[TestFixture] [TestClass] 不适用 xUnit.net 不需要测试类的属性;它在程序集中的所有公共(导出)类中查找所有测试方法。
Assert.That Record.Exception [ExpectedException] Assert.Throws Record.Exception xUnit.net 已经取消了 ExpectedException 属性以支持Assert.Throws.
[SetUp] [TestInitialize] 构造函数 我们认为使用[SetUp]通常是不好的。但是,您可以实现无参数构造函数作为直接替换。
[TearDown] [TestCleanup] IDisposable.Dispose 我们认为使用[TearDown]通常是不好的。但是,您可以IDisposable.Dispose直接替换。
[OneTimeSetUp] [ClassInitialize] IClassFixture 要获得每个类的夹具设置,IClassFixture<T>请在您的测试类上实现。
[OneTimeTearDown] [ClassCleanup] IClassFixture 要获得每个类的夹具拆卸,IClassFixture<T>请在您的测试类上实现。
不适用 不适用 ICollectionFixture 要获得每个集合的夹具设置和拆卸,ICollectionFixture<T>请在您的测试集合上实施。
[Ignore(“reason”)] [Ignore] [Fact(Skip=”reason”)] 在属性上设置 Skip 参数[Fact]以暂时跳过测试。
[Property] [TestProperty] [Trait] 在测试中设置任意元数据
[Theory] [DataSource] [Theory][XxxData]理论(数据驱动测试)。

属性说明

Fact

表示测试结果永远成立的那些Unit Test,他们的输入条件不变。


DisplayName参数可以为每一个方法命名。


Skip参数可以跳过当前方法,并说明原因。


Timeout参数可以设置超时时间

Theory

Theory继承至Fact,它可以通过不同的传参来进行测试。
一般与InlineData配合使用

  1. public class TheoryTest
  2. {
  3. [Theory(DisplayName = "Theory Test")]
  4. [InlineData(1, 1, 2)]
  5. [InlineData(1, 2, 3)]
  6. [InlineData(2, 2, 4)]
  7. public void Demo03_Theory_Test(int num01, int num02, int result)
  8. {
  9. Assert.Equal<int>(result, num01 + num02);
  10. }
  11. }

MemberData


InlineData方便了很多我们测试。
但是当不确定数据来源的时候,或者数据量很大的时候,总不可能一个一个加吧。
所以MemberData就出现了。
它可以提供不同的数据来源,比如:来源于数据库、xml、Excel、文本,我们也称之为数据驱动

无参数数据源


MemberData特性第一个参数是成员名称(即方法,属性或字段的名称)。
第二个参数是指方法所需要的参数。
这里我们先演示属性传入的方式。

  1. public class MemberDataTest
  2. {
  3. public static IEnumerable<object[]> InputData_MemberData
  4. {
  5. get
  6. {
  7. var driverData = new List<object[]>();
  8. //错的
  9. driverData.Add(new object[] { 3, 1, 2 });
  10. driverData.Add(new object[] { 8, 2, 3 });
  11. driverData.Add(new object[] { 9, 3, 5 });
  12. //对的
  13. driverData.Add(new object[] { 3, 4, 7 });
  14. driverData.Add(new object[] { 4, 5, 9 });
  15. driverData.Add(new object[] { 5, 6, 11 });
  16. return driverData;
  17. }
  18. }
  19. [Theory(DisplayName = "MemberData Theory Test")]
  20. [MemberData(nameof(InputData_MemberData))]
  21. public void MemberDataTest_Test(int num01, int num02, int result)
  22. {
  23. Assert.Equal<int>(result, num01 + num02);
  24. }
  25. }

带参数据源(方法)
  1. public class MemberDataTest
  2. {
  3. public static IEnumerable<object[]> InputData_MemberData(string flag)
  4. {
  5. var driverData = new List<object[]>();
  6. if (flag == "Default")
  7. {
  8. driverData.Add(new object[] { 1, 1, 2 });
  9. driverData.Add(new object[] { 1, 2, 3 });
  10. driverData.Add(new object[] { 2, 3, 5 });
  11. }
  12. else
  13. {
  14. driverData.Add(new object[] { 3, 4, 7 });
  15. driverData.Add(new object[] { 4, 5, 9 });
  16. driverData.Add(new object[] { 5, 6, 11 });
  17. }
  18. return driverData;
  19. }
  20. [Theory(DisplayName = "MemberData Theory Test")]
  21. [MemberData(nameof(InputData_MemberData), "Default")]
  22. public void MemberDataTest_Test(int num01, int num02, int result)
  23. {
  24. Assert.Equal<int>(result, num01 + num02);
  25. }
  26. }

定义类型
  1. public class MatrixTheoryData<T1, T2> : TheoryData<T1, T2>
  2. {
  3. public MatrixTheoryData(IEnumerable<T1> data1, IEnumerable<T2> data2)
  4. {
  5. Contract.Assert(data1 != null && data1.Any());
  6. Contract.Assert(data2 != null && data2.Any());
  7. foreach (T1 t1 in data1)
  8. {
  9. foreach (T2 t2 in data2)
  10. {
  11. Add(t1, t2);
  12. }
  13. }
  14. }
  15. }
  16. public static int[] Numbers = { 5, 6, 7 };
  17. public static string[] Strings = { "Hello", "world!" };
  18. public static MatrixTheoryData<string, int> MatrixData = new MatrixTheoryData<string, int>(Strings, Numbers);
  19. [Theory(DisplayName = "MemberData Theory Test")]
  20. [MemberData(nameof(MatrixData))]
  21. public void MemberDataTest_Test(string x,int y)
  22. {
  23. Assert.Equal(y, x.Length);
  24. }


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

bk

2021/2/2 18:26:49

[good][good]

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术