Тесты не проходят в Jenkins, но работают вне

У меня есть тест, который проверяет сессионный компонент без сохранения состояния с помощью OpenEJB. Я использую Maven для управления сборкой. Кажется, что тест отлично работает в Jenkins (в командной строке), но терпит неудачу после того, как я добавил работу в Jenkins.

В частности, мой тест не может искать EJB в JNDI и получает следующее исключение.

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 embedder, но плагин Surefire по умолчанию разветвляет тесты и, возможно, не работает внутри того же экземпляра vm, что и Jenkins.

Я запускаю jenkins на переднем плане (java -jar jenkins.war), а также работаю с тем же пользователем, что и я, поэтому проблем с разрешениями нет. Также мне не нужен Window Manager, поскольку мои тесты не должны взаимодействовать с пользовательским интерфейсом, в отличие от Selenium.

Версии Java и Maven, которые я использую в обеих средах, также полностью идентичны.

Есть указатели?


person Kalpak Gadre    schedule 23.04.2012    source источник
comment
С выходом журнала OpenEJB может быть легче увидеть, что происходит. Обычно переходит в System.out и находится в выводе сборки.   -  person David Blevins    schedule 10.05.2012


Ответы (3)


Вы пробовали этим пользоваться?

"java:comp/env/MY_JNDI_RESOURCE" 
person ianpojman    schedule 11.05.2012

Это может легко произойти, если Jenkins на самом деле использует другую Java JRE для запуска вашего приложения - попробуйте запустить его с явным путем к Java. Убедитесь, что вы сначала протестировали эту команду вне Jenkins.

У меня была точно такая же проблема, и оказалось, что запись брандмауэра Windows не была создана для конкретной JRE, которую использовал Дженкинс, даже несмотря на то, что я добавил глобальное исключение порта в свой брандмауэр.

Я просто запустил свое Java-приложение с полным путем к Java, добавил правило брандмауэра в свой брандмауэр Windows, когда появилось уведомление, а затем повторно запустил в Jenkins, и все сработало.

person Luke Egging    schedule 18.02.2014

Это случилось недавно, и я подумал, что поделюсь тем, что обнаружил. Когда мои модульные тесты выполнялись в Jenkins, путь jndi, который OpenEJB «выяснял», отличался от того, когда я создавал его непосредственно в моем проекте maven из моей IDE, поэтому он добавлял созданный Jenkins каталог «workspace» к пути jndi, что привело к сбою поиска. Так

java:global/ProjectName/ProjectService

будет именем в моей IDE, а

java:global/workspace/ProjectService

будет рассчитываться для имени привязки в Jenkins. Я смог выяснить это по журналу OpenEJB.

person WizardsOfWor    schedule 06.11.2014