您现在的位置是:首页 > 行业发展

干货丨这3个C#单元测试工具,到底谁才是王者?

智慧创新站 2025-07-03【行业发展】141人已围观

简介概述单元测试单元测试(unittesting),是指对软件中的最小可测试单元(函数/模块/类)进行检查和验证。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。单元测试从长期来看,可以提高代码质量,减少维护成本,降低重构难度。但是从短期来...

概述

单元测试

单元测试(unittesting),是指对软件中的最小可测试单元(函数/模块/类)进行检查和验证。

单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

单元测试从长期来看,可以提高代码质量,减少维护成本,降低重构难度。但是从短期来看,加大了工作量,对于进度紧张的项目中的开发人员来说,可能会成为不少的负担。


单元测试应该遵循以下原则:

可靠性、可维护性、可读性;

尽量避免测试中的逻辑,一个单元测试应该是一系列的方法调用和断言;

避免重复代码;

测试隔离,低耦合,防止不同测试之间的互相影响。

主流C单元测试工具(开源工具数据来自于GitHub):

C单元测试工具,所以本文选取了星级排名前两名的NUnit、和MsTest。

测评指标

对C项目一样方便;如果用户不使用VS,那么也可以通过命令行执行.exe文件来执行单元测试,但是MsTest不提供自己单独的GUI界面。

MsTest中核心的概念有TestClass(测试类)、TestMethod测试方法、断言和初始化及清理方法。

TestClass:通过使用[TestClass]属性装饰类来声明测试类。该属性用于标识包含测试方法的类,最佳做法规定测试类应仅包含单元测试代码。

TestMethod:通过使用[TestMethod]属性装饰单元测试方法来声明测试方法。该属性用于标识包含单元测试代码的方法,最佳实践指出,单元测试方法应仅包含单元测试代码。

断言:断言是一段代码,当运行于测试一个条件或行为针对预期的结果。通过调用Assert类中的方法来执行。

初始化和清理方法:初始化和清理方法用于在运行之前准备单元测试,并在执行单元测试之后进行清除。初始化方法通过用[TestInitialize]属性装饰初始化方法来声明,而清理方法通过用[TestCleanup]属性声明清理方法。

许多时候会把VsTest和MsTest混淆,其实这两个概念之间还是有一定区别的。

VsTest是VisualStudio测试平台(VisualStudioTestPlatform)的简称,是一个开放且可扩展的测试平台,可用于运行测试,收集诊断数据和报告结果。VsTest支持运行在各种测试框架中并使用可插拔适配器模型编写的测试。根据用户的选择,所需的测试框架及其相应的适配器可以视情况以vsix或NuGet软件包的形式获取。可以使用测试平台公开的公共API来编写适配器。

MsTest是指微软开发的单元测试框架。目前MsTest最新的版本是MsTestV2,V2的版本依赖于两个包:和,用户在使用时可以通过Nuget下载这两个包来使用MsTest进行单元测试。MsTestV2主要是为了.netcore准备的,也可以在.netframework上运行,并且较V1版本新加入了一些扩展。

下图是VsTest的总体架构图,从图中可以看到,整个VsTest体系架构主要有四个组件:测试运行器、测试执行器、数据收集器和IDE。

其中,测试执行器部分主要包含一个执行测试的引擎,它把发现和执行测试的责任委托给了一些可扩展的测试适配器,允许测试平台基于第三方测试框架发现/运行测试。这将通过相应框架的适配器来完成,该适配器了解如何在该框架中定义测试,并可以运行它们以向测试平台提供结果。例如,MsTest适配器了解MsTest框架中编写的测试,VsTest中就会使用MsTest适配器发现并执行它们。

在图中还可以看到,测试运行器部分还包含一个VsTestconsole,其作用是使用命令行运行不同框架的测试。但是如果是采用MsTest作为测试框架,也可以使用作为命令行执行的工具。

(2)工具特点

支持为测试用例设置分类,执行时执行指定分类的测试方法:[TestCategory]

支持在一个或多个测试方法执行前后进行相关的准备、清理活动:[TestInitialize]和[TestCleanup]

支持为测试用例设置参数:[DataRow]

提供断言方法,判定期望值和实际值是否一致

支持使用断言等方式,对返回异常的测试用例进行异常判断:[ExpectedException]

图2-1MSTest中带参及异常判断实例

支持通过注解等方式跳过执行带有该注解的测试用例:[Ignore]

支持设置超时时间,通过在TestMethod中的[Timeout]属性可以设置单独测试case的超时时间;也可以在.runSettings配置文件中为所有case设置全局的超时时间。

图2-2MSTest中timeout属性实例

NUnit

框架介绍

(1)基本介绍

NUnit是专门针对于.NET的自动化单元测试框架,是XUnit家族的一个成员,最初是由Java的单元测是框架JUnit而来,作者最终用C编写,使其更加符合C#习惯,并充分利用了.NET中反射、客户属性等特性。因此,该工具具有丰富的单元测试历史的同时,也具有适当的C,FregionICalculatorMembers

publicintAdd(intparam1,intparam2)

{

returnparam1+param2;

}

publicintSubtract(intparam1,intparam2)

{

returnparam1-param2;

}

publicintMultipy(intparam1,intparam2)

{

returnparam1*param2;

}

publicdoubleDivide(intparam1,intparam2)

{

returnparam1/param2;

}

publicintConvertUSDtoRMB(intunit)

{

returnunit*this._();

}

单元测试工具(MsTest、NUnit、)来说,使用区别度并不是很大,具体如下:

MsTest作为内置的visualstudio测试工具来讲,操作简单,易于使用;另外,如果已经使用visualstudio作为编译器,不用做任何的安装即可使用,也是其较为明显的优点之一。但是其也存在在带参测试时不能同时支持异常判断,以及无法对测试用例排序等缺点。

NUnit作为比较成熟的C开源单元测试工具,对其特性及基本使用进行了介绍。其实在开源社区蓬勃发展的今天,众多开源工具之间的区别也通过很多次迭代渐渐在缩小,如本次重点调研的三款工具虽各有优势和劣势,但是差异已经不再那么明显,大家在使用时结合自身的业务背景来选择合适的工具即可。

很赞哦!(44)