作者:Jakub Jareš
排版:Alan Wang
MSTest 附带一组分析器,用于检查您的测试代码并指出常见的错误和陷阱。这些错误可能很微妙,并导致测试框架完全忽略您的测试。
我们从 3.2.0 版本就开始提供这些分析器了,但在最新的 3.5.1 版本中,我们添加了一些我们认为您不应错过的分析器。
遗漏的测试
一个常见问题是当您忘记在类上添加 [TestClass] 时。MSTest 将无法知道类中有测试,也不会运行它们:
public class MyTests
{
[TestMethod]
public async Task TestMethod1()
{
Assert.Fail();
}
}
如果没有 MSTest.Analyzers,此代码在构建时不会出现警告或信息提示。运行测试时也不会出现测试失败的情况。由于类上没有 [TestClass] 属性,MSTest 会出于性能原因跳过整个类,并且您的测试将永远不会被找到。
但是使用分析器时您会在构建过程中收到一条信息提示:
我们建议将此信息提示升级为警告,甚至是构建错误。可以通过在 .editorconfig 文件中添加以下这行代码来实现:
[*.cs]
# MSTEST0030: Type containing '[TestMethod]' should be marked with '[TestClass]'
dotnet_diagnostic.MSTEST0030.severity = warning
为什么默认情况下这不是警告?
您可能会问为什么 MSTEST0030 默认是一条信息提示而不是默认的警告。原因是我们不能在 MSTest v3 中引入重大变更,而上述代码是一个常见的模式,用于从基类重用测试。
public class MyTestsBase
{
[TestMethod]
public async Task CommonTestMethod()
{
}
}
[TestClass]
public class MyTests : MyTestsBase
{
[TestMethod]
public async Task TestMethod1()
{
Assert.Fail();
}
}
在上面的例子中,测试 CommonTestMethod 不会从 MyTestsBase 运行,因为它没有 [TestClass] 属性,但它会被继承到 MyTests 中并在那里运行。
我们不推荐这种模式。相反,如果您不想从中运行测试,我们建议始终用 [TestClass] 标记类,并将基类设为抽象类。
[TestClass]
public abstract class MyTestsBase
{
[TestMethod]
public async Task CommonTestMethod()
{
}
}
[TestClass]
public class MyTests : MyTestsBase
{
[TestMethod]
public async Task TestMethod1()
{
Assert.Fail();
}
}
这种方法与上述方法类似,但您可以清楚地向分析器和测试框架说明 abstract 基类中包含共享逻辑,并且不应该自行运行。
AssemblyInitialize 格式错误
另一个有用的分析器的例子是修复 [AssemblyInitialize] 的签名,为程序集中的所有测试进行一次性设置。
我不知道您是否有同感,但我记不住这个方法的签名。当我出错时,我的测试根本就无法运行。这在 Visual Studio 中尤其令人烦恼,因为测试会一直保持蓝色,而我需要查看测试输出才能找到原因。
但是使用分析器,我可以轻松找出错误,甚至可以将自动修复应用于我的代码。
在这里我编写一个名为 Setup 的方法,VisualStudio 会在其下划线处添加警告,然后我按下 Ctrl+. 查看自动修复并应用它:
[TestClass]
public class MyTests
{
[AssemblyInitialize]
public void Setup()
{
}
}
将我的代码修复为测试框架可以识别的正确格式:
[TestClass]
public class MyTests
{
[AssemblyInitialize]
public static void Setup(TestContext context)
{
}
}
安装
开始使用 MSTest.Analyzers 的推荐方式是使用 MSTest nuget 包或 MSTest 项目 SDK(版本 3.2.0 或更新版本)。
https://learn.microsoft.com/dotnet/core/testing/unit-testing-mstest-getting-started
这些分析器还可以通过引用“MSTest.Analyzers” NuGet 包单独安装。
我们衷心建议所有使用 MSTest 的项目升级到 3.2.0 及更新版本,并启用这些分析器。
总结
本文中展示的两个分析器是我在日常工作中觉得最有用的分析器。但还有更多其他的分析器,例如:
-
MSTEST0003,确保您的测试方法具有正确的签名,例如是 public,而不是 async void。
-
MSTEST0001,建议启用测试并行化,因为我们已经看到多个测试基础通过这样做显著减少测试执行时间。
-
MSTEST0017,确保您以正确的顺序将参数传递给断言,以避免混淆测试失败消息。
还有 32 条规则,分为设计、性能和使用类别。帮助您编写格式正确、高性能且无错误的测试。
https://learn.microsoft.com/dotnet/core/testing/mstest-analyzers/overview
我们一直在寻找改进这些分析器或您缺少的新分析器的方法。我们欢迎您在我们的存储库 microsoft/testfx 上分享您的反馈、分析器的创意以及您的使用体验。