不管你爱与不爱,单元测试对于一个软件的长治久安还是必不可少的一环。在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")]

使用Xunit来进行单元测试的更多相关文章

  1. .Net Core ----通过XUnit进行接口单元测试(带请求头及参数)并用output输出结果

    最近在做core的接口单元测试,所以在这拿出来分享一下,添加XUnit的nuget包 话不多说,直接上代码了: 输出结果(需要的命名空间using Xunit.Abstractions;): ITes ...

  2. VS2015 使用Xunit来进行单元测试

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

  3. xunit 单元测试

    代码:GitHub 参考地址:https://github.com/Acumatica/xunit.autofac xunit +autofac进行单元测试 ①创建一个类库 引用nuget: xuni ...

  4. C#单元测试面面观

    标题有点标题党,但相信各位看完这篇文章一定会所收获,如果之前没有接触过单元测试或了解不深通过本文都能对单元测试有个全新认识.本文的特点是不脱离实际,所测试的代码都是常见的模式. 写完这篇文章后,我看了 ...

  5. [小北De编程手记] : Lesson 01 玩转 xUnit.Net 之 概述

    谈到单元测试,任何一个开发或是测试人员都不会觉得陌生.我想大多数的同学也都是接触过各种单元测试框架.关于单元测试的重要性,应该不会有太多的质疑.这个系列,我向大家介绍一下xUnit.Net的使用.就让 ...

  6. [转] VS 整合NUnit进行单元测试

    Jeff Wong原文 5分钟实现VS2010整合NUnit进行单元测试 1.下载安装NUnit(最新win版本为NUnit-2.6.0.12051.msi) http://www.nunit.org ...

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

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 前言 In computer programming, unit testing is a ...

  8. 使用MSTest进行单元测试

    我之前写过一篇XUNit的简介:使用Xunit来进行单元测试.Xunit在当时确实是一个最简单易用的测试框架,然而,随着发展,Xunit也变得复杂了不少,光写一个最简单的测试就要导入8个包. 如果在大 ...

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

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

随机推荐

  1. Jquery-pagination.js分页处理

    首先提供pagination.js的插件源码 /** * This jQuery plugin displays pagination links inside the selected elemen ...

  2. HTML常用标签与表格标签

    超链接标签: <a href="超链接地址" target="_blank">超链接的文字</a> _blank或new是在新网页中打开 ...

  3. 【USACO 1.4】Arithmetic Progressions

    /* TASK: ariprog LANG:C++ URL:http://train.usaco.org/usacoprob2?a=PA9lOcZrdWq&S=ariprog SOLVE:平方 ...

  4. HDFS源码分析:NameNode相关的数据结构

    本文主要基于Hadoop1.1.2分析HDFS中的关键数据结构. 1 NameNode 首先从NameNode开始.NameNode的主要数据结构如下: NameNode管理着两张很重要的表: 1)  ...

  5. 【faster-rcnn】训练自己的数据集时的坑

    既然faster-rcnn原版发表时候是matlab版代码,那就用matlab版代码吧!不过遇到的坑挺多的,不知道python版会不会好一点. ======= update ========= 总体上 ...

  6. MapReduce实现二度好友关系

    一.问题定义 我在网上找了些,关于二度人脉算法的实现,大部分无非是通过广度搜索算法来查找,犹豫深度已经明确了2以内:这个算法其实很简单,第一步找到你关注的人:第二步找到这些人关注的人,最后找出第二步结 ...

  7. Linux Device Driver && Device File

    catalog . 设备驱动程序简介 . I/O体系结构 . 访问设备 . 与文件系统关联 . 字符设备操作 . 块设备操作 . 资源分配 . 总线系统 1. 设备驱动程序简介 设备驱动程序是内核的关 ...

  8. PHP滚动日志

    PHP滚动日志类库 PHP记录日志,我之前接触过的有按照年月分文件夹,然后按照日分文件的日志记录方式,这种方式有利有弊,有他的使用场景,我今天要说的是另一种日志记录方式--文件滚动方式记录日志,当然了 ...

  9. RabbitMQ Queue分发多个Consumer

    多个Consumer的消息分发 之前讲过一个queue对应一个consumer的小例子, 但是在实际项目中,一个consumer肯定是不够的,queue中的消息过多.一个consumer明显会处理过慢 ...

  10. COGS 577 蝗灾

    传送门 时间限制:2 s 内存限制:128 MB DESCRIPTION C国国土辽阔,地大物博......但是最近却在闹蝗灾..... 我们可以把C国国土当成一个W×W的矩阵,你会收到一些诸如(X, ...