只有当远程桌面窗口打开时,才能在本地和TeamCity上通过Flaky测试



我有一些UI测试(使用FlaUI编写(将在本地通过,但在TeamCity上会失败。当我试图通过远程桌面查看在远程构建代理上运行的测试以查看错误时,我意识到如果远程桌面应用程序打开且未最小化,测试就会通过。这只是我测试中失败的一小部分,因为大多数测试在任何情况下都通过了。是什么原因造成的?

通常,当测试在本地通过,但在CI上失败时,有两个潜在原因:

  1. 可能有一个测试泄漏状态到全局环境中,该状态有时在失败的测试之前运行,导致其对全局环境的假设不正确,从而导致失败。或者
  2. 您可能会遇到两个测试之间的并行执行竞争条件,这两个测试都访问相同的共享全局状态(如缓存或键/值存储(

我在这里给出更详细的答案。

在您的特定情况下,我的猜测是,远程桌面窗口的事情是巧合,或者可能是某种原因迫使测试按特定顺序执行,从而使泄漏测试在测试之后运行,否则会失败。

要调试这种情况,您需要弄清楚是什么顺序导致了flacky测试失败。然后,您希望开始从测试运行中删除测试,直到找到导致失败的测试为止。一些测试工具(如RSpec(具有一个功能,允许您自动平分测试套件。如果可能的话,利用它。否则,您将不得不自己进行二进制搜索。

要自己做到这一点,请检查测试失败的构建日志,看看之前运行了哪些测试。然后运行它们,看看是否可以通过按相同顺序运行测试在本地复制它。如果你不能,那么你可能会遇到我上面描述的第二个问题。但是,如果可以的话,那么你只需要在失败之前运行前半部分测试,并在每次测试继续失败时将运行的测试减半。如果你运行了一半的测试,而测试没有失败,那么就运行另一半的测试。(希望导致测试失败的泄漏是由单个测试引起的。如果不手动调试,则会使变得非常困难。

最新更新