La confusión de orden de ejecución de los métodos de JUnit

aioobe:

He creado un corredor personalizada mediante la extensión Suite:

public class MyRunner extends Suite {

    public MyRunner(Class<?> klass, RunnerBuilder builder) throws InitializationError {
        super(klass, builder);
    }

    @Override
    public void run(RunNotifier notifier) {
        notifier.addListener(new MyRunListener());
        notifier.fireTestRunStarted(getDescription());
        super.run(notifier);
    }
}

Como se ve en runesta registeres una MyRunListenerque se parece a esto:

class MyRunListener extends RunListener {
    @Override
    public void testRunStarted(Description description) {
        System.err.println("1: run started");
    }

    @Override
    public void testStarted(Description description) {
        System.err.println("2: test started");
    }

    @Override
    public void testFinished(Description description) {
        System.err.println("3: test finished");
    }

    @Override
    public void testRunFinished(Result result) {
        System.err.println("4: run finished");
    }
}

He añadido 1:, 2:, 3:y 4:de acuerdo con el orden en el que espero que estos métodos a ser llamados.

a continuación, he creado un conjunto de pruebas que tiene la siguiente apariencia:

@RunWith(MyRunner.class)
@Suite.SuiteClasses({ MyTest.class })
public class MyTestSuite {
}

Y la siguiente prueba:

public class MyTest {
    @BeforeClass
    public static void beforeClass() {
        System.err.println("A: beforeClass");
    }

    @Before
    public void before() {
        System.err.println("B: before");
    }

    @Test
    public void test() {
        System.err.println("C: Running actual test...");
    }

    @After
    public void after() {
        System.err.println("D: after");
    }

    @AfterClass
    public static void afterClass() {
        System.err.println("E: afterClass");
    }
}

Una vez más, la salida de etiquetado de conformidad con el orden que espero.

Aquí está la salida consigo cuando corro MyTestSuitea través de IntelliJ (como una configuración de ejecución JUnit):

2: test started

B: before
C: Running actual test...
D: after

3: test finished
E: afterClass

4: run finished
1: run started
A: beforeClass

¿Por qué demonios estoy recibiendo ese orden de salida? Debo estar haciendo algo muy mal en mi corredor, pero yo sólo he implementado de acuerdo con tutoriales en la web. (Usando JUnit 4.12)

aioobe:

Como @DmitryB sugiere en los comentarios, parece ser algún tipo de búfer de salida. Las diversas partes de la salida luego se sutura juntos de una manera extraña después de la prueba ha terminado.

Añadí Thread.sleep(1000)después de cada impresión y así es como se ve cuando lo ejecuto en IntelliJ:

La solución por ahora es utilizar la configuración de ejecución de la tarea Gradle en lugar de la JUnit uno.

Archivado este billete en JetBrains.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=330969&siteId=1
Recomendado
Clasificación