java - 如何检测我的测试是否在 Jenkins 环境中运行?

标签 java maven jenkins junit maven-failsafe-plugin

如果开发人员的计算机没有运行它的先决条件软件,我使用 Assumption 进行 JUnit 测试以跳过测试。尽管是“junit”,但它是一个集成测试。像这样:

int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));

但是,有一次我意识到,由于该假设,测试已经停止在 Jenkins 上的自动构建上运行,最终引入了测试应该停止的回归。 p>

换句话说,Jenkins slave 环境中缺少所需的软件,导致测试被跳过。

自动化测试由带有 FailSafe 插件的 Maven 在 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);
    ...
}

最佳答案

由于它们很容易测试并传递给由构建执行的每个程序,因此我选择基于环境变量进行检查。

虽然 rohit 回答显示了一种在 Jenkinsfile 上设置变量的方法,但我宁愿依赖 Jenkins 本身做的事情,所以我检查了在我的 Jenkins 作业上设置的环境变量,有很多选项可供选择:

一般 Jenkins 信息

这些在 Jenkins 实例上似乎是常量。

  • HUDSON_URL
  • JENKINS_URL

不是 Jenkins 特有的,但以下内容也很有用:

  • 用户

我们的 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 配置而变化:

  • 工作空间

杂项

我不确定这些。它们肯定来自 Jenkins,但我不知道它们的生命周期是什么。

  • HUDSON_SERVER_COOKIE
  • JENKINS_SERVER_COOKIE
  • HUDSON_COOKIE

最后的考虑

为了我自己的目的,我决定使用 JENKINS_HOME。这个名字是 Jenkins 特有的,它看起来比 JENKINS_URL 更基础。虽然这并不意味着构建正在由 Jenkins 运行,但在这种情况下它总是会被设置。我不介意假阳性,只要我没有得到假阴性。

关于java - 如何检测我的测试是否在 Jenkins 环境中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51143365/

相关文章:

java - 为什么打开网页的 JButton 仅在第一次单击时起作用,然后被停用?

java - Android应用程序中的JSON解析

java - 从jar里面获取资源文件

java - 使用 'mvn clean test' 命令时 MVN TestNG 报告位置更改

Ruby、bundle、SSH 和 Jenkins

java - 如何告诉 Glassfish 保留已编译的 JSP?

java - Lucene - 检索文档中多值字段的所有值

android - 将库模块 jar 安装到本地 maven 存储库

django - 在 aws 中使用 Auto Scaling 组和 ELB 构建系统

maven - Jenkins 和 maven-compiler-plugin?