Java 如何检测在Jenkins环境中运行的测试?
我有一个JUnit测试,如果开发人员的计算机没有运行它的必备软件,我可以使用Java 如何检测在Jenkins环境中运行的测试?,java,maven,jenkins,junit,maven-failsafe-plugin,Java,Maven,Jenkins,Junit,Maven Failsafe Plugin,我有一个JUnit测试,如果开发人员的计算机没有运行它的必备软件,我可以使用假设跳过测试。尽管是“junit”,但它是一个集成测试。大概是这样的: int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor(); Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0))); boolean
假设跳过测试。尽管是“junit”,但它是一个集成测试。大概是这样的:
int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
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);
然而,有一次我意识到由于这个假设,测试已经停止在Jenkins上的自动构建上运行,最终引入了一个回归,测试应该停止
换句话说,Jenkins从属环境缺少所需的软件,这导致测试被跳过
自动测试由maven在Jenkins管道构建计划中使用故障保护插件运行。我怎样才能检测到我的环境是詹金斯,从而使假设条件更加严格
也就是说,我希望条件是这样的:
int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
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);
...
}
有两种方法可以实现这一点:
您可以让应用程序接受参数,然后传递
TRUE/FALSE值,指示它是否从Jenkins运行
您还可以读取操作系统的系统属性
e、 g.System.getProperty(“os.arch”)
但如果您的Jenkins环境和
工作区在同一台机器上
您只需在管道中设置一个env变量(仅存在于管道中),然后在应用程序中读取该值
像这样:
管道-选项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);
希望有帮助:)因为它们很容易测试并传递给构建执行的每个程序,所以我选择基于环境变量进行检查
虽然rohit answer显示了在Jenkins文件上设置变量的一种方法,但我更愿意依赖Jenkins本身所做的事情,因此我检查了在Jenkins作业上设置的环境变量,有很多选项可供选择:
詹金斯将军资料
在詹金斯的例子中,这些似乎是不变的
HUDSON\u URL
JENKINS\u URL
不是Jenkins特有的,但以下内容也很有用:
用户
我们的Jenkins在userJenkins
下运行,因此测试该值也是一种可能
工作信息
它们在同一作业的不同构建中具有常量值
JOB\u URL
JOB\u NAME
JOB\u BASE\u NAME
JOB\u DISPLAY\u URL
构建信息
它们在同一构建中具有常量值(即,对于不同的sh
调用)
BUILD\u URL
BUILD\u标签
RUN\u CHANGES\u DISPLAY
RUN\u显示
BUILD\u DISPLAY\u NAME
BUILD\u ID
BUILD\u编号
节点信息
这些与当前命令正在其上执行的节点相关
JENKINS_HOME
JENKINS\u NODE\u COOKIE
节点标签
节点名称
特别的
此项随每个构建而更改,可能会随节点而更改,甚至可能随文件配置而更改:
WORKSPACE
混杂的
我不确定这些。他们肯定来自詹金斯,但我不知道他们的生命周期是什么
HUDSON\u服务器\u COOKIE
JENKINS\u服务器\u COOKIE
HUDSON\u COOKIE
最后考虑
出于我自己的目的,我决定选择詹金斯之家。这个名字是非常特定于詹金斯的,它似乎比,比如说,Jenkins\u URL
更基本。虽然这并不意味着构建是由Jenkins运行的,但它总是在这种情况下设置的。我不介意误报,只要我没有误报。这听起来像是你对工程太过火了。将jenkins配置为在一段时间后自动使长时间运行的作业失败。另外,让您的Ops团队在CI服务器上安装所需的软件。编辑:如果您的测试是为了检测其运行时环境而编写的,那么您打算如何测试该测试?@Dave您的评论太令人困惑了!构建没有失败,它通过了,因为测试被忽略了。也许这就是为什么你说的对我没有意义?我对这个问题进行了更详细的编辑。我不认为有任何关于工程的问题,但是,如果有什么问题,一定要在代码示例中指出。我很想对此进行更多的辩论,但这是一场关于测试设计的哲学辩论,因此不在StackOverflow的职权范围之内。基本上,我知道你的测试没有失败——它被跳过了。我建议跳过的测试或长时间运行的测试都应该使构建失败——这将被报告,并且不会发生问题回归。过度工程设计是为了检测测试环境而设计测试(这是汽车制造商遇到很多麻烦的原因)。@Dave,那没办法。这种特定的软件依赖性不能强加于使用该特定存储库的所有开发人员。那么,任何没有安装该软件的开发人员都不应该被用作该特定构建作业的jenkins从属?老实说,我觉得开发人员机器会被用作jenkins从机很奇怪,但这是一个完全不同的争论。如果您包含执行检查的实际代码,我会很高兴。if(System.getenv(“jenkins_HOME”)!=null{…