如果开发人员的计算机没有运行该软件的必备软件,我将使用Assumption
进行JUnit测试以跳过该测试。尽管是“初级”,但这是一个集成测试。像这样:
int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
但是,由于这一假设,有一次我意识到测试已经停止在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);
甚至,
@Test
void testJenkinsEnvironment() {
...
Assume.assumeTrue(isJenkinsBuild);
Assert.assertTrue(isSoftwarePresent);
}
@Test
void testFeature() {
...
Assume.assumeTrue(isSoftwarePresent);
...
}
答案 0 :(得分:4)
由于它们易于测试并传递给构建所执行的每个程序,因此我选择基于环境变量进行检查。
尽管rohit答案显示了一种在Jenkinsfile上设置变量的方法,但我宁愿依靠Jenkins本身所做的事情,因此我检查了在Jenkins作业上设置的环境变量,并且有很多选择可供选择:
在Jenkins实例上,这些似乎是恒定的。
HUDSON_URL
JENKINS_URL
不是Jenkins特有的,但以下内容也很有用:
USER
我们的Jenkins在用户jenkins
下运行,因此也可以测试该值。
对于同一作业,它们在各个版本中具有恒定值。
JOB_URL
JOB_NAME
JOB_BASE_NAME
JOB_DISPLAY_URL
它们在同一内部版本中具有恒定的值(即,对于不同的sh
调用)。
BUILD_URL
BUILD_TAG
RUN_CHANGES_DISPLAY
RUN_DISPLAY
BUILD_DISPLAY_NAME
BUILD_ID
BUILD_NUMBER
这些与正在执行当前命令的节点有关。
JENKINS_HOME
JENKINS_NODE_COOKIE
NODE_LABELS
NODE_NAME
此版本随每次构建而变化,可能随节点而变化,甚至随Jenkinsfile配置而变化:
WORKSPACE
我不确定这些。他们肯定来自詹金斯,但我不知道他们的生命周期是什么。
HUDSON_SERVER_COOKIE
JENKINS_SERVER_COOKIE
HUDSON_COOKIE
出于我自己的目的,我决定选择JENKINS_HOME
。该名称非常特定于詹金斯(Jenkins),似乎比JENKINS_URL
更基础。尽管这并不意味着该构建由Jenkins运行,但在这种情况下将始终进行设置。我不介意误报,只要我没有误报。
答案 1 :(得分:1)
两种实现方式:
您可以使应用程序接受参数,然后传递一个 TRUE / FALSE值,指示它是否从Jenkins运行。
您还可以阅读os的系统属性
例如System.getProperty(“ os.arch”);
但是如果您的詹金斯环境和您的 工作区在同一台机器上
就像这样:
管道-选项1
pipeline {
environment {
FROM_JENKINS= "TRUE"
} stage('test'){
sh "mvn test"
}
}
管道-选项2
pipeline {
stage('test'){
sh '''FROM_JENKINS="TRUE" // setting the env variable in the same shell where you are running mvn
mvn test'''
}
}
应用
boolean isJenkinsBuild = Boolean.valueOf(System.getenv("FROM_JENKINS"));
boolean isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor() == 0;
Assume.assumeTrue("Software not present", isSoftwarePresent || isJenkinsBuild);
希望它会有所帮助:)