August 29th, 2024

使用 MSTest.Analyzers 增强您的测试体验

Mia Wu
Partner Technical Advisor

本篇翻译于Jakub Jareš的Supercharge your testing experience with MSTest.Analyzers – .NET Blog (microsoft.com) 

MSTest 附带一组分析器,用于检查您的测试代码并指出常见的错误和陷阱。这些错误可能很微妙,并导致测试框架完全忽略您的测试 

我们从 3.2.0 版本就开始提供这些分析器了,但在最新的 3.5.1 版本中,我们添加了一些我们认为您不应错过的分析器 

遗漏的测试 

一个常见问题是当您忘记在类上添加 [TestClass] 时。MSTest 将无法知道类中有测试,也不会运行它们 

public class MyTests

{
    [TestMethod]
    public async Task TestMethod1()
    {
      Assert.Fail();
    }
}

如果没有 MSTest.Analyzers,此代码在构建时不会出现警告或信息提示。运行测试时也不会出现测试失败的情况。由于类上没有 [TestClass] 属性,MSTest 会出于性能原因跳过整个类,并且您的测试将永远不会被找到 

但是使用分析器时您会在构建过程中收到一条信息提示 

Info message for MSTEST0030 shown in Visual Studio Error List

我们建议将此信息提示升级为警告,甚至是构建错误。可以通过在 .editorconfig 文件中添加以下这行代码来实现 

[*.cs]
# MSTEST0030: Type containing '[TestMethod]' should be marked with '[TestClass]'
dotnet_diagnostic.MSTEST0030.severity = warning

Warning message for MSTEST0030 shown in Visual Studio Error List

为什么默认情况下这不是警告? 

您可能会问为什么 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()
  {
  }
}

Warning message for MSTEST0012 shown in Visual Studio Error List

Fixing signature via lightbulb menu

将我的代码修复为测试框架可以识别的正确格式 

 

 [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 上分享您的反馈、分析器的创意以及您的使用体验。  

Author

Mia Wu
Partner Technical Advisor

0 comments