【问题标题】:How to fail a test that is stuck in an infinite loop?如何使陷入无限循环的测试失败?
【发布时间】:2012-08-27 16:06:24
【问题描述】:

我有一些代码会产生无限循环。现在我需要编写一个大约 200 毫秒后会失败的测试。 200ms表示代码处于无限循环中。

例如:

public void CodeUnderTest()
{
   while(true)
   {

   }
} 

【问题讨论】:

  • 您可以在测试设置下使用测试超时。编辑在每个测试开始时添加 [TestMethod(), Timeout(ms)]。或者在 testTimeout 设置中查看测试运行范围的超时
  • 在此处插入“停机问题”参考。
  • 怎么样?这并不能真正回答问题。
  • 您使用的是哪个框架?例如,xUnit 和 MSTest 具有 Timeout 属性。
  • 您实际上是针对 .NET 2.0 编写的吗?此时它已经 7 岁了,从那时起 3、3.5、4 和 4.5 都来了。

标签: c# .net unit-testing .net-2.0 mstest


【解决方案1】:

使用 MSTest 时,您可以使用属性

[TestMethod]
[Timeout(200)]

How to force tests to stop running

您可以设置执行测试或测试运行的时间限制 遵守。您可能需要这样做,例如,如果您 在测试实验室工作,需要在一定时间内完成测试运行 一天。

使用时间限制的另一种情况是无响应代码。

【讨论】:

  • @TheHe - 结果是超时。
  • 嗯,好吧......他必须决定在这个无限任务中期望什么行为;)
  • @P.Brian.Mackey - 我不知道究竟是为什么,但是当我尝试这个时,代码仍然永远运行......
  • @TheHe - 嗯,这就是我解释停机问题的方式。一般来说,对于复杂的问题,我们永远不知道一个程序是永远停止还是继续。在这种情况下,我们可以添加一个合理的超时时间,并假设如果超过了超时时间,那么程序就会陷入无限循环。
  • 恕我直言,他只想知道它是否会“在 500 毫秒内失败”。如果它运行的时间更长,他会认为它成功了——为什么?不知道,但这是我从问题中得到的;)“超时”是 mstest 中的错误情况,对吗? ;)
【解决方案2】:

怎么样:

Task.Create(CodeUnderTest).Wait(TimeSpan.FromSeconds(1));

或:

Task.Factory.StartNew(CodeUndertest).Wait(TimeSpan.FromSeconds(1));

或:

Task.Factory.StartNew(() => CodeUndertest(arg1,arg2,arg3...)).Wait(TimeSpan.FromSeconds(1));

【讨论】:

  • 当然可以,不要认为有一种框架方式可以实现目标——不应该有任何代码部分需要测试而永远运行;)
  • @TheHe - 出于某种原因,Create 对我来说不存在?
  • @O.O 使用Task.Factory.StartNew
  • 呃.. task.create 只能 >=.net4...查看已编辑的。
  • 完美。正是我想要的。
猜你喜欢
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2013-03-17
相关资源
最近更新 更多