我的项目中使用的是.NET Core 3.1(Web API,VS2019)和XUnit 2.4.1。最近,我考虑添加一些性能测试,然后我找到了这个库-BenchmarkDotNet。由于我已经在使用XUnit进行其他测试,所以我想从XUnit [Fact]中运行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 文件中我有:
Translated text: "Then in Program.cs file, I have:"
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项目的根目录中的xunit.runner.json文件中:
{
"$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 链接 找到了选项 -noshadow,看起来该选项在旧版本中可用,但在我的 xunit控制台运行器v2.4.1 的帮助输出中未列出,但我还是试了一下。
所以我的问题是是否可以让 DotNetBenchmarkTest 与 XUnit 共同工作,如果可以,您能指出我错在哪里吗?
dotnet test -c Release
。 - Daniel Lidström