代码之家  ›  专栏  ›  技术社区  ›  Oak

重试Visual Studio C测试方法

  •  4
  • Oak  · 技术社区  · 15 年前

    我很好奇是否有内置的机制 重试 Visual Studio 2008单元测试框架中的测试。 举个例子,我有一个C单元测试,它看起来像:

    [TestMethod]
    public void MyMethod() {
        DoSomething();
        Assert.Something();
    }
    

    现在,偶尔 DoSomething() 性能不好;在这种情况下,我希望重新运行 剂量学() 方法,然后到达断言。显然,我可以做如下的事情:

    ...
    do {
        Initialization();
        DoSomething();
    } while (PerformedOK() == false);
    Assert.Something();
    ...
    

    尽管这有点麻烦,因为添加了循环并重复了测试初始化,否则将由其他方法/类构造函数完全处理。

    我的问题是是否有更方便的机制来重试测试,比如:

    DoSomething();
    if (PerformedOK() == false) Retry();
    else Assert.Something();
    

    将自动重试测试 没有 将其注册为失败,同时像往常一样执行所有常规初始化代码。

    2 回复  |  直到 8 年前
        1
  •  8
  •   Adam    8 年前

    认真地…

    偶尔执行dosomething()。 非常

    每次测试都应该是绿色的。如果被测试的代码有时执行“糟糕”,那么您需要修复代码,隔离不同的行为。您应该有两个测试,一个测试在剂量测量失败时断言正确(并且应该失败),另一个测试在剂量测量正常时断言正确(并且应该正常)。

    在测试中使用重试逻辑是错误的,IMO。您应该总是断言预期的结果,并且应该能够隔离和检测您的代码以返回您期望的结果。

    [编辑-添加了一些可用于重试循环的代码]

    您可以创建一个循环包装器,它接受任何方法并多次调用它,或者直到成功为止。您还可以让循环函数调用init,或者将其作为单独的参数传递。如果成功,该方法还可以返回bool。根据需要更改签名。

    [TestMethod]
    public void something()
    {
       Loop.LoopMe(TestMethod,3);            
       Assert.Something();
    }
    
    class Loop
    {
        public static void LoopMe(Action action, int maxRetry)
        {
            Exception lastException = null;
            while (maxRetry > 0)
            {
                try
                {
                    action();
                    return;
                }
                catch (Exception e)
                {
                    lastException = e;
                    maxRetry--;                    
                }                
            }
            throw lastException;
        }
    }
    
        2
  •  1
  •   Nix    15 年前

    第二个例子是几乎相同的代码行和相同的复杂性。有很多方法可以剥皮,你 能够 不是我提倡使用递归。

    [TestMethod]
    public void MyMethod() {
       bool success = DoSomething();
       Assert.IsTrue(success);
    }
    
    public boolean DoSomething(){
        //Do whatever
    
        if(performedOk){
           return true;
        }else{
            //find a way to stop it.
        }
    
    }
    

    但关键是它是一个单元测试。如果有什么事情导致它出错,您需要找到一种方法隔离您的测试,使它处于受控环境中。

    除非您有这样的要求,否则测试最终应该通过。最好的重试逻辑应该在失败后使用。单击测试并再次单击运行。