当我运行时mvn clean install,对于integration-test阶段它不使用故障安全插件.
但是,如果我明确地调用插件来运行集成测试,它就可以工作(mvn failsafe:integration-test).
如何mvn clean install在integration-test阶段运行时让maven使用故障安全插件?
我正在使用Maven构建一个webapp项目,使用maven-failsafe-plugin进行集成测试.货物Glassfish3x容器开始绑定到预集成测试阶段,并作为集成后测试阶段的一部分停止.
但是,我的集成测试是基于pyUnit的脚本.我尝试使用exec-maven-plugin运行它们,并通过maven-bdd-plugin使用nosetests/freshen.
这两种方法都可以很好地运行脚本,但如果测试失败,它们会立即使Maven构建失败.Maven没有运行集成后测试阶段,将一个正在运行的货物集装箱放在后面,这使得任何其他尝试都无法运行测试.
如何配置maven-failsafe来解释我的失败exec是一个失败的测试,以便它完成它的工作并运行集成后测试阶段?
我有 Failsafe 运行 Selenium 集成测试。如果我在测试中的断言之一没有通过并且测试失败,那么 Maven 构建将按预期失败。但是,如果测试出错,构建会意外地成功完成(输出如下)
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 14.075 sec <<< FAILURE!
Results :
Tests in error:
test(uk.co.ned24.ExpandedIT)
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7 minutes 40 seconds
[INFO] Finished at: Wed Jan 30 16:58:28 GMT 2013
[INFO] Final Memory: 78M/209M
[INFO] ------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我不确定这是否会发生,Selenium 是否会导致意外行为?我查看了插件 doco 并找不到任何可以设置为在测试错误后使构建失败的标志。
理想情况下,我想让构建在测试错误时失败,所以希望得到任何建议!我附上了从我的 POM 中剪下的故障保护,以防万一。
谢谢,尼克
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<id>integration-test</id> …Run Code Online (Sandbox Code Playgroud) 我用failsafe插件。
所以当我输入mvn failsafe:integration-test它时,我的集成测试会加星(这很棒)。
但我希望我jetty server在pre-integration舞台上开始。我该怎么办?
(我不想启动,mvn verify因为它涉及整个循环运行,但是mvn failsafe:integration-test- 似乎应该这样工作)
有两个插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId> <!-- for starting jetty for integration tests -->
<version>2.16</version>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
<!--<jettyConfig>${project.basedir}/src/main/resources/config/jetty9.xml</jettyConfig>-->
<stopKey>STOP</stopKey>
<stopPort>9999</stopPort>
<stopWait>5</stopWait>
<scanIntervalSeconds>5</scanIntervalSeconds>
<scanTargets>
<scanTarget>${project.basedir}/src/main</scanTarget>
<scanTarget>${project.basedir}/src/test</scanTarget>
</scanTargets>
<contextXml>${project.basedir}/src/test/resources/jetty-context.xml</contextXml>
<webAppConfig>
<contextPath>/${project.artifactId}-${project.version}</contextPath>
</webAppConfig>
</configuration>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase> <!-- In the pre-integration-test phase the Jetty server …Run Code Online (Sandbox Code Playgroud) 我有下一个pom.xml
<project>
...
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<argLine>${failsafeArgLine}</argLine>
<includes>
<include>**/dmg/*IT.java</include>
</includes>
<skipTests>${skipTests}</skipTests>
</configuration>
</execution>
</executions>
</plugin>
...
</project>
Run Code Online (Sandbox Code Playgroud)
问题是,当我取消验证目标时,即使存在测试失败,构建也每次都成功.
当我取消集成测试目标时,集成测试根本就没有运行
为什么failafe插件需要集成测试和验证目标?
与此处发布的解决方案类似,TestNG重试失败的测试不会输出正确的测试结果,我试图在onFinish(ITestContext上下文)中使用测试监听器删除(重复)测试结果.
尽管使用context.getFailedTests().removeResult(result)删除结果似乎工作正常(结果实际上已被删除),但似乎存在"某些其他位置",其中结果被拉出,因为构建仍然失败.
还要注意,当我从上面的文章运行样本测试时(其中有一个重复的失败被删除,一个通过测试),我得到了"测试结果"(没有按预期清理)与"套件结果"的区别(重复故障按预期删除).
而且,报告从哪里提取结果以决定是否使构建失败?或者只是它在我清理失败的测试之前拉动结果......?
===============================================
Default test
Tests run: 3, Failures: 2, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 2, Failures: 1, Skips: 0
===============================================
Run Code Online (Sandbox Code Playgroud)
编辑:只是为了澄清,我们正在使用maven运行这些测试,他们是IT,所以我们使用failsafe插件运行它们.问题是即使看起来测试被删除,mvn验证仍然无法构建,因为它认为无论如何都会发现构建失败.
而且如果从Eclipse运行这样的测试,即使删除了测试,当套件完成时,仍会在日志中打印失败.
关于RetryAnalyzer:我根本不会考虑使用RetryAnalyzer良好/最佳实践,但如果您发现自己处于需要解决问题的情况,例如您继承了依赖RetryAnalyzer的测试套件,您可能会觉得这很有用.
我在pom.xml中添加了以下插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<includes>
<include>**/IT*.java</include>
</includes>
<testSourceDirectory>${basedir}/src/integration-test/java</testSourceDirectory>
<testClassesDirectory>${project.build.directory}/it-classes</testClassesDirectory>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我在目录src \ integration-test \ java下有一个名为ITSample.java的测试,带有@Test批注。
Maven报告
[DEBUG] (s) skip = false
[DEBUG] (s) skipITs = false
[DEBUG] (s) skipTests = false
[DEBUG] (s) testSourceDirectory = ...\src\integration-test\java
[DEBUG] (s) testClassesDirectory = ...\target\it-classes
[DEBUG] (s) includes = [**/IT*.java]
Run Code Online (Sandbox Code Playgroud)
这似乎是预期的,但是当我运行mvn failsafe:integration-test时,我从maven回来:
[INFO] No tests to run.
Run Code Online (Sandbox Code Playgroud)
有什么想法,如果我错过了什么,或者我应该做一些不同的设置?
我注意到的另一件事是,当我运行mvn integration-test故障安全插件时,未执行。
我的E2E测试运行得非常缓慢(25分钟),因为他们调用了大量服务并等待在数据库中填充一些数据.我想同时运行它.我正在使用以下maven-failsafe-plugin设置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${plugin.failsave.version}</version>
<executions>
<execution>
<id>run-integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我的测试看起来像这样(如果需要可以提供更多信息):
@Stepwise
@DataJpaTest
@ContextConfiguration(classes = SomeControllerITConfig)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class SomeControllerIT extends Specification {
// some variables definition
def "test1":
// some test
def "test2":
// some test
// some more tests
}
Run Code Online (Sandbox Code Playgroud)
我试图使用threadCount属性parallel或者forkCount但对我来说没有任何作用.我还尝试在依赖项中强制执行以下maven-failsafe-plugin依赖项:
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.16</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
提前致谢!
spring integration-testing spock maven-failsafe-plugin e2e-testing
Assumption如果开发人员的计算机没有运行它的必备软件,那么我有一个JUnit测试可用于跳过该测试。尽管是“初级”,但这是一个集成测试。像这样:
int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
Run Code Online (Sandbox Code Playgroud)
但是,由于这一假设,有一点我意识到测试已经停止在Jenkins的自动构建上运行,最终引入了应该停止测试的回归。
换句话说,Jenkins从属环境缺少必需的软件,从而导致测试被跳过。
自动化测试由Maven使用Jailkins Pipeline构建计划中的FailSafe插件运行。如何检测我的环境是詹金斯,以便使假设条件更加严格?
也就是说,我希望条件是这样的:
boolean isJenkinsBuild = /* true if this is being run inside a Jenkins build, false otherwise */;
boolean isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor() == 0;
Assume.assumeTrue("Software not present", isSoftwarePresent || isJenkinsBuild);
Run Code Online (Sandbox Code Playgroud)
甚至,
@Test
void testJenkinsEnvironment() {
...
Assume.assumeTrue(isJenkinsBuild);
Assert.assertTrue(isSoftwarePresent);
}
@Test
void testFeature() {
...
Assume.assumeTrue(isSoftwarePresent);
...
}
Run Code Online (Sandbox Code Playgroud) 我有一个包含单元测试和集成测试的多模块项目。我们使用 Jenkins 作为我们的管道:
我想要实现的是:
第三步从干净的结帐开始,因此甚至没有target文件夹。
编辑 - 集成测试在配置文件内运行,因此它们在第一次构建期间不会运行
我想要实现的是在不编译代码的情况下运行集成测试(第三步)。
如果我使用mvn failsafe:integration-tests它,则表示没有任何测试(显然是因为它没有找到任何工件)。
当我添加时dependenciesToScan,它说它找不到 junit 提供程序 ( groups/excludedGroups require TestNG, JUnit48+ or JUnit 5 on project test classpath)。
有人可以帮助您了解如何在 jar 位于本地存储库中时运行测试而不进行编译吗?