【问题标题】:Are there any conventions of extending JUnit4 test classes?是否有任何扩展 JUnit4 测试类的约定?
【发布时间】:2013-02-17 11:38:40
【问题描述】:

我的测试有很多共同的逻辑,所以我决定通过扩展来分享它。我写了两个类:TestNumberOne,它扩展了TestBase

TestBase.java

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;

/**
 * @author Pavel
 * @since 2013-03-03
 */
public class TestBase {

    @BeforeClass
    public static void beforeClass() {
        System.out.println("beforeClass() in TestBase");
        System.out.flush();
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("afterClass() in TestBase");
        System.out.flush();
    }

    @Before
    public void before() {
        System.out.println("before() in TestBase");
        System.out.flush();
    }

    @After
    public void after() {
        System.out.println("after() in TestBase");
        System.out.flush();
    }
}

TestNumberOne.java

import org.junit.*;

/**
 * @author Pavel
 * @since 2013-03-03
 */
public class TestNumberOne extends TestBase {

    @Test
    public void anyTest() {
        System.out.println("anyTest() in TestNumberOne");
        System.out.flush();
    }
}

我在执行测试时得到了如此奇怪的输出:

before() in TestBase
anyTest() in TestNumberOne
after() in TestBase
beforeClass() in TestBase
afterClass() in TestBase

为什么它有这么奇怪的顺序?是否有任何扩展 JUnit 测试类的约定?

更新:

  1. 测试在 IDEA 中运行
  2. 为了得到如此奇怪的结果,我运行了好几次(其他结果符合预期)

【问题讨论】:

  • 如何“打印姓名和班级名称”?是否正在进行缓冲?
  • 我使用简单的System.out.pringln(...)。我猜缓冲正在进行,但无论如何它必须保持它在缓冲中的顺序。
  • BeforeClass/AfterClass 方法是静态的吗?编辑您的帖子以包含 Java。
  • 无论如何,我在每次输出后都添加了flush() 调用...但是输出是一样的
  • 不继承静态方法。它们仅属于 TestBase。不是 TestNumberOne。

标签: java unit-testing intellij-idea junit4


【解决方案1】:

不知道任何约定。在 junit 3 中,基类通常是抽象的。

以下内容似乎以合理的顺序出现(可能除了拆解)。

import org.junit.*;
public class BaseTestCase {
    public static String method() {
        return Thread.currentThread().getStackTrace()[2].getMethodName() + "()";
    }
    @BeforeClass public static void classSetupBaseClass() {
        System.out.println(method());
    }
    @AfterClass public static void classTeardownBaseClass() {
        System.out.println(method());
    }
    @Before public void setupBaseClass() {
        System.out.println(method());
    }
    @After public void teardownBaseClass() {
        System.out.println(method());
    }
    @Test public void aTestInBaseClass() {
        System.out.println(method());
    }
}


import static org.junit.Assert.*;
import org.junit.*;

public class  So15183669 extends BaseTestCase {
    @BeforeClass public static void classSetup() {
        System.out.println(method());
    }
    @AfterClass public static void classTeardown() {
        System.out.println(method());
    }
    @Before public void setup() {
        System.out.println(method());
    }
    @After public void teardown() {
        System.out.println(method());
    }
    @Test public void aTest() {
        System.out.println(method());
    }
}


classSetupBaseClass()
classSetup()
setupBaseClass()
setup()
aTest()
teardown()
teardownBaseClass()
setupBaseClass()
setup()
aTestInBaseClass()
teardown()
teardownBaseClass()
classTeardown()
classTeardownBaseClass()

【讨论】:

  • 这里有两次相同的课程代码:) 请附上另一个课程代码。
  • 您的情况下的输出完全符合我的预期......但是当我尝试几次时,它会发生变化,有时就像我上面的问题一样疯狂。
  • 很奇怪。你是如何进行测试的?
  • 在 IntelliJ IDEA 中...我多次使用“运行”按钮
  • 我使用 Eclipse。也许 intellij 在不同的 jvm 中运行每个测试?
【解决方案2】:

我认为当您运行测试时,您的 TestBase 也会作为它自己的 junit 测试运行。尝试将其命名为 HelperBase。

【讨论】:

    【解决方案3】:

    当我尝试你的代码时,我得到了预期的输出,即

    beforeClass() in TestBase
    before() in TestBase
    anyTest() in TestNumberOne
    after() in TestBase
    afterClass() in TestBase
    

    (与 Eclipse 一起启动)。 这是惯例^^你的结果确实很奇怪......

    【讨论】:

      【解决方案4】:

      这绝对是 IntelliJ IDEA 问题。

      如果我通过 maven 运行您的代码,它运行正常;如果我在 IntelliJ 中多次运行它,那么我有时会像你一样得到不正确的输出。

      其实我找到了重现的方法:

      • 在每条输出消息后添加 Thread.sleep(1000)。
      • 在运行测试窗口中关闭“跟踪运行测试”(运行测试列表上方的蓝色圆圈)
      • 在 IntelliJ 中运行整个 TestNumberOne 测试类(即使您只有一种测试方法)-> 输出的顺序应该正确
      • 点击测试列表中的anyTest方法,然后在TestNumberOne处->输出顺序不正确

      (如果您在睡眠状态下运行它,您会看到输出顺序正确,但在测试结束时会重新排序)

      所以它们以正确的顺序运行,只有输出混乱。

      【讨论】:

      • 我没有找到“Track running test”按钮,但是输出真的很乱!
      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多