直接说结论: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'。
