C#使用MSTest进行单元测试

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

如果在大一点的项目中使用到还罢了,但如果只是随手想写一点单元测试引入这一堆包确实看着不大舒服。于是我又看了下MS自家的MS TEST。发现随着发展,MS自家的MS TEST也改变了不少,虽然以前用过老版MS TEST的朋友基本上能拿着就用,但本文这里仍然简单的介绍一下,方便新手上路。

目前MS发布了两个版本的MS TEST:

  • MS TEST V1: V1在.net framework中自带,引用Microsoft.VisualStudio.QualityTools.UnitTestFramework即可
  • MS TEST V2: V2的版本依赖于两个包: MSTest.TestFramework和MSTest.TestAdapter

这两个版本使用起来还是大同小异的,MS TEST V2主要是为了.net core准备的,当然也可以在.net framework上运行,并且新加入了一些扩展。本文这里是针对MS TEST V2进行的介绍。

首先来写一个简单的用例:

[TestClass]
public class TestClass
{
    [TestMethod]
    public void TestPass()
    {
        Assert.IsTrue(true);
    }

    [TestMethod]
    public void TestFail()
    {
        Assert.IsTrue(false);
    }
}

写完后编译即可在测试管理器上看到用例,运行它就可以看到结果了:

测试用例声明:

  • 测试用例的类必须是public的,并且用TestClassAttribute标记
  • 测试用例必须是public的,并且用TestMethodAttribute标记

Xunit并不需要TestClass声明,但给测试类声明也是有好处的,可以对其下的所有测试用例分组。

断言:

可以用Assert断言类来检验测试是否成功,也可以自己写帮助类抛异常检验。

构建和析构:

和Xunit非常类似,测试框架执行每个测试用例的时候,会创建测试类对象,测试用例执行完后,如果测试类是IDisposable的,会执行Dispose函数。因此,简单的做法是:

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

另外,也可以通过TestInitialize和TestCleanup两个Attribute来指定额外的构建和清理函数。通过函数指定的构建和析构函数在测试异步函数的时候还是非常有用的。这样,一个测试用例执行的顺序是

  • 构造函数
  • TestInitialize制定的构建函数(如果有)
  • 测试用例
  • TestCleanup制定的清理函数(如果有)
  • IDisposable. Dispose函数(如果有)

分组:

分组可以通过TestCategory标记:

[TestClass,TestCategory("MS TEST V2")]
public class TestClass

查看方式中要选择按特征分类:

这个标记也可以放在测试类,也可以放在测试用例上,效果不一样,请自行尝试。

参数传入:

这个是老版本的MS TEST的最大不足了,现在也可以通过DataRowAttribute指定测试用例的参数:

[DataTestMethod]
[DataRow(1, 2, 3)]
[DataRow(3, 5, 8)]
[DataRow(7, 6, 11)]
public void AddTest(int n1, int n2, int sum)
{
    Assert.AreEqual(sum, n1 + n2);
}

也可以指定多组参数,测试就会执行多次用例。在MS TEST V2的版本中,还可以通过ITestDataSource接口实现自定义数据源。

异常测试:

异常下现在也和xunit一样采用断言的方式捕获了。

public void TestException()
{
    Assert.ThrowsException<InvalidOperationException>(() => foo());

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

扩展:

在MS TEST V2中,微软提供了一定的扩展支持,如下图所示(这些扩展也大部分支持MS TEST V1)

具体包括如下几点:

  • 特性扩展:

    通过继承TestPropety,可以更方便的为测试用例添加描述。详情:RFC 001

  • 断言扩展:

    通过内置的断言扩展,可以更简洁的方式定制自己的断言API。详情:RFC 002

  • 执行扩展:

    MSTest V2允许我们在以下两个层级加入扩展。

    测试方法级别:允许创建自己的TestMethod特性,定制执行逻辑

    测试类级别:允许创建自己的TestClass特性,定制内部所有测试方法的执行逻辑

详情:RFC 003

  • 数据驱动扩展:

    目前的MS TEST已经支持静态数据参数DataRow的支持,它的主要特点是:

    静态数据不能满足复杂的场景需要

    无法为多个用例共享

    如果需要更复杂的数据源,可以通过ITestDataSource接口实现。

小结:

MSTEST现在也非常简单易用了。不过感觉Xunit的功能还是要多些,例如XUNIT可以暂时跳过用例,也可以修改用例名称。我这里对MS TEST V2还处于管中窥豹的阶段,后面可能会在一些项目中尝试试用一下,可能还会写一些文章继续介绍它。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • mstest实现类似单元测试nunit中assert.throws功能

    我们做单元测试NUnit中,有一个断言Assert.Throws很好用,但当我们使用MsTest时你需要这样写: 复制代码 代码如下: [TestMethod][ExpectedException(typeof(ArgumentNullException))]public void WriteToTextFile(){PDFUtility.WriteToTextFile("D:\\ACA.pdf", null);} 现在让我们来扩展一下也实现类似成功能,增加一个类,代码如下: 复制代码

  • .Net使用Xunit工具进行单元测试

    不管你爱与不爱,单元测试对于一个软件的长治久安还是必不可少的一环.在Visual Studio 2012后,VS中的测试浏览器也能与第三方的集成了,用起来还是非常方便的.目前在.Net框架下的测试工具主要有Nunit.内置的MSTest以及Xunit这三个工具,本文就简单的介绍一下如何在VS中使用XUnit这个测试框架的后起之秀. 安装Xunit: Xunit的安装现在不需要插件支持了,直接使用NuGet安装如下两个库即可: PM> Install-Package xunit PM> Inst

  • C# 单元测试全解析

    目录 1.前言 2.单元测试 2.1 单元测试的定义 2.2 单元测试的好处 2.3 单元测试的原则 3..NET 中的测试框架 3.1 MS Test 3.2 NUnit 3.3 XUnit 4.XUnit 的基本使用 5.其他 1.前言 "不会写单元测试的程序员不是合格的程序员,不写单元测试的程序员不是优秀的工程师." 那么问题来了,什么是单元测试,如何做单元测试. 2.单元测试 2.1 单元测试的定义 按照维基百科上的说法,单元测试(Unit Testing)又称为模块测试, 是

  • .NET Core单元测试的两种方法介绍

    应用程序测试的类型很多,包括集成测试,Web 测试,负载测试等.在最底层的是单元测试,此测试可以测试单个软件组件或方法.单元测试一般只测试开发人员的代码,不应该测试基础结构普.问题,如数据库,文件系统或网络资源等.单元测试可以使用测试驱动开发(TDD)编写,也可以将它们添加到现有代码已确认其正确性. 在编写单元测试时,注意不要随意地在基础结构上引入依赖项.这些依赖项往往使测试更慢,更脆弱,因此应该将其保留用于继承测试.可以通过遵循显示依赖性原则,使用依赖注入从框架请求依赖关系,以此来避免应用程序

  • ASP.NET Core项目使用xUnit进行单元测试

    目录 一.前言 二.创建示例项目 1.UnitTest.Model 2.UnitTest.Data 3.UnitTest.IRepository 4.UnitTest.Repository 5.UnitTestDemo 6.TestDemo 三.编写单元测试 1.运行单元测试 2.调试单元测试 一.前言 在以前的.NET Framework项目中,我们也写过一些单元测试的项目,而在ASP.NET Core 这种Web或者API应用程序中要做单元测试是很方便的. 这篇文章主要讲解如何使用xUnit

  • C#使用MSTest进行单元测试

    我之前写过一篇XUNit的简介:使用Xunit来进行单元测试.Xunit在当时确实是一个最简单易用的测试框架,然而,随着发展,Xunit也变得复杂了不少,光写一个最简单的测试就要导入8个包. 如果在大一点的项目中使用到还罢了,但如果只是随手想写一点单元测试引入这一堆包确实看着不大舒服.于是我又看了下MS自家的MS TEST.发现随着发展,MS自家的MS TEST也改变了不少,虽然以前用过老版MS TEST的朋友基本上能拿着就用,但本文这里仍然简单的介绍一下,方便新手上路. 目前MS发布了两个版本

  • xUnit 编写 ASP.NET Core 单元测试的方法

    还记得 .NET Framework 的 ASP.NET WebForm 吗?那个年代如果要在 Web 层做单元测试简直就是灾难啊..NET Core 吸取教训,在设计上考虑到了可测试性,就连 ASP.NET Core 这种 Web 或 API 应用要做单元测试也是很方便的.其中面向接口和依赖注入在这方面起到了非常重要的作用. 本文就来手把手教你如何用 xUnit 对 ASP.NET Core 应用做单元测试..NET Core 常用的测试工具还有 NUnit 和 MSTest,我本人习惯用 x

  • 浅谈.Net Core后端单元测试的实现

    1. 前言 单元测试一直都是"好处大家都知道很多,但是因为种种原因没有实施起来"的一个老大难问题.具体是否应该落地单元测试,以及落地的程度, 每个项目都有自己的情况. 本篇为个人认为"如何更好地写单元测试", 即更加 偏向实践向 中夹杂一些理论的分享. 下列示例的单元测试框架为 xUnit , Mock库为 Moq 2. 为什么需要单元测试 优点有很多, 这里提两点我个人认为的很明显的好处 2.1 防止回归 通常在进行新功能/模块的开发或者是重构的时候,测试会进行回

  • ASP.NET Core中使用xUnit进行单元测试

    单元测试的功能自从MVC的第一个版本诞生的时候,就是作为一个重要的卖点来介绍的,通常在拿MVC与webform比较的时候,单元测试就是必杀底牌,把webform碾压得一无是处. 单元测试的重要性不用多说了,有单元测试的做兜底的项目,好比给开发人员买了份保险,当然这个保险的质量取决于单元测试的质量,那些一路Mock的单元测试,看起来很美,但是什么都cover不到.目前工作中的一个老项目,有2万多个单元测试用例,其中不少是用心之作,真正落实到了业务逻辑,开发人员可以放心的去修改代码,当然一切都必须按

  • AngularJs unit-testing(单元测试)详解

    javascript是一门动态类型语言,这给她带来了很强的表现能力,但同时也使编译器几乎不能给开发者提供任何帮助.因为这个原因,我们感受到编写任何javascript代码都必须有一套强大完整的测试.angular拥有许多功能,让我们更加容易地测试我们的应用.我们应该没有借口不去写测试(这个嘛--). 一. It is all about NOT mixing concerns(全部都关于避免代码关系变得复杂--) 单元测试,正如名称那样,是关于测试单个"单元"的代码.单元测试努力解答这

  • 对Python的Django框架中的项目进行单元测试的方法

     Python中的单元测试 我们先来回顾一下Python中的单元测试方法. 下面是一个 Python的单元测试简单的例子: 假如我们开发一个除法的功能,有的同学可能觉得很简单,代码是这样的: def division_funtion(x, y): return x / y 但是这样写究竟对还是不对呢,有些同学可以在代码下面这样测试: def division_funtion(x, y): return x / y if __name__ == '__main__': print division

随机推荐