MSTestV2是当前推荐版本,需通过NuGet引入Microsoft.NET.Test.Sdk和MSTest.TestFramework包;测试类须标记[TestClass],方法须为public、无参、void或Task返回类型并标记[TestMethod];断言统一用Assert类,初始化/清理用[TestInitialize]/[TestCleanup]。

直接说结论: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(() => SomeMethod(null)) - 集合校验:
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 中是否有类似以下内容:
版本建议对齐 VS 当前支持的最新稳定版;混用过高或过低版本可能引发 Could not load file or assembly 'MSTest.TestFramework'。










