测试在詹金斯失败,但在外面工作
我有一个测试使用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)
我不知道在詹金斯运行测试是否会影响JNDI?我知道Jenkins使用Maven嵌入器,但Surefire插件默认分支测试,它可能不像Jenkins那样在相同的虚拟机实例内运行。
我运行在前台的詹金斯(Java的罐子jenkins.war),也使用相同的用户运行,因为我在我登录所以没有权限问题。此外,我不需要Window Manager运行,因为我的测试不需要像Selenium那样与UI进行交互。
我使用这两个环境中的Java和Maven的版本是完全相同了。
任何指针?
你尝试使用这个?
"java:comp/env/MY_JNDI_RESOURCE"
这可如果詹金斯实际上是用一个不同的Java JRE来运行你的应用程序很容易地发生 - 尝试用一个明确的路径到Java运行它。确保你先在Jenkins之外测试该命令。
我刚刚有完全相同的问题,事实证明,没有为Jenkins使用的特定JRE创建Windows防火墙条目 - 即使我在我的防火墙中添加了全局端口异常。
我只是跑到我的Java应用程序到Java的完整路径,增加了防火墙规则来我的Windows防火墙在通知中出现詹金斯,然后重新运行和一切工作。
我最近这种情况发生,我想我会分享我的发现。当我的单元测试在Jenkins中运行时,OpenEJB“找出”的jndi路径与直接在我的IDE中的maven项目中构建它的jndi路径不同,因此它将Jenkins创建的“workspace”目录添加到jndi路径,导致查找失败。所以
java:global/ProjectName/ProjectService
将名字在我的IDE而
java:global/workspace/ProjectService
会在詹金斯绑定名称进行计算。我能够通过OpenEJB日志记录了解到这一点。
使用OpenEJB日志输出可以更容易地看到发生了什么。通常进入System.out并且在构建输出中。 – 2012-05-10 14:34:31