在 XUnit 中运行 BenchmarkDotNet

Posted

技术标签:

【中文标题】在 XUnit 中运行 BenchmarkDotNet【英文标题】:Running BenchmarkDotNet within XUnit 【发布时间】:2020-07-04 19:33:31 【问题描述】:

我在我的项目(web api,VS2019)和 XUnit 2.4.1 中使用 .NET Core 3.1。最近,我正在考虑添加一些性能测试,结果发现了这个库 - BenchmarkDotNet。由于我已经将 XUnit 用于其他测试,因此我想在 XUnit [Fact]s 中运行 BenchmarkDotNet

我发现了这个post,其中解释了必须为 xunit 关闭程序集的影子副本。所以我尝试了以下操作:

    为简单起见,我创建了全新的 .net core 3.1 控制台应用程序项目,其中包含我想要进行基准测试的示例方法:
[SimpleJob(RuntimeMoniker.NetCoreApp31)]
[MinColumn, MaxColumn, MedianColumn, KurtosisColumn]
[htmlExporter]
public class TestScenarios

    [Params("test")]
    public string TextToHash  get; set; 

    [Benchmark]
    public string CalculateSha256()
    
        var engine = SHA256.Create();
        var hash = engine.ComputeHash(Encoding.ASCII.GetBytes(TextToHash));
        return Encoding.ASCII.GetString(hash);
    

然后在 Program.cs 我有:

class Program

    static void Main(string[] args)
    
        BenchmarkRunner.Run<TestScenarios>();
    

Release 中编译和运行应用程序时,我验证了包含日志和基准输出文件的 BenchmarkDotNet.Artifacts 文件夹已正确创建。

    我已将 XUnit 项目添加到解决方案中并创建了简单的 [Fact] 方法:
public class DotNetBenchmarkTest

    [Fact]
    public void TestMethod()
    
        BenchmarkRunner.Run<TestScenarios>();
    

同样构建 Release 配置并从测试资源管理器运行此方法将在 bin/Release/dotnetcoreapp3.1/ 中创建 BenchmarkDotNet.Artifacts 文件夹> 但是日志文件是空的。

    我还尝试将具有以下内容的 xunit.runner.json 文件添加到我的 XUnit 项目的根目录中:

  "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json",
  "shadowCopy": false,
  "methodDisplay": "classAndMethod",
  "diagnosticMessages": true

但似乎对行为没有影响 - 我验证文件 xunit.runner.json 已复制到输出 bin 目录(属性->复制到输出目录->始终复制)。

    我还安装了 xUnit.net Console Runner v2.4.1 并尝试从控制台运行测试:
xunit .\path\assembly-name.dll -noshadow

再次没有运气。我在github link 找到的选项 -noshadow。似乎该选项在旧版本中可用,但未列出我的 xunit 控制台运行程序 v2.4.1 的帮助输出,但我试了一下。

所以我的问题是,是否可以让 DotNetBenchmarkTest 与 XUnit 一起工作,如果可以,你能指出我做错了什么吗?

【问题讨论】:

您对此有解决方案吗?通过测试运行,我的 Benchmark 方法只是说“N/A” 还要确保您在发布模式下运行。至少那是我必须做的。 dotnet test -c Release. 尝试检查您的 BenchmarkDotNet.Artifacts 文件夹中的日志文件并处理那里的任何问题。我的是“Assembly xx,它定义了基准引用 xx;如果您拥有此依赖项,请在 RELEASE 中构建它。如果您没有,您可以使用 'config.WithOptions(ConfigOptions.DisableOptimizationsValidator)' 禁用此策略。我结束了根据他们的文档使用配置。 【参考方案1】:

我正在 XUnit 测试中运行 BenchmarkDotNet 基准测试。

确保您的项目正在引用这些 NuGet 包

xunit xunit.runner.visualstudio Microsoft.NET.Test.Sdk

然后您可以从 Visual Studio 或通过命令行使用 dotnet test 运行 xunit 测试,因为这是 .NET Core 项目。

xunit.console.runner 能够运行 .NET Framework 项目。

查看here 和here 了解更多说明。

【讨论】:

以上是关于在 XUnit 中运行 BenchmarkDotNet的主要内容,如果未能解决你的问题,请参考以下文章

Xunit单元测试将无法运行

xUnit 无法输出到控制台 .NET

在 STA Thread WPF 下运行多个 xunit 测试时出现问题

使用 xunit 在 webapi 应用程序上运行 dotnet 测试

使用 OpenCover 运行 XUnit 和 FluentAssertions 会给出错误消息

如何根据当前平台跳过 xUnit 中的特定测试