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

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] 必须修饰类,不能是 structstatic class
  • [TestMethod] 方法不能有返回值(必须是 voidTask),也不能有参数
  • 若要异步测试,方法签名应为 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'