2011-11-30 43 views
8

我们有一个由构建服务器(Jenkins)构建和部署的C#/ ASP .Net Web应用程序。自动部署之前的构建步骤之一是确保所有自动化测试都通过 - 包括我们使用Selenium 2 WebDriver和NUnit进行的功能测试。处理在自动化部署过程中偶尔失败的硒测试

问题:有时候这些测试会随机失败。他们将获得100次构建成功,然后失败。他们因各种原因失败--Click()事件被忽略,元素无法找到,IE浏览器糟糕的一天,等等。我们有一个AJAX沉重的Web应用程序,所以我们严重依赖于WebDriverWaits,但我们总是采取在编写测试时考虑到这一点,就像我说的那样,大部分时间测试都通过了。

有什么方法可以避免或解决这个问题?即来到我的脑海里一对夫妇:

  • 接受一定数量的失败(似乎是一个坏主意)
  • 重新检测故障?

回答

9

我不喜欢你提到的任何建议,但我承认偶尔会使用它们。要做的最好的事情是确保在看似“随机”失败的情况下尽一切可能获取关于为什么它失败的所有数据。这是一个环境问题吗?机器上的其他一些过程是否会干扰测试?这是一个时间问题,只有在网站载入速度极慢或快速增长时才会出现。

你可能会尝试的一件事是浸泡测试你的自动化测试。在同一个版本和相同的环境中运行每个版本100次以上(因此您可以将这些版本排除为潜在的故障点),并找出偶尔发生故障的版本。看看他们是否在同一个地方或不同的地方失败。一般来说,当你通过这个练习时,你会发现一些测试真的有点片状,你可以将它们从日常运行中删除,直到它们被修复。任何自动化测试用例甚至可以包含一个浸泡作为签入标准。

我发现的另一个有用的东西,帮助我找到了一些看似随机的故障的底部,并对故障进行截图。通常你可以看到其他窗口或对话框弹出导致浏览器无法在最前沿,等等。

+0

谢谢,我喜欢'浸泡测试'的想法 - 做了(并截图)之后,我看到一些测试总是在同一个地方失败,所以我会仔细看看它们。 – Kryptic

+0

@Kryptic有趣。我正在处理类似的事情。仔细观察这些片状测试过程中是否还记得您发现的任何模式? – anjunatl

5

在这两者中,我宁愿重新运行测试失败,或者更确切地说,测试失败,重试测试。

如果您接受一定数量的测试失败,那么您会遇到关于哪些测试可能失败的问题。你将不得不有两套测试,一些允许失败,一些不允许。

对于重新运行,我不擅长使用NUnit进行测试,但您可以让测试自己管理重试。在JUnit中,您可以引入规则,以便在测试失败时重试最多3次。这可能会避免你遇到的大多数问题。我不知道如何在NUnit中执行此操作,但请参阅my answerHow to Re-run failed JUnit tests immediately?。这会给你一个总的想法。

+0

我要在这里给出的唯一警告是,重新运行测试失败有时可能意味着间歇性产品失败。至少记录失败,如果重试成功,您仍然可以执行自动部署,但至少会标记失败并对其进行调查。 –

+0

@SamWoods完全同意。 –

+0

谢谢,在NUnit中做这样的操作有点尴尬,但我设法加入这个,直到我将测试作为短期解决方案进行调试 – Kryptic