Specflow忽略Visual Studio单元测试属性'超时'

时间:2014-11-06 12:10:50

标签: c# timeout mstest specflow ranorex

我有一个使用的自动化套件:Mstest,Specflow和Ranorex

受测试的WPF应用程序很大,并且与许多应用程序(如MS Word,浏览器,Sharepoint,Abobe等)进行交互。因此,自动化测试的流程不时会出现打嗝而且测试仍然存在。此挂起时间将继续,直到VS / MsTest 30分钟默认超时到期,然后应用程序被终止并且下一个测试可以开始。

我想减少这段等待时间。谷歌有两个不断出现的选项:

  1. 设置[TestMethod,Timeout(x)]
  2. 编辑Local.testsettings测试超时值
  3. 但这些似乎都不适用于这些条件,因为:

    1. Specflow忽略添加的任何MsTest属性,如下所示:

          [TestMethod, Timeout(1000)]
          [When(@"I test")]
          public void WhenITest()
          {
              // some code
          }
      
    2. "如果您使用.testsettings文件...不允许您从第三方测试框架运行测试。" Source

    3. 因此我需要一个解决方法!似乎最好的方法是直接使用Specflow挂钩(如答案3中的建议here)。但是要将其实现到一个巨大的框架中并确保每个特征文件都添加了标记,这似乎有可能导致人为错误。

      任何人都遇到过类似的问题吗?

3 个答案:

答案 0 :(得分:1)

如果您乐意默认将其添加到所有测试中,则无需将其添加到每个功能文件中。只需添加一个没有标记的[BeforeScenario],然后在其中插入其他代码,它就会被添加到每个测试中。

您也可以选择退出'一些测试通过检查是否存在opt out标签而在这种情况下不执行代码:

[BeforeScenario()]
public static void BeforeWebScenario()
{
    if(!ScenarioContext.Current.ScenarioInfo.Tags.Contains("noReducedTimeout"))
        AddReducedTimeout;
}

我不确定如何将MSTest超时属性添加到您的测试中,但是您似乎认为其他答案提供了该信息,那么我将其作为学生的练习。< / p>

如果这不起作用,那么你应该能够通过为specflow添加一个插件来实现这一点,这将允许单元测试生成器使用此超时来增加生成的测试。不幸的是,关于如何做到这一点没有太多细节,但是this blog post应该指出你正确的方向。

如果您确实编写了一个插件,那么编写一个在父步骤定义中添加任何属性的插件通常会非常有用:)

答案 1 :(得分:1)

出于好奇,你在调试有问题的测试吗?据我所知,MsTest在调试会话期间没有考虑超时。

如果没有,您可以在测试初始化​​中添加一个计时器,设置为您希望的超时值。要添加到Sam Holder的答案中,您可以(使用MsTest语法):

    [TestInitialize]
    public void Initialize()
    {
        Timer timer = new Timer(FailTheTest, null, 0, timeoutValue);            
    }

    private void FailTheTest(object state)
    {
        Assert.Fail("Insert here your timeout message");
    }

请务必在事后正确清理测试环境,以免丢失文档或服务电话。

答案 2 :(得分:0)

事实证明,上面的选项2最终对我有用: *编辑Local.testsettings测试超时值

修复是我需要将Local.testsettings指定为TeamCity构建步骤中的附加参数。

实施例: TeamCity - 构建步骤

  • 亚军类型= MsTest

  • 列出程序集文件= /MyProject/UITests.dll

  • 其他命令行参数= / testsettings:&#34;中继/测试/ AutomationTests / ProjectName / local.testsettings&#34;