C# MSTest测试框架方法 C#如何使用MSTest

来源:这里教程网 时间:2026-02-21 17:39:40 作者:

直接说结论:MSTest 是 Visual Studio 内置的测试框架,

MSTestV2
(即
Microsoft.NET.Test.Sdk
+
MSTest.TestFramework
)是当前推荐版本,无需额外安装插件,但必须通过 NuGet 引入包,且类和方法需加特定特性才能被识别为测试。

如何标记一个方法为 MSTest 测试方法

只有带

[TestMethod]
特性的 public 无参实例方法才会被发现并执行。它必须定义在带
[TestClass]
特性的 public 类中——两者缺一不可。

常见错误现象:

Test method not found
或测试资源管理器里不显示方法,大概率是忘了加
[TestClass]
,或方法是
private
/
static
,或有参数。

[TestClass]
必须修饰类,不能是
struct
static class
[TestMethod]
方法不能有返回值(必须是
void
Task
),也不能有参数
若要异步测试,方法签名应为
public async Task MyTest()
,并用
await

常用断言怎么写(
Assert
类核心用法)

Assert
是 MSTest 的断言入口,所有校验都通过它完成。它不抛异常而是触发测试失败,且失败时会输出清晰上下文。

典型场景:验证返回值、异常是否抛出、集合是否包含某元素、浮点数近似相等。

基本相等:
Assert.AreEqual(expected, actual)
—— 支持重载,对
double
可加 tolerance 参数
引用相等(同一对象):
Assert.AreSame(expected, actual)
是否为 null:
Assert.IsNull(obj)
/
Assert.IsNotNull(obj)
是否抛出异常:
Assert.ThrowsException<argumentnullexception>(() => SomeMethod(null))</argumentnullexception>
集合校验:
Assert.IsTrue(list.Contains("x"))
或更语义化的
CollectionAssert.Contains(list, "x")

测试初始化与清理(
[TestInitialize]
[TestCleanup]

每个测试方法运行前/后都会执行一次带这些特性的方法,适合做单次资源准备(如新建临时文件、初始化 mock 对象),注意它们也必须是 public 无参实例方法。

容易踩的坑:误用

[ClassInitialize]
(整个类只执行一次,且所在方法必须是
static
,还要加
[AssemblyInitialize]
才能跨类生效),导致状态污染或并发问题。

[TestInitialize]
在每个
[TestMethod]
前执行,适合构造新实例
[TestCleanup]
在每个
[TestMethod]
后执行,适合释放
IDisposable
资源
不要在
[TestInitialize]
里做耗时操作(如连接数据库),会影响测试速度

运行 MSTest 需要哪些 NuGet 包

仅靠 Visual Studio 自带的测试引擎不够,必须显式添加两个关键包,否则编译通过但测试资源管理器里找不到任何测试。

缺少任一包都会出现 “No tests found” 或 “The test source file could not be loaded”。

Microsoft.NET.Test.Sdk
:提供测试主机和构建集成(必需)
MSTest.TestFramework
:提供
[TestClass]
Assert
等 API(必需)
可选:
MSTest.TestAdapter
(旧版需要,.NET 5+ 项目通常不需要单独装)

确认方式:检查

.csproj
中是否有类似以下内容:

<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.4.0" />

版本建议对齐 VS 当前支持的最新稳定版;混用过高或过低版本可能引发

Could not load file or assembly 'MSTest.TestFramework'

相关推荐