Zend framework 2 + phpunit + несколько модулей + непрерывная интеграция

Заранее благодарим за любые комментарии. Я только начал переключаться с Zend Framework 1 на ZF2, и после запуска быстрого запуска и нескольких других руководств я заметил, что существует короткий подход к использованию "по умолчанию" для использования phpunit. Либо это, либо я просто потерян и смущен.

Структура папок для проекта по умолчанию

Project
| - config
| | - autoload
| | | - global.php
| | | - local.php.dist
| | - application.config.php
| - data
| - module
| | - Application
| | | - config
| | | - src
| | | - test
| | | | - ApplicationTest
| | | | - Bootstrap.php
| | | | - phpunit.xml
| | | | - TestConfig.php.dist 
| | | - view
| | | - Module.php
| | - Album
| | | - config
| | | - src
| | | - test
| | | | - AlbumTest
| | | | - Bootstrap.php
| | | | - phpunit.xml
| | | | - TestConfig.php.dist 
| | | - view
| | | - Module.php
| - public
| - vendor

Мой вопрос в том, как использовать Jenkins с помощью ANT для тестирования всех наборов тестов phpunit. Я понимаю причину тестирования каждого модуля отдельно, но как я могу правильно автоматизировать это, чтобы вернуть один report.xml. И было бы еще лучше, если бы мне не нужно было указывать каждый модуль в конфигурации phpunit. или build.xml.

Снова благодарим вас за любые комментарии.

Ответ 1

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

build.xml

<target name="phpunit" description="Run unit tests with PHPUnit">
    <apply executable="../vendor/bin/phpunit" parallel="false">
        <fileset dir="${env.WORKSPACE}/module" >
            <include name="**/test/phpunit.xml"/>
        </fileset>
        <arg value="--configuration" />
        <srcfile/>
    </apply>
</target>

И phpunit.xml для каждого модуля   

<phpunit bootstrap="Bootstrap.php">
    <testsuites>
        <testsuite name="Application">
            <directory>./</directory>
        </testsuite>
    </testsuites>

<!-- Filters only matter for code coverage reporting -->
    <filter>
        <blacklist>
            <directory>../../../vendor/</directory>
            <directory>./</directory>
            <file>../Module.php</file>
        </blacklist>
    </filter>
    <logging>
        <log type="coverage-html" target="../../../build/coverage" title="Application Module" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70"/>
        <log type="coverage-clover" target="../../../build/logs/clover-Application.xml"/>
        <log type="junit" target="../../../build/logs/junit-Application.xml" logIncompleteSkipped="false"/>
    </logging>
</phpunit>

Ответ 2

Ну, я использую следующую структуру. У меня есть все тесты внутри папки тестов, и я структурирую тесты так же, как модули структурированы:

Project
| - config
| | - autoload
| | | - global.php
| | | - local.php.dist
| | - application.config.php
| - data
| - module
| | - Application
| | | - config
| | | - src
| | | | - Application
| | | | | - Controller
| | | | | | - IndexController.php
| | | | | - Model
| | | | | | - Foo.php
| | | | | - Form
| | | - view
| | | - Module.php
| | - Album
| | | - config
| | | - src
| | | | - Album
| | | | | - Controller
| | | | | | - IndexController.php
| | | | | - Model
| | | | | | - Bar.php
| | | | | - Form
| | | - view
| | | - Module.php
| - public
| - vendor
| - tests
| | - unit
| | | - module
| | | | - Application
| | | | | - src
| | | | | | - Application
| | | | | | | - Controller
| | | | | | | | - IndexControllerTest.php
| | | | | | | - Model
| | | | | | | | - FooTest.php
| | | | - Album
| | | | | - src
| | | | | | - Album
| | | | | | | - Controller
| | | | | | | | - IndexControllerTest.php
| | | | | | | - Model
| | | | | | | | - BarTest.php
| | - functional
| | | - features
| - phpunit.xml
| - phpunit-ci.xml
| - behat.yml

Конфигурации PHPUnit могут выглядеть примерно так (упрощенный пример, добавьте белый список, фильтры, зону покрытия и т.д. в соответствии с вашими потребностями):

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="tests/unit/Bootstrap.php" colors="true" backupGlobals="false" backupStaticAttributes="false" syntaxCheck="false">
    <testsuites>
        <testsuite name="sites">
            <directory suffix="Test.php">tests/unit</directory>
        </testsuite>
    </testsuites>
</phpunit>

Пример phpunit-ci.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="tests/unit/Bootstrap.php" colors="true" backupGlobals="false" backupStaticAttributes="false" syntaxCheck="false">
    <testsuites>
        <testsuite name="sites">
            <directory suffix="Test.php">tests/unit</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist>    
            <!-- Album module -->
            <directory suffix=".php">module/Album/src/Album/Model</directory>
            <directory suffix=".php">module/Album/src/Album/Controller</directory>

            <!-- Application module -->
            <directory suffix=".php">module/Application/src/Application/Model</directory>
            <directory suffix=".php">module/Application/src/Application/Controller</directory>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-html" target="build/coverage" charset="UTF-8"
             yui="true" highlight="true" lowUpperBound="40" highLowerBound="80" />
        <log type="coverage-clover" target="build/logs/clover.xml" />
        <log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false" />
    </logging>
</phpunit>

В build.xml это легко:

<target name="phpunit-ci" description="Run unit tests with config file for CI">
    <sequential>

        <exec executable="${basedir}/vendor/bin/phpunit" failonerror="true">
            <arg value="--version" />
        </exec>

        <exec executable="${basedir}/vendor/bin/phpunit" failonerror="true">
            <arg value="-c" />
            <arg path="${basedir}/phpunit-ci.xml" />
        </exec>

    </sequential>
</target>