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



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

测试中的WPF应用程序很大,可以与许多应用程序交互,如MS Word、Browsers、Sharepoint、Abobe等。因此,自动化测试的流程不时出现问题,测试挂起。然后,这个挂起时间一直持续到VS/MsTest 30分钟默认超时到期,然后应用程序被终止,下一个测试可以开始。

我想减少这个等待时间。谷歌上经常出现两个选项:

  1. set[TestMethod,Timeout(x)]
  2. 编辑Local.testsettings测试超时值

但在这些条件下,这两种方法似乎都不起作用,因为:

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

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

因此,我需要一个变通办法!似乎最好的方法是直接使用Specflow挂钩(如答案3中所建议的)。但是,要在一个巨大的框架中实现这一点,并确保每个功能文件都添加了标记,似乎可能会出现人为错误。

有人克服过类似的问题吗?

出于好奇,您是否正在调试有问题的测试?据我所知,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");
    }

之后一定要正确地清理测试环境,以免文档或服务调用挂起。

如果您愿意在默认情况下将其添加到所有测试中,则不需要将其添加至每个特性文件。只需添加一个没有标记的[BeforeScenario],并在其中插入您的附加代码,它就会被添加到每个测试中。

您还可以通过检查是否存在选择退出标记来"选择退出"一些测试,并且在这种情况下不执行代码:

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

我不确定你将如何将MSTest超时属性添加到你的测试中,但如果你似乎认为另一个答案提供了这些信息,那么我将把它留给学生练习。

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

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

因此,上面的选项2最终对我有效:*编辑Local.testsettings测试超时值

修复方法是,我需要在TeamCity构建步骤中指定Local.testsettings作为附加参数。

示例:TeamCity-构建步骤

  • 转轮类型=MsTest

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

  • 其他命令行参数=/testsettings:"Trunk/Tests/AutomationTests/ProjectName/local.testsettings"

相关内容

  • 没有找到相关文章

最新更新