【问题标题】:When a TestMethod fails repeat once当 TestMethod 失败时重复一次
【发布时间】:2013-07-02 16:39:50
【问题描述】:

我正在为 ASP.NET MVC Web 应用程序编写编码的 UI 测试。我正在使用 Visual Studio 2012。

基本上我有一堆测试方法如下:

我使用有序的测试文件按我想要的顺序一次运行所有这些文件。

问题在于测试的工作方式是,如果一个测试失败,它会在输出中被标记为 ref/failed,如果我再次运行它,通常测试会起作用。 我希望能够将我的有序测试设置为运行,如果测试方法失败,它将自动尝试再次运行该测试方法

我该怎么做?我正在考虑在每个测试方法的末尾添加一个if 语句,例如:

if(TestFailed) {
    RecallTest();
}

我会使用某种计数器,但是如何在编码的 UI 测试中编写以上内容?

【问题讨论】:

  • 当测试失败时,它通常会给出什么错误?如果问题在于您的测试(例如在呈现控件之前尝试与控件交互的测试),您最好修改测试以使其更可靠,而不仅仅是重新运行。这样您就不会掩盖任何真正的错误。
  • 测试非常可靠,只是偶尔会出现超时错误或类似的情况,它只是一个冒烟测试,所以我不担心这种错误,但如果测试会通过我再次运行它。
  • 在问题中你说测试不可靠,因为它有时会失败。您描述的是应用程序或测试套件中的错误。当真正的用户(付费客户)使用应用程序时,忽略错误、隐藏错误并希望它消失会导致错误再次出现。
  • 这只是一个初步的冒烟测试,用于测试网站的基础知识,将在进一步测试中寻找更小的错误

标签: asp.net-mvc visual-studio coded-ui-tests automated-tests


【解决方案1】:

有几种方法可以解决这个问题。最明显的是这样的:

[TestMethod]
public void myTestMethod()
{
    int iteration = 0;
    if (iteration < 2)
    {
       try
       {
           // the usual test code goes here
       }
       catch (Exception)
       {
            // handles any exception kind
            iteration++;
            myTestMethod(); 
       }
    }
}

这将仅在方法失败时递归调用测试方法。您可以将其设置为捕获任何异常 (Exception) 或仅捕获特定异常 - 只需更改 catch 块中的异常类型。

这在 CodedUI 测试中通常是不鼓励的,因为它可能与测试运行器的内置异常报告交互不良(我建议查看添加日志记录以报告您遇到了失败)。但是,它只会为您提供一次重新运行(警告:我自己并没有实际尝试过 - 您可能需要调整代码以确保根据您的测试代码进行测试清理)。

【讨论】:

  • 它只是以无限循环结束,一遍又一遍地执行相同的方法。
  • iteration 应该在try...catch 之外递增,我会说代码“迭代地调用测试方法”而不是“递归地”。
  • if 改成while 可能会更好。
  • @AdrianHHH - 这就是我快速抨击可以提供 OP 想要作为起点的东西的结果。
【解决方案2】:

尝试使用播放错误处理:

 Playback.PlaybackError += Playback_PlaybackError;

这样您可以注册一个事件处理程序,每次播放遇到错误时都会调用该处理程序。

在事件处理方法中,您可以告诉回放重复引发错误的操作:

static void Playback_PlaybackError(object sender, PlaybackErrorEventArgs e)
{                              
    e.Result = PlaybackErrorOptions.Retry;
}

可以添加一个计数器来防止错误和重试的无限循环。

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多