我在我的项目中使用.NET Core 3.1(web api,VS2019(和XUnit 2.4.1。最近,我正在考虑添加一些性能测试,我偶然发现了这个库——BenchmarkDotNet。由于我已经将XUnit用于其他测试,我想从XUnit[Fact]s中运行BenchmarkDotNet。
我在这篇文章中解释了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目录(Properties->Copy to output directory->Copy always(。
- 我还安装了xUnit.net Console Runner v2.4.1,并尝试从控制台运行测试:
xunit .pathassembly-name.dll -noshadow
再次没有运气。我在这个github链接上找到了选项-noshadow。这个选项在旧版本中似乎是可用的,但没有列出我对xunit控制台运行程序v2.4.1的帮助输出,但我尝试了一下。
所以我的问题是,是否有可能让DotNetBenchmarkTest与XUnit一起工作,如果有,你能告诉我我做错了什么吗?
我创建了一个包装器测试夹具,它运行基准测试,收集输出并在最后打印摘要:
public class Benchmarks
{
private readonly ITestOutputHelper output;
public Benchmarks(ITestOutputHelper output)
{
this.output = output;
}
[Fact]
public void Run_Benchmarks()
{
var logger = new AccumulationLogger();
var config = ManualConfig.Create(DefaultConfig.Instance)
.AddLogger(logger)
.WithOptions(ConfigOptions.DisableOptimizationsValidator);
BenchmarkRunner.Run<FooBenchmarks>(config);
// write benchmark summary
output.WriteLine(logger.GetLog());
}
}
[MemoryDiagnoser]
public class FooBenchmarks
{
[GlobalSetup]
public void Setup()
{
ModuleInitializer.Initialize();
...
}
[Benchmark]
public async Task ProcessRequest_Benchmark()
{
...
}
}
我正在XUnit测试中运行BenchmarkDotNet基准测试。
确保您的项目引用了这些NuGet包
- xunit
- xunit.runner.visualstudio
- Microsoft.NET.Test.Sdk
然后您可以从Visual Studio或通过命令行使用dotnet test
运行xunit测试,因为这是.NET Core项目。
xunit.console.runner
能够运行.NET Framework项目。
查看此处了解更多解释。