不管你爱与不爱,单元测试对于一个软件的长治久安还是必不可少的一环。在Visual Studio 2012后,VS中的测试浏览器也能与第三方的集成了,用起来还是非常方便的。目前在.Net框架下的测试工具主要有Nunit、内置的MSTest以及Xunit这三个工具,本文就简单的介绍一下如何在VS中使用XUnit这个测试框架的后起之秀。

安装Xunit:

Xunit的安装现在不需要插件支持了,直接使用NuGet安装如下两个库即可:

  • PM> Install-Package xunit
  • PM> Install-Package xunit.runner.visualstudio -Pre (Visual Studio测试浏览器支持, VS2015目前必须装Pre的)

编写测试用例:

一个简单的测试用例如下:

public class TestClass1
    {
        [Fact]
        public void testMax()
        {
            Assert.Equal(3, Math.Max(3, 2));
        }

[Fact]
        public void testFail()
        {
            Assert.Equal(2, Math.Max(3, 2));
        }
    }

执行测试用例

在测试浏览器中执行RunAll即可(修改后不用编译,它会自动编译)

测试方式说明:

声明测试用例:

Xunit里面不需要TestClass之类Attribute来标记测试用例类,只需要满足如下条件即可:

  • 测试类必须是public的
  • 测试用例用FactAttribute标记

断言:

Assert类用来验证测试测试函数的输出结果。

Assert.Equal(3, Math.Max(3, 2));

也可以使用一些扩展的断言库,常用的就是xunit.should库,它是以扩展函数的方式进行验证,看起来更加舒服。

PM> Install-Package xunit.should

Math.Max(3, 2).ShouldBe(3);

不过,这个库和新版本的XUnit适配不是很好,我这里写了一个简单的版本:

    static class AssertExtension{public static void ShouldBe<T>(this T value, T exprected){if(Equals(value, exprected))return;var msg = $"与预期结果不一致,当前值是 '{format(value)}', 期望值是 '{format(exprected)}'";throw new InvalidOperationException(msg);}public static void ShouldNotBe<T>(this T value, T notExprected){if (!Equals(value, notExprected))return;var msg = $"与预期结果不一致,当前值不应该是 '{format(notExprected)}' ";throw new InvalidOperationException(msg);}static string format(object value){return value == null ? "NULL" : value.ToString();}}

构建和析构:

Xunit里面并不是通过SetUp和TearDown标记来表明测试用例的构建和析构操作,它每次执行测试用例的时候都会插件测试用例类,执行完成后,如果其实现了IDispose接口,则会调用Dispose函数,更加简洁明了。也就是说:

  • 在测试用例类的构造函数指向数据构建操作
  • 在Dispose函数中指向数据清理操作

异常测试

Xunit并不是通过Attribute来标记异常捕获的,而是直接使用Assert.Throws断言函数来验证异常。

public class TestClass1
    {
        [Fact]
        public void testException()
        {
            Assert.Throws<InvalidOperationException>(() => operation());
        }

void operation()
        {
            throw new InvalidOperationException();
        }
    }

更改测试用例名称:

[Fact(DisplayName = "Max函数测试")]

跳过测试用例:

[Fact(Skip ="重构未完成")]

分组:

[Trait("Group", "Category")]

转载于:https://www.cnblogs.com/shiningrise/p/5585830.html

使用Xunit来进行单元测试相关推荐

  1. VSCode + xUnit 编写 C# 单元测试

    概述 什么是单元测试?为什么要写单元测试?如何写一个单元测试?实话实说,写单元测试是一件挺麻烦的事情,却又是你在软件开发的成长路上难以回避的一个问题.我个人在以前也并不喜欢单元测试,不过现在我的态度有 ...

  2. 梦想成现实:用xUnit.net在单元测试中实现构造函数依赖注入

    英文关键词:Constructor Dependency Injection and Unit Testing(为了方便英文搜索) 自从博客园开发团队将开发架构迁移至DDD(领域驱动开发),就开始正式 ...

  3. 使用xUnit为.net core程序进行单元测试(中)

    第一部分:  使用xUnit为.net core程序进行单元测试(上), 下面有一点点内容是重叠的.... String Assert 测试string是否相等: [Fact] public void ...

  4. Xunit.net 单元测试学习——按顺序测试

    最近一直在提高编码的质量,为了保证质量,必须有一套趁手的兵器,Xunit.Net 就是如此霸气的利器. 怎么编写单元测试 怎么会有如此低级的疑问呢?因为从接触单元测试,到使用上,真的不是一个简单的心路 ...

  5. Source Generator 单元测试

    Source Generator 单元测试 Intro Source Generator 是 .NET 5.0 以后引入的一个在编译期间动态生成代码的一个机制,介绍可以参考 C# 强大的新特性 Sou ...

  6. ABP入门系列(11)——编写单元测试

    1. 前言 In computer programming, unit testing is a software testing method by which individual units o ...

  7. 单元测试JUnit 4 (一)——keeps the bar green to keeps the code clean

    1. 导读 Junit是一个可编写重复测试的简单框架,是基于Xunit架构的单元测试框架的实例.Junit4最大的改进是大量使用注解(元数据),很多实际执行过程都在Junit的后台做完了,而且写tes ...

  8. GTest基础学习-04-第3个单元测试-测试夹具test fixture

    这篇来学习一下Gtest中更高级一些的特性test fixture,测试夹具的基本上使用.什么的场景需要使用到测试夹具呢?测试夹具是哪个宏,这篇来学习这个主题. 1.什么叫test fixture 什 ...

  9. 基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之1.ABP总体介绍 ABP是"ASP.NET Boilerplate Project (ASP.NET样 ...

最新文章

  1. css实现左侧宽度自适应,右侧固定宽度
  2. Linux学习笔记--对文本的操作及正则表达式
  3. 微信多开txt_微信仅需3步操作,就能多开登录?手把手包教包会
  4. 坐标偏差大_控制点的坐标复核(二)
  5. python中执行shell脚本之subprocess模块_如何使用Python中的subprocess模块检查shell脚本的状态?...
  6. easyui 分页实现
  7. c语言关键用法大全,c语言关键字的用法详解
  8. 土木工程--钢筋下料软件(续)
  9. TensorFlow Keras 官方文档中文版文档学习
  10. 借助 Lucene.Net 构建站内搜索引擎(上)
  11. fetch bulk collect limt 学习
  12. 甜心奶酪用英文怎么说_您组织中没有人会碰到什么奶酪,更不用说动弹了?
  13. 前置机的作用(转载)
  14. python3 安装依赖库db4-devel和libpcap-devel安装失败 请大佬指教
  15. 7.13 hdoj1004 Let the Balloon Rise
  16. CLRS第十四章思考题
  17. java产生随机数的三种方式
  18. 在Ubuntu 16.04 / Linux Mint 18及更高版本上使用Epson L350(或L300 / L200系列扫描仪)
  19. Apache Camel核心概念
  20. 查德 斯托曼_书评:由查德·福勒(Chad Fowler)撰写的《热情的程序员》

热门文章

  1. php 动态图表,excel实现动态图表的3种方法是什么
  2. java和oc_Java和OC中的数据容器和数组
  3. python文件移动到文件夹_python – 将文件夹中的文件移动到顶级目录
  4. python无法导入模块_python怎么导入模块
  5. php drive mssql,wamp下对MS SQLSERVER的连接配置,PHP+THINKPHP5通过
  6. 阿德莱德计算机科学怎么样,阿德莱德大学计算机科学硕士专业怎么样?成为IT大牛的不二之选...
  7. 存储路径_KUKA C4机器人通过KRC CONFIGURATEOR设置存储路径
  8. 怎么定义int_面试官问:MySQL的自增ID用完了,怎么办?!
  9. rpm安装mysql5.6_利用rpm安装mysql 5.6版本详解
  10. 小学五年级计算机进度安排,苏教版小学五年级信息技术教学计划及进度安排.DOC...