如何在超时期间将测试的成功视为未发生的情况

时间:2018-03-08 08:19:02

标签: c# visual-studio unit-testing

我有一个简单的C#班级Calculate,其中包含方法Plus

public class Calculate
{
    private int value1 = 2;
    private int value2 = 4;
    private int result;

    public void Plus(int _value1, int _value2)
    {
        value1 = _value1;
        value2 = _value2;
        result = value1 + value2;
    }

    public int Result
    {
        get { return result; }
    }
}

并生成单元测试如下:

[TestClass()]
public class CalculateTests
{

    [TestMethod()]
    [Timeout(1000)]
    public void PlusTest()
    {
        Calculate calc1 = new Calculate();
        int counter = 0;
        while (true)
        {
            counter++;
            Random rnd = new Random();
            int x1 = rnd.Next(0, 10);
            int x2 = rnd.Next(0, 10);
            calc1.Plus(x1,x2);
            int expected = 10;
            int actual = calc1.Result;

            string message = string.Format("{0} + {1} = {2} at {3} repetion", x1, x2, actual, counter);
            Assert.AreNotEqual(expected, actual, message);
        }
    }

该测试检查两个随机整数的总和是否等于10.并且重复1秒。
问题是我应该如何设置超时或修改测试,以便如果在超时期间没有发生条件x1 + x2 == 10,则认为测试成功执行。

1 个答案:

答案 0 :(得分:0)

超时属性检查持续时间

它会检查测试的持续时间是否低于给定值,因此您无法以您希望的方式使用它。 你已经写出了退出测试的实际条件。

而不是while(true),为什么不使用:

var endDate = Datetime.Now + Timespan.FromSeconds(1);
while(DateTime.Now < endDate)
{
    // ... check there
}

一点上下文

正如你所看到的here,没有你所寻找的东西。为什么呢?

  • 因为它 反对单元测试的整个概念 (这应该是快速的,可以通过一致和确定的结果重现)。
  • 这意味着编写永不停止的单元测试(丑陋而真实)只是为了(杀死?)并且认为 杀死测试是成功的 ......

是的,while(true) is an anti-pattern和其他例子:

这意味着:

  • 如果有一个不可预见的案例没有达成休息,该计划将吃掉所有cpu ... ahah这么邪恶的程序......
  • 它略微隐藏了程序流程。
  • 它允许有几种不同的中断情况(在代码的不同部分分配相同的责任)