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 引入包,且类和方法需加特定特性才能被识别为测试。
只有带 [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
)
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] 里做耗时操作(如连接数据库),会影响测试速度仅靠 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'。