测试在 Jenkins 中失败,但在外面工作



我有一个测试,它使用 OpenEJB 测试无状态会话 Bean。我正在使用Maven进行构建管理。该测试似乎在 Jenkins 中运行良好(在命令行上),但在我在 Jenkins 上添加作业后失败。

更具体地说,我的测试无法在 JNDI 中查找 EJB,并出现以下异常。

javax.naming.NameNotFoundException: Name "global/slides/SlideService" not found.
    at org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:198)
    at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:152)
    at org.apache.xbean.naming.context.ContextFlyweight.lookup(ContextFlyweight.java:55)
    at com.diycomputerscience.slides.service.SlideServiceTest.setUp(SlideServiceTest.java:45)
    at junit.framework.TestCase.runBare(TestCase.java:132)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:243)
    at junit.framework.TestSuite.run(TestSuite.java:238)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:236)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:134)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:113)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:103)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:74)

我想知道在 Jenkins 中运行测试是否以某种方式影响 JNDI?我知道 Jenkins 使用 Maven 嵌入器,但 Surefire 插件默认分叉测试,并且它可能不会在与 Jenkins 相同的 vm 实例中运行。

我在前台运行 jenkins (java -jar jenkins.war),并且还使用与我登录相同的用户运行,因此没有权限问题。我也不需要运行窗口管理器,因为我的测试不像Selenium那样需要与UI交互。

我在这两种环境中使用的Java和Maven版本也完全相同。

有什么指示吗?

你试过用这个吗?

"java:comp/env/MY_JNDI_RESOURCE" 

如果 Jenkins 实际上使用不同的 Java JRE 来运行您的应用程序,这很容易发生 - 尝试使用显式的 Java 路径运行它。确保首先在 Jenkins 外部测试该命令。

我刚刚遇到了完全相同的问题,结果发现没有为 Jenkins 使用的特定 JRE 创建 Windows 防火墙条目 - 即使我在防火墙中添加了全局端口例外。

我只是使用完整的 Java 路径运行我的 Java 应用程序,在通知出现时将防火墙规则添加到我的 Windows 防火墙中,然后在 Jenkins 中重新运行,一切正常。

我最近发生了这种情况,我想我会分享我的发现。当我的单元测试在 Jenkins 中运行时,OpenEJB "找出"的 jndi 路径与我直接从 IDE 在 maven 项目中构建它时不同,因此它将 Jenkins 创建的"工作区"目录添加到 jndi 路径中,这导致查找失败。所以

java:global/ProjectName/ProjectService

将是我的 IDE 中的名称,而

java:global/workspace/ProjectService

将计算 Jenkins 中的绑定名称。我能够通过OpenEJB日志记录来解决这个问题。

最新更新