编码的UI测试等待UI线程很慢

时间:2013-12-04 05:45:02

标签: visual-studio coded-ui-tests

我在Visual Studio 2013中为我的ASP.NET MVC解决方案添加了编码UI测试。我很惊讶地看到测试的运行速度有多慢;在测试机器唤醒并开始填写表单字段之前,每个页面都会在那里停留一分钟或更长时间。

经过一些实验(包括关闭SmartMatch),我发现只需要调用

Playback.PlaybackSettings.WaitForReadyLevel = WaitForReadyLevel.Disabled;

解决了这个问题。但是,正如预期的那样,测试经常失败,因为UI线程还没有准备好让测试机器与表单上的控件进行交互。

调用

Playback.PlaybackSettings.WaitForReadyLevel = WaitForReadyLevel.UIThreadOnly;

如果运行缓慢,可以使测试可靠运行。

有什么想法或建议吗?是否有人希望有人能够深入了解WaitForReady机器的魔力?除了WaitForReadyLevel之外,还有其他与WaitForReady相关的设置吗?

3 个答案:

答案 0 :(得分:38)

经过一些实验,我已经找到了似乎是一组设置的组合,这些设置允许我的Coded UI测试可靠地全速运行 - 比我手动与网站交互的速度更快。

注意:相关的“文档”(如果你称之为博客“文档”)可以在这里找到:

这个技巧需要对默认播放设置进行一些修改:

  • 设置WaitForReadyLevel = WaitForReadyLevel.Disabled可让测试全速运行。但它也会禁用(慢!)魔法等待,直到可以安全地与页面上的控件进行交互。

  • 设置MaximumRetryCount并附加错误处理程序可处理因禁用“等待就绪”魔法而导致的大多数错误。因为我已经在重试逻辑中加了1秒Sleep,所以这个值实际上是我愿意等待页面加载并变得响应的秒数。

  • 显然,未能找到测试中的控件不是错误处理程序/重试机制处理的错误之一。如果新页面加载时间超过几秒钟,并且测试正在寻找在新页面加载之前不存在的控件,则测试无法找到控件并且测试失败。设置ShouldSearchFailFast = false可以为您提供加载页面的完整超时时间,从而解决了这个问题。

  • 设置DelayBetweenActions = 500似乎解决了一个问题,我偶尔会看到UI错过了页面加载后立即发生的按钮点击。测试机器似乎认为点击了按钮,但网页没有响应。

  • “文档”表示默认搜索超时为3分钟,但实际上大于10分钟,因此我明确将SearchTimeout设置为1秒(1000毫秒)。

为了将所有代码保存在一个地方,我创建了一个包含所有测试使用的代码的类。在我的每个测试类中,MyCodedUITests.StartTest()方法都会调用[TestInitialize]

这段代码实际上应该只针对所有测试执行一次(而不是每次测试一次),但是我找不到让Playback.PlaybackSettings调用在[AssemblyInitialization]中工作的方法}或[ClassInitialization]例程。

/// <summary> A class containing Coded UI Tests. </summary>
[CodedUITest]
public class UI_Tests
{
    /// <summary> Common initialization for all of the tests in this class. </summary>
    [TestInitialize]
    public void TestInit()
    {
        // Call a common routine to set up the test
        MyCodedUITests.StartTest();
    }

    /// <summary> Some test. </summary>
    [TestMethod]
    public void SomeTest()
    {
        this.UIMap.Assert_HomePageElements();
        this.UIMap.Recorded_DoSomething();
        this.UIMap.Assert_FinalPageElements();
    }
}


/// <summary> Coded UI Test support routines. </summary>
class MyCodedUITests
{
    /// <summary> Test startup. </summary>
    public static void StartTest()
    {
        // Configure the playback engine
        Playback.PlaybackSettings.WaitForReadyLevel = WaitForReadyLevel.Disabled;
        Playback.PlaybackSettings.MaximumRetryCount = 10;
        Playback.PlaybackSettings.ShouldSearchFailFast = false;
        Playback.PlaybackSettings.DelayBetweenActions = 500;
        Playback.PlaybackSettings.SearchTimeout = 1000;

        // Add the error handler
        Playback.PlaybackError -= Playback_PlaybackError; // Remove the handler if it's already added
        Playback.PlaybackError += Playback_PlaybackError; // Ta dah...
    }

    /// <summary> PlaybackError event handler. </summary>
    private static void Playback_PlaybackError(object sender, PlaybackErrorEventArgs e)
    {
        // Wait a second
        System.Threading.Thread.Sleep(1000);

        // Retry the failed test operation
        e.Result = PlaybackErrorOptions.Retry;
    }
}

答案 1 :(得分:6)

编码的UI搜索屏幕上的控件,如果成功,搜索速度非常快。但是,如果搜索失败,那么Coded UI会尝试使用“智能匹配”方法,这可能会很慢。避免编码UI回退到使用智能匹配的基本方法是删除或简化可能在运行之间发生变化的搜索项。

This Microsoft blog提供了很多关于发生了什么以及如何修复它的解释。其中的示例通过更改

中的搜索字符串显示从30秒到8秒的加速
Name EqualsTo “Sales order‬ (‎‪1‬ - ‎‪ceu‬)‎‪ - ‎‪‪‪Sales order‬: ‎‪SO-101375‬‬, ‎‪‪Forest Wholesales”

Name Contains “Sales order‬ (‎‪1‬ - ‎‪ceu‬)‎‪ - ‎‪‪‪Sales order‬: ‎‪SO”

答案 2 :(得分:0)

似乎是从Microsoft动态工具捕获的。请检查从检查工具捕获的字符串的长度。您将找到一些隐藏的角色。只需订购‬(‪1‬-‪ceu‬)‪。否则,只需将光标从“(”移动到“)”即可。按下向右箭头键时,您会发现光标没有移动。