18

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

我发现这篇文章解释了必须为 xunit 关闭程序集的影子副本。所以我尝试了以下操作:

  1. 为了简单起见,我创建了全新的.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文件夹已正确创建。

  1. 我已将 XUnit 项目添加到解决方案中并创建了简单的[Fact]方法:
public class DotNetBenchmarkTest
{
    [Fact]
    public void TestMethod()
    {
        BenchmarkRunner.Run<TestScenarios>();
    }
}

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

  1. 我还尝试将具有以下内容的xunit.runner.json文件添加到我的 XUnit 项目的根目录中:
{
  "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json",
  "shadowCopy": false,
  "methodDisplay": "classAndMethod",
  "diagnosticMessages": true
}

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

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

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

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

4

1 回答 1

0

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

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

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

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

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

检查herehere以获得更多解释。

于 2020-09-01T13:15:16.653 回答