2

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

正在测试的 WPF 应用程序很大,并且与 MS Word、浏览器、Sharepoint、Abobe 等许多应用程序交互。因此,自动化测试的流程有时会出现问题,并且测试会挂起。然后,此挂起时间将持续到 VS/MsTest 30 分钟默认超时到期,然后应用程序被终止并可以开始下一个测试。

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

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

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

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

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

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

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

4

3 回答 3

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");
    }

事后请务必正确清理您的测试环境,以免留下文档或服务呼叫挂起。

于 2014-11-07T13:47:44.433 回答
1

如果您愿意默认将其添加到所有测试中,则无需将其添加到每个功能文件中。只需添加一个[BeforeScenario]不带标签的代码并在其中插入您的附加代码,它将被添加到每个测试中。

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

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

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

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

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

于 2014-11-06T12:18:50.903 回答
0

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

解决方法是我需要将 Local.testsettings 指定为 TeamCity 构建步骤中的附加参数。

示例:TeamCity - 构建步骤

  • 跑步者类型 = MsTest

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

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

于 2015-07-09T09:26:11.940 回答