我们有一个由构建服务器(Jenkins)构建和部署的C#/ ASP .Net Web应用程序。自动部署之前的构建步骤之一是确保所有自动化测试都通过 - 包括使用Selenium 2 WebDriver和NUnit进行的功能测试。
问题:有时候这些测试会随机失败。他们将成功完成100个构建,然后一个失败。它们由于各种原因而失败 - 一个.Click()事件被忽略,元素无法找到,IE有一个糟糕的一天等等。我们有一个AJAX沉重的Web应用程序,因此我们非常依赖WebDriverWaits但我们总是采取在编写测试时考虑到这一点,就像我说测试确实在大部分时间都通过了。
有哪些方法可以避免或解决此问题?我想到了一对夫妇:
答案 0 :(得分:9)
我不喜欢你提到的任何一个建议,但我承认偶尔会使用它们。最好的办法是确保当看似“随机”无法完成所有事情时,您可以获得有关其真正失败原因的所有数据。这是一个环境问题吗?机器上的其他一些过程是否会干扰测试?这是一个时间问题,只有当网站加载速度极慢或者速度很快时才会出现吗?
您可能尝试的一件事是对自动化测试进行浸泡测试。在相同的构建和相同的环境中运行每个100次(因此您可以将这些作为潜在的故障点排除)并找到偶尔失败的那些。看看他们是在同一个地方还是在不同的地方失败。一般来说,当你进行这个练习时,你会发现一些确实有点片状的测试,你可以将它们从日常运行中删除,直到它们被修复。您甚至可以将浸泡作为任何自动化测试用例的登记标准。
我发现的另一个有用的东西帮助我找到了一些看似随意的失败的底部,就是在失败时截取屏幕截图。通常你会看到弹出的其他窗口或对话框导致浏览器无法处于最前端等等。
答案 1 :(得分:5)
在这两者中,我更愿意重新运行测试失败,或者更确切地说,在测试失败时,重试测试。
如果您接受了一定数量的测试失败,那么您就会遇到允许哪些测试失败的问题。你必须有两组测试,一些允许失败,一些不是。
对于重新运行,我不是使用NUnit进行测试的专家,但您可以让测试自己管理重试。在JUnit中,您可以引入规则,以便在测试失败时,它最多重试3次。这可能会避免您遇到的大多数问题。我不知道如何在NUnit中执行此操作,但请参阅my answer至How to Re-run failed JUnit tests immediately?。这将为您提供一般的想法。