столкновение нескольких тестов в phing - PullRequest
4 голосов
/ 18 марта 2011

У нас есть скрипт Phing, который Hudson использует для создания / тестирования нашего сайта PHP.

Некоторые из наших модульных тестов загружают библиотеку основных функций; другие используют макет, чтобы избежать необходимости (или для предоставления конкретных поддельных результатов теста).

Все модульные тесты работают отлично, если они выполняются изолированно (т. Е. В командной строке, используя phpunit). Однако, когда мы запускаем их вместе как пакет в Phing, мы получаем ошибки.

Ошибки есть в тестах, где мы написали макеты для определенных функций. Ошибка говорит о том, что мы объявляем функцию дважды. Он явно пытается включить реальную библиотеку функций, а также макеты.

Тесты включают в себя код, который является взаимоисключающим, поэтому их нужно запускать изолированно друг от друга; может показаться, что Phing запускает их все в одном процессе, поэтому включенные файлы конфликтуют.

Соответствующая часть скрипта phing выглядит так:

<phpunit haltonfailure="true" printsummary="true">
  <batchtest>
    <fileset dir="${ws}/path/to/site/root/">
      <include name="*Test.php" />
      <include name="*/*Test.php" />
      <include name="*/*/*Test.php" />
      <include name="*/*/*/*Test.php" />
    </fileset>
  </batchtest>
  <formatter type="xml" todir="${builddir}/logs" outfile="units.xml" />
</phpunit>

Есть ли способ заставить phing запускать тесты независимо друг от друга, не указывая каждый из них отдельно в скрипте сборки?

1 Ответ

1 голос
/ 18 марта 2011

Что ж, самый простой / быстрый обходной путь выглядит так: «Не используйте задачу phing, но начните использовать« реальный »вывод phpunit.

Так работает <exec command="phpunit ... "> [...]

и используйте --coverage-html, опубликуйте это в hudson и используйте --coverage-clover и переключатель junit, чтобы получить информацию о покрытии в hudson. (См. jenkins-php.org или Setting up jenkins for php projects (there is a demo phpunit.xml.dist) для справки)


Но скорее всего, вы не хотите, чтобы: /

Говорят, from the Phing docs of the phpunit task Я не вижу способа напрямую сказать phing использовать --process-isolation switch.

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

Из комментариев

Я собираюсь предположить, что у вас есть 2 отдельных фрагмента тестового кода, которые не могут быть запущены в одном процессе, так что было бы идеально, если бы вы могли сказать:

run 2 processes: "testsuite one do that, testsuite two do the other thing"
after that aggregate the results

К сожалению, я не знаю, как вы могли бы сказать phpunit сделать это. Я буду исследовать дальше, но пока единственное, что я знаю, что работает наверняка, - это использование --process-isolation каждого теста во всем комплекте тестов. Если есть способ запустить весь пакет в одном отдельном процессе, я не знаю об этом.


Надеюсь, у кого-то есть более простое решение этого вопроса:)

...