Maven не может запустить модульные тесты на облачных пчелах

У меня есть установка проекта Android на основе Maven для ci на cloudbees. Моя работа Jenkins просто выполняет цель «установить» после получения src из BitBucket. Все строится нормально. Единственная проблема в том, что модульные тесты не запускаются.

Выполнение точно такой же цели в IntelliJ (локально) позволяет находить и запускать модульные тесты.

Мой помпон выглядит так ->

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.odl</groupId>
    <artifactId>GhostRunner</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>apk</packaging>
    <name>GhostRunner</name>

    <properties>
        <platform.version> 4.1.1.4
            </platform.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android</artifactId>
            <version>${platform.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.robolectric</groupId>
            <artifactId>robolectric</artifactId>
            <version>2.0-alpha-1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.j256.ormlite</groupId>
            <artifactId>ormlite-android</artifactId>
            <version>4.45</version>
        </dependency>
        <dependency>
            <groupId>com.j256.ormlite</groupId>
            <artifactId>ormlite-core</artifactId>
            <version>4.45</version>
        </dependency>
        <dependency>
            <groupId>com.j256.ormlite</groupId>
            <artifactId>ormlite-jdbc</artifactId>
            <version>4.45</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.8.4</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
                    <assetsDirectory>${project.basedir}/assets</assetsDirectory>
                    <resourceDirectory>${project.basedir}/res</resourceDirectory>
                    <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>
                    <sdk>
                        <platform>16</platform>
                    </sdk>
                                        <undeployBeforeDeploy>true</undeployBeforeDeploy>
                </configuration>
                <extensions>true</extensions>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.15</version>
            </plugin>
        </plugins>
    </build>
</project>

Вывод Дженкинса вроде этого ->

[INFO] --- maven-surefire-plugin:2.15:test (default-test) @ GhostRunner ---
[INFO] No tests to run.
mojoSucceeded org.apache.maven.plugins:maven-surefire-plugin:2.15(default-test)
[JENKINS] Recording test results
mojoStarted com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.6.0(default-emma) 

Еще один интересный момент заключается в том, что я могу удалить безошибочную зависимость, и модульные тесты по-прежнему отлично справляются с целью установки в IntelliJ. По какой-то причине Maven просто не видит тесты при запуске из Jenkins на Cloudbees.

Мудрость получена с благодарностью.

Вот что сказали мутные пчелы ::

Проблема здесь в том, что IntelliJ компилирует тестовые классы для вас и помещает эти классы в $ {project.build.testOutputDirectory} для вас.

Вы можете реплицировать этот сбой локально, заставив IntelliJ выполнить чистую установку (удерживайте ⌘ при нажатии на цели жизненного цикла)

Есть два способа решить эту проблему.

Сообщите Maven, что ваши тестовые источники находятся не в стандартном месте

Поместите ваши тестовые исходники в стандартное место.

Когда вы имеете дело с большим количеством плагинов, некоторые из которых написаны не командой Apache Maven или командой Codehaus Mojo, лучше всего использовать стандартную компоновку каталогов. Плагины, подлежащие проверке сообществами Apache Maven или Codehaus Mojo, обычно принимают изменения, когда вы сообщаете Maven, что используете нестандартный макет. Плагины, не подпадающие под этот процесс проверки, часто могут не знать, как правильно работать, и поэтому вы вынуждены соответствовать стандартному макету.

Стивен Коннолли CloudBees, Inc

Я реорганизовал свой проект, чтобы отразить норму Maven, но он все еще не запускает тесты на сервере cloudbees.

Вот соответствующий вывод из вывода консоли jenkins:

[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ GhostRunner ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /scratch/jenkins/workspace/ghost runner/src/test/resources
mojoSucceeded org.apache.maven.plugins:maven-resources-plugin:2.6(default-testResources)
mojoStarted org.apache.maven.plugins:maven-compiler-plugin:3.0(default-testCompile)
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-compiler-plugin:3.0:testCompile (default-testCompile) @ GhostRunner ---
mojoSucceeded org.apache.maven.plugins:maven-compiler-plugin:3.0(default-testCompile)
mojoStarted org.apache.maven.plugins:maven-surefire-plugin:2.15(default-test)
[INFO] 
[INFO] --- maven-surefire-plugin:2.15:test (default-test) @ GhostRunner ---
[INFO] No tests to run.

Я думаю, что важная часть

Нет источников для компиляции

Как-то до сих пор не знает, где тесты.


person Chris Danson    schedule 25.07.2013    source источник
comment
Где вы разместили свои модульные тесты? src/test/java и назвали ли вы их как *Test*.java, *Test.java и *TestCase.java .   -  person khmarbaise    schedule 26.07.2013
comment
они находятся в / src / test, и все имена имеют формат ‹classname› Test. Как вы думаете, важно наличие папки java под тестовой папкой?   -  person Chris Danson    schedule 26.07.2013
comment
Да, это необходимо, потому что это значение по умолчанию в Maven src/main/java для производственного кода src/test/java для модульных тестов. Более того, src/main/resources для ресурсов, которые можно использовать в производственном коде, и src/test/resources для ресурсов в модульных тестах.   -  person khmarbaise    schedule 26.07.2013
comment
Ребята из Cloudbees подтверждают то, что вы говорите:   -  person Chris Danson    schedule 27.07.2013


Ответы (1)


Основываясь на комментариях в вашем вопросе выше, кажется, что вы не помещаете свои тестовые исходные файлы в структуру каталогов, ожидаемую Maven. На самом деле это проблема конфигурации Maven, которая напрямую не связана с CloudBees (за исключением того, что CloudBees использует vanilla maven для запуска вашей сборки). Если вы пытались запустить собственную сборку локально с помощью команды maven 'mvn' (как это делает задание CloudBees Jenkins CI), вы должны столкнуться с той же ошибкой.

На основе стандартной структуры каталогов Maven, вы должны поместить исходный код своих тестов в: src / test / java

Если вы хотите / вам нужно изменить структуру каталогов maven по умолчанию, обычно есть изменения конфигурации, которые вы можете указать в pom.xml, чтобы установить их. Однако многие люди считают, что борьба с maven приводит только к еще большей боли и в конечном итоге возвращается к стандартам.

Для получения дополнительной информации ознакомьтесь с этой веткой stackoverflow о о том, как изменить каталог тестов Maven по умолчанию.

person swashbuck1r    schedule 30.07.2013
comment
Вот что интересно. Я изменил структуру своего проекта, чтобы разместить весь код src в ожидаемых местах (как указано выше), и тесты по-прежнему не запускаются на облачных пчелах. Если я запускаю из строки cmd локально с «mvn clean», за которым следует «mvn install», все тесты запускаются. Проблема, похоже, в том, что по какой-то причине сборка cloudbees не может найти тестовые источники. - person Chris Danson; 30.07.2013
comment
Пожалуйста, откройте заявку в службу поддержки CloudBees, и мы поможем вам разобраться. - person swashbuck1r; 30.07.2013
comment
Спасибо всем в Cloudbees за помощь. В конце концов проблема была в МЕНЯ. При изменении структуры моего проекта мне каким-то образом удалось удалить большую его часть (источник) из системы контроля версий, чтобы она не отображалась как «изменение» в IntelliJ. Локально все работало, но репозиторий битбакетов был пуст. Надо еще больше стараться :) - person Chris Danson; 03.08.2013