2013-09-26 137 views
1

我们正在通过jenkins服务器运行一套Frank/cucumber测试来测试iOS应用。黄瓜 - 詹金斯重新运行失败测试

这些测试本地运行得很好,并且在jenkins服务器上手动运行也是如此。但是,当通过jenkins时,我们偶尔会遇到导致构建失败的错误,当我们再次运行jenkins时(即按下'Build now'按钮),无需更改任何内容即可正常工作。

我们运行下面的代码来运行测试:

cucumber features/ipad --tags [email protected] 

我接着又说了重新运行参数失败的测试转储到一个文本文件:

-f rerun -o rerun.txt 

然后跑去黄瓜重新运行。 TXT直后,所以它整个comman看起来像这样:

cucumber features/ipad --tags [email protected] -f rerun -o rerun.txt; cucumber @rerun.txt 

这工作正常,我t捕获失败的测试,并在其他测试后重新执行它们。

但是,jenkins仍然将构建标记为失败,即使重新运行通过。

有没有办法告诉黄瓜或詹金斯忽略第一次测试运行,并且只将重新运行测试标记为合格或失败?

或者有没有更好的方法呢?

感谢

回答

4

詹金斯脚本非常简单。脚本失败时构建失败,即具有非零的退出代码。

另外,如果您使用junit插件发布您的结果,请确保插件在结果中找到失败的测试时不会失败您的构建。

但是,试着找出测试失败的原因。总是获取测试运行的应用程序日志,并检查那里发生的事情。如果自动化测试不可靠,请使用手动测试。

此外,只要测试失败,您就可以使用黄瓜钩子截取屏幕截图。当你试图理解失败的测试时,这是一个很大的帮助。

+0

我认为你和Peter是正确的,因为测试需要重写/重新考虑,以免出现这些错误。当测试在本地运行良好时,这是令人沮丧的,但通过jenkins失败没有明显的原因。我会检查我们是否使用junit。谢谢! – MichalT

+1

@MichalT检查控制台日志,该日志应该准确显示构建失败的原因。无论如何,弗兰克手势有问题,他们不可靠。如果您只使用简单的触摸,测试可能会失败的原因有几个,例如动作之间的小延迟(使用'wait_for_nothing_to_be_animating'而不是睡觉)。我遇到了同样的问题,我的测试完全在本地运行。然而,事实证明jenkins失败几乎总是由测试中的问题引起的 - 或者是随机出现的真正bug。总是试图理解测试失败的原因。 – Sulthan

1

对不起,如果我无知或者只是不明白黄瓜的理念,但未能测试通常有一个理由。一般来说,找出你的测试失败的原因,然后解决这个问题(或你的测试)。

要更直接地回答您的问题,您可以查看Log Parser Plugin。我的直觉告诉我,当一个测试用例失败时,詹金斯正确地将工作标记为失败(或者更好的是不稳定)。

+0

感谢。测试运行正常,但偶尔失败时,iOS模拟器挂起,或任何数量(似乎)其他小的非代码相关的问题。大多数时候构建失败时,我们只是重新运行构建,它的工作原理。我希望有一种方法可以自动化重新运行,而不会导致构建首先失败。 – MichalT

+0

你有没有找到解决这个问题的办法,我和你有同样的问题。 @MichalT –

+0

不是真的我害怕。通过确保ruby和相关的gem被更新,我们使它更加稳定,b)和本地机器上运行的一样(我们没有问题)。我们也会定期重启,这似乎有助于...... @ deluded12ga – MichalT

0

你为什么不尝试使用常规

def getResults(){ 
AbstractTestResultAction testResultAction = currentBuild.rawBuild.getAction(AbstractTestResultAction.class) 
       def failCount = null 
       def failureDiffString = null 
       def totalCount = null 
       def passed = null 
       def passrate = null 
       if (testResultAction != null) { 
        failCount = testResultAction.failCount 
        totalCount = testResultAction.totalCount 
        passed = totalCount - failCount 
        passrate = (passed/totalCount*100).toInteger() 
        } 

      return passrate 
} 

,让您的测试结果,你可以使用这样的事情:

if(getResults() >= 95){ 
    currentBuild.result="SUCCESS" 
    } else { 
     currentBuild.result="FAILED" 
     throw new Exception("Pass rate lower than 95%") 
    }