【问题标题】:Running single junit test in gradle passes but fails when entire test is run在 gradle 中运行单个 junit 测试通过但在运行整个测试时失败
【发布时间】:2018-02-23 19:27:35
【问题描述】:

我在处理 gradle 中的特定 junit 测试时遇到了一个不寻常的问题。当我按如下方式运行测试时,它通过了

gradlew 测试 --tests com.compsci.ic.xbrl.SchemaRefTest

但是当我运行时

gradlew 测试

以下堆栈跟踪失败

java.lang.IllegalStateException: Undeclared namespace prefix in DOM input: link
    at net.sf.saxon.dom.NodeWrapper.getURI(NodeWrapper.java:531)
    at net.sf.saxon.dom.NodeWrapper.getNameCode(NodeWrapper.java:412)
    at net.sf.saxon.om.Navigator.copy(Navigator.java:523)
    at net.sf.saxon.dom.NodeWrapper.copy(NodeWrapper.java:827)
    at net.sf.saxon.om.Navigator.copy(Navigator.java:516)
    at net.sf.saxon.dom.NodeWrapper.copy(NodeWrapper.java:827)
    at net.sf.saxon.om.StrippedNode.copy(StrippedNode.java:448)
    at net.sf.saxon.instruct.CopyOf.processLeavingTail(CopyOf.java:397)
    at net.sf.saxon.instruct.Template.applyLeavingTail(Template.java:175)
    at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:343)
    at net.sf.saxon.Controller.transformDocument(Controller.java:1735)
    at net.sf.saxon.Controller.transform(Controller.java:1559)
    at org.custommonkey.xmlunit.Transform.transformTo(Transform.java:211)
    at org.custommonkey.xmlunit.Transform.getResultDocument(Transform.java:233)
    at org.custommonkey.xmlunit.XMLUnit.stripWhiteSpaceUsingXSLT(XMLUnit.java:514)
    at org.custommonkey.xmlunit.XMLUnit.getWhitespaceStrippedDocument(XMLUnit.java:507)
    at org.custommonkey.xmlunit.Diff.getWhitespaceManipulatedDocument(Diff.java:182)
    at org.custommonkey.xmlunit.Diff.getManipulatedDocument(Diff.java:203)
    at org.custommonkey.xmlunit.Diff.<init>(Diff.java:155)
    at org.custommonkey.xmlunit.Diff.<init>(Diff.java:145)
    at org.custommonkey.xmlunit.Diff.<init>(Diff.java:109)
    at org.custommonkey.xmlunit.Diff.<init>(Diff.java:101)
    at org.custommonkey.xmlunit.Diff.<init>(Diff.java:93)
    at org.custommonkey.xmlunit.XMLAssert.assertXMLEqual(XMLAssert.java:228)
    at org.custommonkey.xmlunit.XMLAssert.assertXMLEqual(XMLAssert.java:179)
    at com.compsci.ic.xbrl.SchemaRefTest.testSerialize(SchemaRefTest.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:114)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:57)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:66)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
    at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy1.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:108)
    at sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:748)

该测试在 ant 中运行良好,因此我检查了 ant 和 gradle 之间的所有依赖关系,它们似乎都匹配。任何额外的建议将不胜感激

这里是测试的源代码

package com.compsci.ic.xbrl;

import java.io.IOException;
import java.net.URI;

import org.custommonkey.xmlunit.XMLAssert;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Test;
import org.xml.sax.SAXException;

import com.compsci.ic.xbrl.xstream.URIConverter;
import com.thoughtworks.xstream.XStream;

public class SchemaRefTest {
    @Test
    public void testSerialize() throws SAXException, IOException {
        SchemaRef ref = new SchemaRef();

        ref.setHref(URI.create("http://example.com"));

        XStream xstream = new XStream();

        xstream.registerConverter(new URIConverter());
        xstream.processAnnotations(SchemaRef.class);

        XMLUnit.getTestDocumentBuilderFactory().setNamespaceAware(false);       
        XMLUnit.getControlDocumentBuilderFactory().setNamespaceAware(false);

        XMLAssert.assertXMLEqual(
            "<link:schemaRef xlink:type='simple' xlink:href='http://example.com'/>",
            xstream.toXML(ref));
    }
}

【问题讨论】:

  • 如果没有看到任何失败测试的来源,我们应该如何提供帮助?
  • 好点,我会调整上面的代码
  • 您的测试在执行期间是否修改了任何文件
  • 老实说,我不确定,我没有编写这些测试,我什至对 java 了解也不多,我只是一个开发者,在过去 2 个月里一直在转换我们的 ant/ivy 包毕业,这是最后的挂断

标签: java gradle junit


【解决方案1】:

我的猜测是另一个测试很脏并且渗入了这个测试。诸如系统属性或可变静态变量之类的东西可能是原因。那些静态的XMLUnit mutator 方法对我来说有点代码味道

您可以尝试以下方法,这将为每个测试提供一个“干净”的 jvm。请注意,这会减慢速度

apply plugin: 'java' 
test {
    forkEvery = 1
}

Test.setForkEvery(...)

这显然是一个 hack,最好找到有问题的测试并修复它以在 @After 或 @AfterTest 中自行清理。如果你找不到“脏”测试,你总是可以在失败测试的@Before 或@BeforeTest 中初始化“污染”静态

【讨论】:

  • 谢谢,我会从那里开始,然后往回走。
【解决方案2】:

我通过在测试中添加以下内容来修复它

XMLUnit.setIgnoreWhitespace(false);

似乎 XMLAssert 已经过时了,将来必须彻底检查这些测试以使所有内容都处于最新状态。现在我的状态很好。

【讨论】:

  • 这符合我的推理。我猜还有另一个测试调用XMLUnit.setIgnoreWhitespace(true)。如果该测试首先运行,它会污染可变的静态状态。可变静态是邪恶的!
  • 我会调查一下,看看能不能找到。这些测试是由一位前员工编写的,有点乱,我很高兴试图弄清楚他在做什么。感谢您的建议。
  • 我确实看起来像一些测试有XMLUnit.setIgnoreWhitespace(true)。有趣的是,在蚂蚁中它不会抱怨。好吧,至少这个谜团已经解决了,并且知道我的解决方案并不是真正的黑客攻击是令人欣慰的。再次感谢。
  • 可能 ant 为每个测试分叉一个新的/单独的 jvm 或以不同的顺序运行测试?理想情况下,XMLUnit 不会改变静态状态。如果一个测试需要与另一个测试不同的标志,那么这些标志(布尔值等)将存在于一个实例(例如ConfigurableXMLUnit)中,该实例在该测试中存在和死亡,而不是渗入其他测试。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2017-10-12
相关资源
最近更新 更多