技术速递|使用 MSTest.Analyzers 增强您的测试体验

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

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值