JUnit @After не выполняется, когда конвейер Jenkins остановлен - PullRequest
1 голос
/ 21 июня 2020

Я работаю с декларативным конвейером Jenkins, который запускает некоторые тесты, использующие JUnit 4. В тестах есть методы @After, в которых происходит очистка тестов. Когда конвейер прерывается во время теста, я подтвердил, что методы @After никогда не выполняются (подтверждено с помощью операторов журнала в методах @After и проверки журнала консоли Jenkins).

Это оставляет тестовые данные (например, пользователи, которые используются в тестах) в плохом состоянии и вызывают сбой последующих тестов (и сборок конвейера), поэтому это проблема.

Конвейер прерывается с помощью кнопки «стоп» пользовательского интерфейса Jenkins или с помощью конвейер достигает тайм-аута для этого этапа. В обоих случаях конвейер завершается с кодом 143, который является SIGTERM.

Как я могу гарантировать, что методы JUnit 4.x @After выполняются при прерывании декларативного конвейера Jenkins?

1 Ответ

2 голосов
/ 21 июня 2020

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

mvn clean test -PTest

, а в сообщении всегда декларативного конвейерного скрипта вы можете выполнить команду ниже maven

mvn clean test -PCleanup

TestClass:

import org.junit.Test;

public class TestClass 
{

    @Test
    public void testClass()
    {
        System.out.println("Test");
    }
}

AfterClass:

@Test
public void beforeCleanUp()
{
    System.out.println("Before Cleanup");
}
@After
public void after()
{
    System.out.println("After");
}

POM. xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>stackovrflw-62492859</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <profiles>
        <profile>
            <id>Test</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>3.0.0-M5</version>
                        <configuration>
                            <test>com.test.junit.classes.TestClass</test>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>Cleanup</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>3.0.0-M5</version>
                        <configuration>
                            <test>com.test.junit.classes.AfterClass</test>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Примечание: это не настоящее решение, так как у меня нет большого опыта работы с JUnit. Но вы можете использовать этот обходной путь, если не получите правильного решения. Я также постараюсь найти для вас подходящее решение

...