【问题标题】:Jenkins, Junit and Flaky Test Handler pluginJenkins、Junit 和 Flaky Test Handler 插件
【发布时间】:2016-01-15 16:46:45
【问题描述】:

我正在尝试了解在 Jenkins 中运行的易碎测试。

为了做到这一点,我安装了https://wiki.jenkins-ci.org/display/JENKINS/Flaky+Test+Handler+Plugin,它似乎有这个目的。

我的安装满足插件页面中指定的所有要求(Jenkins 版本、Junit 插件等...)

安装插件后提示

选中“附加测试”下的“发布 JUnit 易碎测试报告” 报告功能。

他们的截图显示

我的 Maven 项目 配置没有让我选择指定 测试报告 XMLs,而是如下所示:

虽然,当我为配置的项目运行 Jenkins 构建时,我得到的只是一个空表:

项目配置的Build部分使用-Dsurefire.rerunFailingTestsCount=3选项。

我有点困惑该插件是否与我的 Jenkins 安装不符,或者我遗漏了一些东西。

编辑:我一直在尝试 1.0.3 版,其中包含一个答案中提到的修复程序,在作业执行结束时我得到了以下错误:

ERROR: Publisher 'Publish JUnit test result report' aborted due to exception: 
java.io.IOException: Unable to serialize com.google.jenkins.flakyTestHandler.junit.FlakyTestResult@55c1d6e9
    at hudson.remoting.UserRequest.serialize(UserRequest.java:169)
    at hudson.remoting.UserRequest.perform(UserRequest.java:129)
    at hudson.remoting.UserRequest.perform(UserRequest.java:49)
    at hudson.remoting.Request$2.run(Request.java:326)
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at ......remote call to some.slave.com(Native Method)
    at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1413)
    at hudson.remoting.UserResponse.retrieve(UserRequest.java:221)
    at hudson.remoting.Channel.call(Channel.java:778)
    at com.google.jenkins.flakyTestHandler.plugin.JUnitFlakyTestDataPublisher.getTestData(JUnitFlakyTestDataPublisher.java:49)
    at hudson.tasks.junit.TestDataPublisher.contributeTestData(TestDataPublisher.java:62)
    at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:166)
    at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:75)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
    at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:726)
    at hudson.model.Build$BuildExecution.post2(Build.java:185)
    at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:671)
    at hudson.model.Run.execute(Run.java:1766)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:98)
    at hudson.model.Executor.run(Executor.java:408)
Caused by: java.io.NotSerializableException: com.google.jenkins.flakyTestHandler.junit.FlakyCaseResult$FlakyRunInformation
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.ArrayList.writeObject(ArrayList.java:762)
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.ArrayList.writeObject(ArrayList.java:762)
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.ArrayList.writeObject(ArrayList.java:762)
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at hudson.remoting.UserRequest._serialize(UserRequest.java:158)
    at hudson.remoting.UserRequest.serialize(UserRequest.java:167)
    at hudson.remoting.UserRequest.perform(UserRequest.java:129)
    at hudson.remoting.UserRequest.perform(UserRequest.java:49)
    at hudson.remoting.Request$2.run(Request.java:326)
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

这似乎只发生在从机上执行作业时,它似乎在主机上工作正常。

EDIT 2:1.0.4 修复了上述问题。

编辑 3:即使 1.0.4 修复了序列化问题,插件报告似乎仍然被破坏。例如以下情况:

  • 作业 #21 成功运行
  • 作业 #22 运行并进行了一次不稳定的测试,在第二次运行时通过了
  • 作业 #23 运行成功

该项目的报告是说有一个 Flaky 测试,其中 1 个 Flakes,0 Fails 和 0 Passes。我希望得到 2 次通过、0 次失败和 1 次失败。

我错过了什么吗?

【问题讨论】:

    标签: maven jenkins junit maven-surefire-plugin


    【解决方案1】:

    如果我没记错的话,我们将一个不稳定的测试定义为:

    对于同一个代码版本,既失败又通过。

    因此,如果你从不修改代码,即使你运行了 100 次,结果是 50 次通过和 50 次失败,我们仍然算作一片;如果100次全部通过,则算一次;否则如果全部失败 100 次,则为一次失败。

    如果您进行了一些更改并提交了另一个版本,然后在此基础上进行构建,那么它将是一个新编号。

    我相信如果你点击测试,那么你可以看到详细的通过/失败,这就是你想要的?

    https://wiki.jenkins-ci.org/display/JENKINS/Flaky+Test+Handler+Plugin ​“​在修订中汇总测试统计信息​”​

    【讨论】:

    • 感谢您的解释。
    【解决方案2】:

    我遇到了同样的问题。查看主日志,结果发现该插件不希望在从属上执行构建。有一个 pull request 可以为我解决这个问题 - https://github.com/jenkinsci/flaky-test-handler-plugin/pull/2

    【讨论】:

    • 你能把解决方案带到这里吗?
    • @bezda,我一直在尝试 1.0.3,其中应该包含您的拉取请求,现在我遇到了一个新错误,在我的原始帖子底部进行了描述。知道这可能是由什么引起的吗?
    • @bezda,1.0.4 修复了这个问题
    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2015-11-17
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多