【问题标题】:Microsoft.AspNet.TestHost.TestServer requires more than one Core/Processor?Microsoft.AspNet.TestHost.TestServer 需要多个核心/处理器?
【发布时间】:2016-03-27 11:45:11
【问题描述】:

article on strathweb 之后,我最近在我的 DNX 项目中添加了一些集成测试。这些在本地运行良好(对于内存网络服务器来说是的)。

但是,在运行 tests on a VM with only a single core 时,集成测试会无限期挂起(并最终失败,因为 appveyor 构建的上限为 60 分钟。

奇怪的是,当运行tests on a VM with more than one core 时,一切都运行良好。

显而易见的结论是,Microsoft.AspNet.TestHost.TestServer需要不止一个核心(或至少不止一个逻辑处理器)。有没有人有这方面的经验可以确认/拒绝?

【问题讨论】:

  • 仅供参考:Katana 是 DNX 应用程序的前身。您使用的是 DNX/ASP.NET5,而不是 Katana。
  • 分享测试代码可能会有所帮助。
  • 感谢 Tratcher - 编辑帖子以删除 Katana。测试代码是 here - 它是一个开源项目,所以被测试的代码也在那个 repo 中。
  • 啊,是.Result 让你崩溃了,它挂起你唯一核心上的线程,因此其他线程无法执行。将测试切换到public async Task 并使用await
  • 真棒@Tratcher - 成功了!谢谢你。单个内核无法处理多个线程(多线程早于多核架构)有点奇怪,但我想我需要对 async 进行更多阅读才能理解这一点。无论如何感谢您的帮助!

标签: continuous-integration cpu dnx appveyor


【解决方案1】:

@Tratcher 作为评论回复: xUnit 支持异步,所以让你的测试异步并返回任务(否则 xUnit 不知道你的测试结果,甚至在它完成运行之前它就会通过):

 [Fact]
        public async Task Get_hello_should_ignore_bob()
        {
            // Given a sample client
            var client = SampleClient();

            // When I call POST /account/signin
            var value = new StringContent("");
            var response = await client.PostAsync("/account/signin", value);

            // Then the result should be Hello
            string result = await response.Content.ReadAsStringAsync();
            result.Should().Be("\"Hello\"");
        }

现在您的测试是 async,您可以使用 await,而不是在任务上调用 .Result(这是导致您的问题的原因):

此外,值得注意的是为什么会发生这种情况。 See more about dead-lock and SynchronizationContext

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多