【发布时间】:2018-12-11 02:32:49
【问题描述】:
如果开发人员的计算机没有运行它的必备软件,我有一个使用Assumption 的 JUnit 测试来跳过测试。尽管是“junit”,但它是一个集成测试。像这样的:
int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
然而,由于这种假设,我意识到测试已经停止在 Jenkins 上的自动构建上运行,最终引入了回归,测试应该停止。 p>
换句话说,Jenkins从属环境中缺少所需的软件,导致测试被跳过。
自动化测试由 Maven 使用 FailSafe 插件在 Jenkins Pipeline 构建计划中运行。如何检测我的环境是 Jenkins 以便我可以使假设条件更严格?
也就是说,我希望条件是这样的:
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);
甚至,
@Test
void testJenkinsEnvironment() {
...
Assume.assumeTrue(isJenkinsBuild);
Assert.assertTrue(isSoftwarePresent);
}
@Test
void testFeature() {
...
Assume.assumeTrue(isSoftwarePresent);
...
}
【问题讨论】:
-
这听起来像是你过度设计了。将 jenkins 配置为在一段时间后自动使长时间运行的作业失败。此外,让您的 Ops 团队在 CI 服务器上安装所需的软件。编辑:如果您的测试是为了检测其运行时环境而编写的,您打算如何测试测试?
-
@Dave 你的评论太混乱了!构建没有失败,它通过了,因为测试被忽略了。也许这就是为什么你说的对我来说没有意义?我已经用更多细节编辑了这个问题。我不认为那里有任何过度工程,但是,如果有什么,请在代码示例中指出。
-
我很想对此进行更多辩论,但这更像是一场关于测试设计的哲学辩论,因此不在 StackOverflow 的职权范围内。基本上,我知道你的测试没有失败——它被跳过了。我建议跳过的测试或长时间运行的测试应该使构建失败 - 这将被报告并且不会发生问题回归。过度工程是设计您的测试以检测测试环境(汽车制造商为此遇到了很多麻烦)。
-
@Dave 好吧,没办法。这种特定的软件依赖性不能强加给使用该特定存储库的所有开发人员。
-
当然,任何没有安装该软件的开发人员都不应该被用作特定构建工作的詹金斯奴隶吗?老实说,我觉得开发者机器会被用作詹金斯奴隶很奇怪,但这是一个完全独立的争论。
标签: java maven jenkins junit maven-failsafe-plugin