Dan*_*ral 5 java junit maven jenkins maven-failsafe-plugin
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)
Dan*_*ral 13
由于它们易于测试并传递给构建所执行的每个程序,因此我选择基于环境变量进行检查。
尽管rohit答案显示了在Jenkinsfile上设置变量的一种方法,但我还是希望依靠Jenkins本身所做的事情,因此我检查了在Jenkins作业中设置的环境变量,并且有很多选择可供选择:
这些在詹金斯实例上似乎是恒定的。
HUDSON_URLJENKINS_URL不是特定于Jenkins,但以下内容也很有用:
USER我们的Jenkins在用户的监督下运行jenkins,因此也有可能测试该值。
对于同一作业,它们在各个版本中具有恒定值。
JOB_URLJOB_NAMEJOB_BASE_NAMEJOB_DISPLAY_URL它们在同一内部版本中具有恒定值(即,针对不同的sh调用)。
BUILD_URLBUILD_TAGRUN_CHANGES_DISPLAYRUN_DISPLAYBUILD_DISPLAY_NAMEBUILD_IDBUILD_NUMBER它们与在其上执行当前命令的节点有关。
JENKINS_HOMEJENKINS_NODE_COOKIENODE_LABELSNODE_NAMEThis one changes with each build, may change from node to node, and may even change with Jenkinsfile configuration:
WORKSPACEI'm not sure about these. They are definitely from Jenkins, but I don't know what their lifecycle is.
HUDSON_SERVER_COOKIEJENKINS_SERVER_COOKIEHUDSON_COOKIEFor my own purposes, I decided to go with JENKINS_HOME. The name is very Jenkins-specific, and it seems more fundamental than, say, JENKINS_URL. While it doesn't imply the build is being run by Jenkins, it will always be set in that case. I don't mind false positives, as long as I don't get false negatives.
有几种方法可以实现这一目标:
您可以让您的应用程序接受参数,然后传递一个 TRUE/FALSE 值,指示它是否从 Jenkins 运行。
您还可以读取 os 的系统属性
例如 System.getProperty("os.arch");
但是,如果您的 Jenkins 环境和工作区位于同一台计算机上,则这将不起作用
就像这样:
管道-选项1
pipeline {
environment {
FROM_JENKINS= "TRUE"
} stage('test'){
sh "mvn test"
}
}
Run Code Online (Sandbox Code Playgroud)
管道-选项2
pipeline {
stage('test'){
sh '''FROM_JENKINS="TRUE" // setting the env variable in the same shell where you are running mvn
mvn test'''
}
}
Run Code Online (Sandbox Code Playgroud)
应用
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);
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 :)
| 归档时间: |
|
| 查看次数: |
3945 次 |
| 最近记录: |