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