Как эффективно разделить большой набор тестов phpunit?

Я использую функцию testsuites phpunit для организации своих тестов. Я делаю это, чтобы позже иметь возможность запускать тесты параллельно.

Это относительно просто для разных каталогов. Например, я мог бы разделить наборы тестов по пакетам.

<testsuite name="bundle-one">
    <directory>tests/BundleOne</directory>
</testsuite>

<testsuite name="bundle-two">
    <directory>tests/BundleTwo</directory>
</testsuite>

<testsuite name="bundle-three">
    <directory>tests/BundleThree</directory>
</testsuite>

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

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

<testsuite name="services-AM">
    <directory>tests/services/{A-M}</directory>
</testsuite>

<testsuite name="services-NZ">
    <directory>tests/services/{A-M}</directory>
</testsuite>

Я не смог найти никакой документации по своей идее. У кого-нибудь может быть идея для этого? :-)


person stijink    schedule 24.08.2015    source источник


Ответы (2)


Я не уверен, есть ли способ сделать это «на лету», но вы можете автоматизировать процесс создания этих пакетов из reg-ex:

В композиторе.json:

 "scripts": {
    "make-phpunit-bundles": "php path/to/myscript.php"
},

перед запуском тестов:

php composer.phar make-phpunit-bundles

myscript.php:

//Iterate/scan your directories, build and write the phpunit.xml file 
//based on the regular expressions you want
person STLMikey    schedule 24.08.2015
comment
Спасибо. Я сделал именно это. Довольно хорошо работает :) - person stijink; 15.10.2015

Более простым решением может быть фильтрация ваших тестов:

# Only include test classes beginning with the letter A-M
phpunit --filter '/^[A-M]/'

и

# Only include test classes beginning with the letter N-Z
phpunit --filter '/^[N-Z]/'

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

Вам нужно будет поэкспериментировать, чтобы получить равномерное разделение. то есть, если все ваши тесты начинаются с символов между A-M, это не сработает.

Протестировано с PHPUnit 5.4.6

person Tama    schedule 13.09.2016