JUnit @After 在 Jenkins 管道停止时不执行

JUnit @After not executing when Jenkins pipeline is stopped

我正在使用一个声明性的 Jenkins 管道,该管道运行一些使用 JUnit 4 的测试。在测试中有 @After 方法进行测试清理。当管道在测试期间中止时,我已经确认 @After 方法从未执行(使用 @After 方法中的日志语句确认并检查 Jenkins 控制台日志)。

这会使测试数据(例如测试使用的用户)处于不良状态并导致后续测试(和管道构建)失败,所以这是一个问题。

流水线通过 Jenkins UI“停止”按钮中止,或者流水线在那个阶段超时。在这两种情况下,管道都以代码 143 退出,这是 SIGTERM.

如何确保在声明性 Jenkins 管道中止时执行 JUnit 4.x @After 方法?

我有一个解决方法,您可以使用它来解决问题。创建两个 类。测试类和后类。在 AfterClass 中,您必须保留一种测试方法,以便触发 after。现在,在声明式管道的测试执行步骤中,您可以执行

mvn clean test -PTest

并且在post always of declarative pipeline script中,你可以执行下面的maven命令

mvn clean test -PCleanup

测试类:

import org.junit.Test;

public class TestClass 
{

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

课后:

@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 的经验不多。但是如果您没有得到任何适当的解决方案,您可以使用此解决方法。我也会努力为你找到合适的解决方案