gpt4 book ai didi

c# - 使用异步方法在 Teamcity 上运行 xUnit 测试

转载 作者:行者123 更新时间:2023-11-30 14:52:17 25 4
gpt4 key购买 nike

我做了以下 xUnit 测试,它使用 HttpClient 调用网络服务器上的状态 api 方法。

[Fact]
public void AmIAliveTest()
{
var server = TestServer.Create<Startup>();

var httpClient = server.HttpClient;
var response = httpClient.GetAsync("/api/status").Result;

response.StatusCode.Should().Be(HttpStatusCode.OK);
var resultString = response.Content.ReadAsAsync<string>().Result;

resultString.Should().Be("I am alive!");
}

此测试在本地运行良好。但是当我提交代码并尝试在 TeamCity 构建服务器上运行相同的测试时,它会永远运行。我什至必须终止 xunit runner 进程,因为停止构建不会停止此进程。

但是当我这样写测试的时候

[Fact]
public async void AmIAliveTest()
{
var server = TestServer.Create<Startup>();

var httpClient = server.HttpClient;
var response = await httpClient.GetAsync("/api/status");

response.StatusCode.Should().Be(HttpStatusCode.OK);
var resultString = await response.Content.ReadAsAsync<string>();

resultString.Should().Be("I am alive!");
}

它在本地和 TeamCity 上运行良好。

我现在担心的是我忘记像第二个变体那样编写测试,而且有时 teamcity 构建会挂起。

谁能向我解释为什么在 teamcity buildserver 上运行的 xUnit 一开始就没有正确运行测试?有解决这个问题的方法吗?

最佳答案

Can anybody explain to me why xUnit running on the teamcity buildserver is not running the test correctly in the first place?

首先,我会检查您的 xUnit 版本 - 您应该运行最近发布的 2.0。我怀疑您的本地版本可能已过时。

核心问题就在这一行:

var resultString = response.Content.ReadAsAsync<string>().Result;

我怀疑你遇到了 deadlock situation我在我的博客上描述的。 HttpClient在某些平台上有一些方法没有正确使用ConfigureAwait(false),因此会出现这种死锁。 xUnit 2.0 将单线程 SynchronizationContext 安装到它的所有单元测试中,这提供了死锁场景的另一半。

正确的解决方案是将 Result 替换为 await,并将单元测试方法的返回类型从 void 更改为 任务

关于c# - 使用异步方法在 Teamcity 上运行 xUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32005912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com