使用Xunit来进行单元测试

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

时间: 2024-12-12 04:15:55

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

用JUnit4进行单元测试代码编写

JUnit4简介 Junit是一个可编写重复测试的简单框架,是基于Xunit架构的单元测试框架的实例.JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用JDK 5的Annotation特性简化测试用例的编写.JDK 5里可以静态导入,例如import static org.junit.Assert.*;.Annotation又称注解(或元数据),其实就是@Before.@After.@BeforeClass.@AfterClass.@Test等等. @Before @Before

[小北De编程手记] : Lesson 01 - Selenium For C# 之 环境搭建

在我看来一个自动化测试平台的构建,是一种很好的了解开发语言,单元测试框架,自动化测试驱动,设计模式等等等的途径.因此,在下选择了自动化测试的这个话题来和大家分享一下本人关于软件开发和自动化测试的认识.刚刚开通了博客,就从最基础的开始吧,算是写给初学者的编程手记,也算是给对自动化完全不了解的小伙伴开个头.时间允许的话会坚持更新下去... ... 后续的文章计划会谈到一些企业级自动化测试平台的构建(但愿有时间完成哈~~). 关于自动化测试的框架,网上有很多相关的对比,在这里我我就不评论和对比了.本人

ASP.NET Core:使用Dapper和SwaggerUI来丰富你的系统框架

一.概述 1.用VS2017创建如下图的几个.NET Standard类库,默认版本为1.4,你可以通过项目属性进行修改,最高支持到1.6,大概五月份左右会更新至2.0,API会翻倍,很期待! 排名分先后,这里简要说下我对各个类库职责的一个理解. Light.Model:存放实际项目中你用到的所有实体集合,包括数据库表映射实体,请求实体,响应实体,视图显示实体以及一些公共实体类等,同时你还可以根据自己业务的模块功能进行更细致的划分. Light.IRepository:数据库仓储接口,定义你操作

ASP.NET 系列:单元测试之ConfigurationManager

通过ConfigurationManager使用.NET配置文件时,可以通过添加配置文件进行单元测试,虽然可以通过测试但达不到解耦的目的.使用IConfigurationManager和ConfigurationManagerWrapper对ConfigurationManager进行适配是更好的方式,ConfigurationManagerWrapper提供.NET配置文件方式的实现,如果需要支持其他配置,创建IConfigurationManager接口的不同的实现类即可. 1.定义ICon

ABP总体介绍

ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板. ASP.NET Boilerplate 基于DDD的经典分层架构思想,实现了众多DDD的概念(但没有实现所有DDD的概念). ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上

mock的概念

1 现有的单元测试框架单元测试是保证程序正确性的一种有效的测试手段,对于不同的开发语言,通常都能找到相应的单元框架. 借助于这些单测框架的帮助,能够使得我们编写单元测试用例的过程变得便捷而优雅.框架帮我们提供了case的管理,执行,断言集,运行参数,全局事件工作,所有的这些使得我们只需关注:于对于特定的输入,被测对象的返回是否正常.那么,这些xUnit系列的单元测试框架是如何做到这些的了?分析这些框架,发现所有的单元测试框架都是基于以下的一种体系结构设计的. 如上图所示,单测框架中通常包括Tes

初探领域驱动设计(1)为复杂业务而生

概述 领域驱动设计也就是3D(Domain-Driven Design)已经有了10年的历史,我相信很多人或多或都都听说过这个名词,但是有多少人真正懂得如何去运用它,或者把它运用好呢?于是有人说,DDD和TDD这些玩意是一些形而上的东西,只是一茶余饭后的谈资,又或是放到简历上提升逼格而已.前面这句话我写完之后犹豫了,犹豫要不要把它删掉,因为它让我看起来像个喷子,我确实感到不解,为什么别人10年前创造总结出来的东西,我们在10年之后对它的理解还处于这么低的一个层次.开篇就说远了,我也是最近才开始认

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

点这里进入ABP系列文章目录 ABP总体介绍: ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板. ASP.NET Boilerplate 基于DDD的经典分层架构思想,实现了众多DDD的概念(但没有实现所有DDD的概念). ABP的官方网站:http://www.aspnetboilerplate

单元测试之道(使用NUnit)

首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上的按钮,顿时你刚刚的轻松感烟消云散:系统无法正常工作,你想读的数据显示不出来,你想存的东西也送不到数据库……于是,你再次回 到IDE里,设断点.调试.一层一层跟踪,当你精疲力尽终于将数据送到数据库里,你又发现了其它问题,于是你继续设断点.调试.编译.调试…… 2.你狂躁地敲击着键盘和鼠标,咒骂着不断