IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    Mia Wu发表于 2024-08-30 06:41:28
    love 0

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

    The post 使用 MSTest.Analyzers 增强您的测试体验 appeared first on .NET中文官方博客.



沪ICP备19023445号-2号
友情链接