我有一个自动化套件,使用:Mstest、Specflow和Ranorex
测试中的WPF应用程序很大,可以与许多应用程序交互,如MS Word、Browsers、Sharepoint、Abobe等。因此,自动化测试的流程不时出现问题,测试挂起。然后,这个挂起时间一直持续到VS/MsTest 30分钟默认超时到期,然后应用程序被终止,下一个测试可以开始。
我想减少这个等待时间。谷歌上经常出现两个选项:
- set[TestMethod,Timeout(x)]
- 编辑Local.testsettings测试超时值
但在这些条件下,这两种方法似乎都不起作用,因为:
-
Specflow忽略添加的任何MsTest属性,如下所示:
[TestMethod, Timeout(1000)] [When(@"I test")] public void WhenITest() { // some code }
-
"如果使用.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"