Настроить мероприятие «Выполнение теста Junit Stop» [дубликат]

Установка этого параметра на 22.0 помогла мне.

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>22.0</version>
    </dependency>
77
задан sblundy 17 September 2008 в 14:33
поделиться

8 ответов

Единственный способ, по которому я думаю, получить желаемую функциональность, - это сделать что-то вроде

import junit.framework.Test;  
import junit.framework.TestResult;  
import junit.framework.TestSuite;  

public class AllTests {  
    public static Test suite() {  
        TestSuite suite = new TestSuite("TestEverything");  
        //$JUnit-BEGIN$  
        suite.addTestSuite(TestOne.class);  
        suite.addTestSuite(TestTwo.class);  
        suite.addTestSuite(TestThree.class);  
        //$JUnit-END$  
     }  

     public static void main(String[] args)  
     {  
        AllTests test = new AllTests();  
        Test testCase = test.suite();  
        TestResult result = new TestResult();  
        setUp();  
        testCase.run(result);  
        tearDown();  
     }  
     public void setUp() {}  
     public void tearDown() {}  
} 

. Я использую что-то вроде этого в eclipse, поэтому я не уверен, насколько портативен он снаружи этой среды

1
ответ дан Aaron Digulla 28 August 2018 в 00:32
поделиться
  • 1
    Это пример для JUnit3, и OP запросил JUnit4, но на всякий случай некоторые пользователи JUnit3 найдут этот вопрос ... Для JUnit3 было бы лучше избавиться от метода main () и иметь метод suite () оберните TestSuite в подкласс junit.extensions.TestSetup. У вас все еще есть те же оговорки, что и пример Джулии о запуске отдельных тестовых классов в вашей среде IDE. – NamshubWriter 5 November 2010 в 15:55

Поскольку maven-surefire-plugin не запускает класс класса сначала, но рассматривает классы классов и тестов одинаково, поэтому мы можем настроить плагин, как показано ниже, чтобы включить только классы классов и отключить все тесты. Suite выполнит все тесты.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <includes>
                    <include>**/*Suite.java</include>
                </includes>
                <excludes>
                    <exclude>**/*Test.java</exclude>
                    <exclude>**/*Tests.java</exclude>
                </excludes>
            </configuration>
        </plugin>
0
ответ дан Anurag Sharma 28 August 2018 в 00:32
поделиться

Что касается «Примечание: мы используем maven 2 для нашей сборки. Я пробовал использовать фазы pre-amp; post-integration-test maven, но, если тест завершился неудачно, maven останавливается и не запускает пост -integration-test, который не помогает ».

вместо этого вы можете попробовать нерабочее плагин, я думаю, что у него есть возможность обеспечить очистку независимо от настройки или состояния промежуточной стадии

2
ответ дан Binod Pant 28 August 2018 в 00:32
поделиться
  • 1
    Да, защищенный плагин позволит вам указать конкретную настройку и отключение. Хотя я не думаю, что безотказное существовало в то время, когда этот вопрос был опубликован. – Jason Axelson 24 April 2012 в 04:01

Если вы не хотите создавать набор и должны перечислять все свои тестовые классы, вы можете использовать отражение, чтобы динамически находить число тестовых классов и считать в базовом классе @AfterClass, чтобы сделать tearDown только один раз:

public class BaseTestClass
{
    private static int testClassToRun = 0;

    // Counting the classes to run so that we can do the tear down only once
    static {
        try {
            Field field = ClassLoader.class.getDeclaredField("classes");
            field.setAccessible(true);

            @SuppressWarnings({ "unchecked", "rawtypes" })
            Vector<Class> classes = (Vector<Class>) field.get(BlockJUnit4ClassRunner.class.getClassLoader());
            for (Class<?> clazz : classes) {
                if (clazz.getName().endsWith("Test")) {
                    testClassToRun++;
                }
            }
        } catch (Exception ignore) {
        }
    }

    // Setup that needs to be done only once
    static {
        // one time set up
    }

    @AfterClass
    public static void baseTearDown() throws Exception
    {
        if (--testClassToRun == 0) {
            // one time clean up
        }
    }
}

Если вы предпочитаете использовать @BeforeClass вместо статических блоков, вы также можете использовать булевский флаг для выполнения подсчета отражения и тестирования только один раз при первом вызове. Надеюсь, что это кому-то помогает, мне понадобился день, чтобы лучше понять, чем перечислять все классы в пакете.

Теперь вам нужно расширить этот класс для всех ваших тестовых классов. У нас уже был базовый класс, чтобы предоставить некоторые общие вещи для всех наших тестов, поэтому это было лучшее решение для нас.

Вдохновение происходит из этого ответа SO https://stackoverflow.com/a/ 37488620/5930242

Если вы не хотите распространять этот класс повсюду, этот последний ответ SO может делать то, что вы хотите.

11
ответ дан Community 28 August 2018 в 00:32
поделиться
  • 1
    Установка & amp; разрывы должны выполняться один раз за ход. Это поможет только в том случае, если все тесты находятся в одном классе. – sblundy 17 September 2008 в 14:35
  • 2
    это не так, как показывают мои собственные тесты. У меня суперкласс, который запускает встроенную стеклянную фару на beforeclass и закрывает ее после класса. У меня есть 2 класса, которые простираются от этого суперкласса. Перед выполнением тестов, определенных в каждом классе, beforeclass выполняется. – Jonathan Morales Vélez 21 November 2013 в 00:43

Да, можно надежно запускать методы настройки и сбрасывания до и после любых тестов в наборе тестов. Позвольте мне продемонстрировать код:

package com.test;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test1.class, Test2.class})
public class TestSuite {

    @BeforeClass
    public static void setUp() {
        System.out.println("setting up");
    }

    @AfterClass
    public static void tearDown() {
        System.out.println("tearing down");
    }

}

Итак, ваш класс Test1 будет выглядеть примерно так:

package com.test;

import org.junit.Test;


public class Test1 {
    @Test
    public void test1() {
        System.out.println("test1");
    }

}

... и вы можете себе представить, что Test2 выглядит схоже. Если вы запустили TestSuite, вы получите:

setting up
test1
test2
tearing down

. Таким образом, вы можете видеть, что установка / отрыв запускается только до и после всех тестов соответственно.

Улов: это работает только в том случае, если вы используете тестовый набор, а не для тестирования Test1 и Test2 как отдельных тестов JUnit. Вы упомянули, что используете maven, и плагин maven surefire любит запускать тесты по отдельности, а не в составе пакета. В этом случае я бы рекомендовал создать суперкласс, который расширяется каждый тестовый класс. Суперкласс затем содержит аннотированные методы @BeforeClass и @AfterClass.

Что касается проблемы с неудачными тестами, вы можете установить maven.test.error.ignore, чтобы сборка продолжалась неудачно тесты. Это не рекомендуется в качестве постоянной практики, но оно должно заставить вас функционировать до тех пор, пока все ваши тесты не пройдут. Более подробно см. Документацию maven surefire .

107
ответ дан Julie 28 August 2018 в 00:32
поделиться
  • 1
    Это отлично сработало для меня, как только я вошел в плагин maven-surefire и создал список включений, указывающий на набор, который я хотел запустить. – Jherico 19 November 2009 в 07:10
  • 2
    Что касается JUnit 4.8.2, это не очень хорошо работает с параметризованными тестами. Методы @BeforeClass в Suite будут запускаться после метода @ Parameterized.Parameters теста, предотвращая любую зависимость от настройки Suite. – Anm 23 April 2011 в 19:39
  • 3
    В ответ на меня, при использовании @ Theories, вызов метода @DataPoints вызывает после @BeforeClass Suite. – Anm 23 April 2011 в 22:59
  • 4
    Извините за некро, но добавление класса BeforeClass / AfterClass в суперкласс не работает должным образом - они все еще вызываются после завершения каждого тестового класса. Это для потомков. – Subu Sankara Subramanian 25 April 2012 в 05:30
  • 5
    Является ли этот подход действительным? Как вам избежать необходимости перечислять список тестовых классов в аннотации SuiteClasses? – Burhan Ali 5 October 2012 в 18:12

Мой коллега предложил следующее: вы можете использовать собственный RunListener и реализовать метод testRunFinished (): http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener. html # testRunFinished (org.junit.runner.Result)

Чтобы зарегистрировать RunListener, просто настройте плагин surefire следующим образом: http://maven.apache.org/surefire/ maven-surefire-plugin / examples / junit.html раздел «Использование пользовательских прослушивателей и репортеров»

Эта конфигурация также должна быть выбрана отказоустойчивым плагином. Это решение замечательно, потому что вам не нужно указывать классы, поисковые тесты или любой другой материал - он позволяет Maven делать свою магию, ожидая завершения всех тестов.

31
ответ дан Martin Vysny 28 August 2018 в 00:32
поделиться
  • 1
    +1 Это первое полезное решение, которое я видел без громоздкого обслуживания класса люкс! – Stefan Haberl 24 June 2013 в 14:23

Здесь мы

  • обновлены до JUnit 4.5,
  • создали аннотации для тегов каждого тестового класса или метода, которым нужна рабочая служба,
  • написал обработчики для каждой аннотации, в которой содержались статические методы для реализации настройки и удаления службы,
  • расширил обычный Runner, чтобы найти аннотации для тестов, добавив методы статического обработчика в цепочку выполнения теста с соответствующим точек.
3
ответ дан user 28 August 2018 в 00:32
поделиться

Насколько я знаю, в JUnit нет механизма для этого, однако вы можете попробовать подклассу Suite и переопределить метод run () версией, которая обеспечивает перехваты.

0
ответ дан user15299 28 August 2018 в 00:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: