【问题标题】:Jenkins using the wrong JUnit versionJenkins 使用了错误的 JUnit 版本
【发布时间】:2016-03-08 13:33:06
【问题描述】:

我的一个测试(在几周内运行良好)开始失败,出现 JUnit v3.x 错误代码:

  [junit] Testcase: testState took 1.079 sec
    [junit]     FAILED
    [junit] null
    [junit] junit.framework.AssertionFailedError
    [junit]     at com.test.PanelTest.testState(PanelTest.java:331)
    [junit]     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:312)
    [junit]     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    [junit]     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    [junit]     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    [junit]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    [junit]     at java.lang.Thread.run(Thread.java:662)

在任何地方都没有对junit.framework 的引用。我在所有测试中都使用import org.junit.*(不推荐使用的那些不在 Jenkins 上测试的除外)。

编辑:从已弃用的测试中删除所有 junit.framework 导入。

我怀疑 Jenkins 有时仍在使用 JUnit 3.x,而它应该只使用 JUnit 4.x。我到处搜索是否存在其他 JUnit 版本,只剩下 JUnit 4.11 的 jar 文件。

无论我对测试代码进行什么更改,此错误都不会消失。我还尝试“擦除”工作区并验证 ant 脚本没有对 Junit 3.x 的任何引用。

这是我的 ANT 插件配置:

这是我的单元测试的精简版:

package com.test;

import org.fest.swing.core.GenericTypeMatcher;
import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
import org.fest.swing.edt.GuiActionRunner;
import org.fest.swing.edt.GuiQuery;
import org.fest.swing.edt.GuiTask;
import org.fest.swing.fixture.*;
import org.junit.*;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ SomeFinalClass.class })
@PowerMockIgnore("javax.swing.*")
public class PanelTest {

    private FrameFixture frameFixture = null;
    private MyPanel panel = null;
    private MyModel model = null;

    @BeforeClass
    public static void runOnce() {
        FailOnThreadViolationRepaintManager.install();
    }

    @Before
    public void setUp() throws Exception {

        <TestFrame extends JFrame>
        TestFrame testFrame = GuiActionRunner.execute(new GuiQuery<TestFrame>() {
            @Override
            protected TestFrame executeInEDT() throws Throwable {

                <lots of mocking and stubbing>

                return new TestFrame(panel);
            }
        });

        GuiActionRunner.execute(new GuiTask() {
            @Override
            protected void executeInEDT() throws Throwable {
                SwingUtils.setLookAndFeel();
                SwingUtilities.updateComponentTreeUI(panel);
            }
        });

        frameFixture = new FrameFixture(testFrame);
        frameFixture.show();
        frameFixture.robot.waitForIdle();
    }


    @After
    public void tearDown() {
        frameFixture.cleanUp();
    }

    @Test
    public void testState() {

        AnotherPanel otherPanel = myModel.getOtherPanel();

        Assert.assertFalse(otherPanel.isShowing());

        <create fake data>
        myModel.update(fakeData);

        JButtonFixture button = <get button Fixture>
        button.click();

        Assert.assertTrue(otherPanel.isShowing());

        button.click();

        Assert.assertFalse(otherPanel.isShowing());  <-- here is where it fails
    }
}

【问题讨论】:

  • 如何在 Jenkins 上运行测试?通过 Maven?
  • 没有 Maven,只调用 ANT。
  • 您是否在 jenkin 中安装了 ANT 插件,如果是,您是否在配置中将 Build 设置为“Invoke ANT”
  • 是的,是的(添加了屏幕截图)。
  • 就个人而言,我更喜欢同时使用 JMockit (jmockit.org) 而不是 Mockito 和 Powermock。如果是我,我肯定会进行实验,用 JMockit 替换 Mockito 和 Powermock,看看我是否还有另一个理由更喜欢 JMockit。只是一个想法,因为我知道绝望的时代需要绝望的措施。另外,我是 AssertJ (joel-costigliola.github.io/assertj) 的忠实粉丝。

标签: java jenkins junit


【解决方案1】:

AssertionFailedError 仍然存在于 JUnit 4 中,并由已弃用的类 junit.framework.Assert 使用。

不要在PanelTest 类上使用junit.framework.Assert,而是使用org.junit.Assert。验证导入。

【讨论】:

  • 除了在 Jenkins 上运行的一些不推荐使用的旧测试之外,在任何地方都没有对 junit.framework 的引用。我的所有测试,包括失败的测试,都在使用import org.junit.*
  • 任何测试(旧的不推荐使用的测试)依赖项都会在执行之前(即编译期间)下载。在这种情况下,您可能还会下载以前的版本。只需尝试使用Ver 4.x
  • 请向我们展示完整的堆栈跟踪(可能存在原因异常)和 PanelTest 代码。
  • 堆栈跟踪已经完成,但我使用 Jenkins 的 RAW 输出进行了更新。我还添加了测试用例的精简版
  • 我更新了所有不推荐使用的测试以删除任何 junit.framework 导入,不幸的是结果是相同的。
【解决方案2】:

从您的错误日志中,

  [junit] Testcase: testState took 1.079 sec
    [junit]     FAILED
    [junit] null
    [junit] junit.framework.AssertionFailedError
    [junit]     at com.test.PanelTest.testState(PanelTest.java:331)

所以您的错误发生在PanelTest.java第 331 行


如果下面的行是 331,

Assert.assertFalse(otherPanel.isShowing());  // here is where it fails

因此,从您的日志中,otherPanel 在此处为空。 otherPanel 是从 myModel.getOtherPanel(); 读取/生成的。 所以对于这种情况,您可以在单击btnExpandInfo.click(); 后使用睡眠。有时加载可能需要一些时间,并且在这种情况下不会读取相关的 otherPanel。

btnExpandInfo.click();
Thread.sleep(5000); // if fails, you can try for 30000ms or more
Assert.assertFalse(otherPanel.isShowing());

btnExpandInfo.click(); 的问题

我没有得到任何关于btnExpandInfo 的信息。您尚未声明或调用来准备此对象。因此,如果未发现此按钮可点击,它也可能为 null。


JUnit 版本问题:

“null”在带有空白消息参数的JUnit 3 断言(junit.framework.Assert) 中显示为消息。这已在 JUnit 4 (org.junit.Assert) 中修复。

例子:

JUnit 3:

assertTrue(false)assertTrue("null", false) 具有相同的堆栈跟踪

JUnit 4:

assertTrue(false)assertTrue("", false) 具有相同的堆栈跟踪

归功于@AnthonyW

资源链接:

  1. AssertionFailedError: null on boolean method

【讨论】:

  • 我已经按照您在单击后的建议尝试了许多“等待”的变体,最近我使用了带有 Thread.sleep(1000) 的 while(otherPanel.isShowing()) 并且测试超时(30 秒) ) 等待 otherPanel 即 otherPanel 永远不会为空。在我的示例代码中,真正的 btnExpandInfo 为空,但我向您保证它不为空 - 它是一个有效的 JButtonFixture。我不确定您要对“null”消息说什么...您是说我安装了 JUnit v3?
  • @glenneroo 您可以通过使用 Thread.sleep(90000) 加载其他面板来检查它。正如你所保证的那样,它会很好地执行。
  • 我将 Thread.sleep(1000) 放入 while 循环 60 分钟(!!),但测试仍然失败。该测试在多台 PC 上运行良好,只有在我的 Jenkins 版本上才有这个问题,这就是为什么我认为这是 Jenkins 失败而不是我的代码。
  • @glenneroo 所以在这种情况下,您可以将配置与另一台电脑进行比较。然后你就可以找到有什么区别,可以解决。
  • 我认为您误解了 - 它在所有 PC 上都可以正常工作(使用 Intellij IDEA 的 Windows/Linux)。它不适用于 Jenkins(在 Linux 上运行)。你知道詹金斯是什么吗?
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2016-07-24
  • 2019-05-07
  • 1970-01-01
  • 2021-05-22
  • 2020-07-22
  • 2018-09-30
相关资源
最近更新 更多