Как запустить определенный набор тестов phpunit xml?

85

как я могу выбрать конкретный набор тестов для выполнения?

$ phpunit --configuration config.xml

config.xml:

<testsuites>
    <testsuite name="Library">
        <directory>library</directory>
    </testsuite>
    <testsuite name="XXX_Form">
        <file>library/XXX/FormTest.php</file>
        <directory>library/XXX/Form</directory>
    </testsuite>
</testsuites>
Андреас Линден
источник

Ответы:

129

Вот код, как если бы PHPUnit 3.7.13

$ phpunit --configuration config.xml --testsuite Library
$ phpunit --configuration config.xml --testsuite XXX_Form

Если вы хотите запустить группу тестовых наборов, вы можете сделать это

<testsuites>
  <testsuite name="Library">
    <directory>library</directory>
  </testsuite>
  <testsuite name="XXX_Form">
    <file>library/XXX/FormTest.php</file>
    <directory>library/XXX/Form</directory>
  </testsuite>
  <testsuite name="Both">
    <directory>library</directory>
    <file>library/XXX/FormTest.php</file>
    <directory>library/XXX/Form</directory>
  </testsuite>
</testsuites>

потом

$ phpunit --configuration config.xml --testsuite Both

К сожалению, PHPUnit в настоящее время не поддерживает такие вложенные тесты.

<testsuites>
    <testsuite name="Both">
      <testsuite name="Library">
        <directory>library</directory>
      </testsuite>
      <testsuite name="XXX_Form">
        <file>library/XXX/FormTest.php</file>
        <directory>library/XXX/Form</directory>
      </testsuite>
  </testsuite>
</testsuites>

Поэтому, если вы хотите запускать группы тестовых наборов таким образом, вам необходимо дублировать конфигурацию xml!

Джош Вудкок
источник
У меня проблема в том, что <directory> просто игнорируется. Никаких тестов не проводилось. Если я укажу с помощью <file>, они будут работать нормально, но я не могу указать их все вручную! Они действительно следуют соглашению о названии файла Test.php и имени класса. Идея?
Александр Морланд
вы можете поделиться своим файлом конфигурации? Часто подозреваются мелкие детали.
Джош Вудкок
stackoverflow.com/questions/15249469/…
Александр Морланд
20

Это невозможно в текущих версиях PHPUnit, о чем свидетельствуют эти сообщения в списке рассылки phpunit-user: http://thread.gmane.org/gmane.comp.php.phpunit.user/1302

Но есть альтернатива, вы можете просто передать путь к phpunit.

phpunit library/XXX

Это запустит все тесты в каталоге library / XXX

Если для вас этого недостаточно, другой вариант - использовать аннотацию @group для разделения тестов на разные категории, которые затем можно запускать выборочно.

Anti Veeranna
источник
ну, как вы можете видеть в моем сообщении, это не совсем то, что мне нужно
Андреас Линден
Тогда вы ничего не можете сделать, как указано в первой ссылке моего ответа.
Anti Veeranna,
3

Начиная с phpunit 6.1, вы можете использовать атрибут в конфигурационном XML-файле defaultTestSuite, это похоже на использование параметра по умолчанию phpunit --testsuite xxxи переопределяется.

Карлос С Сото
источник
1

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

Майк Перселл
источник
1

Остальные ответы здесь верны. Вы не можете сделать это с помощью конфигурации xml, но вы можете сделать такой же тип конфигурации в php.

Это, конечно, не самая красивая вещь, но она должна дать вам необходимую функциональность.

Вы предоставили конфигурацию xml

<testsuites>
  <testsuite name="Library">
    <directory>library</directory>
  </testsuite>
  <testsuite name="XXX_Form">
    <file>library/XXX/FormTest.php</file>
    <directory>library/XXX/Form</directory>
  </testsuite>
</testsuites>

Гипотетически предположим, что ваша директория «библиотека» содержит 3 файла:

library
   XXX    
     FormTest.php
   Unit
     unittest1.php
     unittest2.php

И что каждый из файлов содержит 1 тест согласно идеальному соглашению об именах, например: FormTest содержит testForm ()

Для конфига мы создадим конфиг, содержащий все:

<?php
include_once "library/XXX/FormTest.php";
include_once "library/Unit/unittest1.php";
include_once "library/Unit/unittest2.php";

Затем мы создадим класс в соответствии с соглашением об именах phpunit. Вы можете называть его как хотите, мы никогда не будем его использовать ...

class LibraryConfigTest extends PHPUnit_Framework_TestCase {

Каждый «набор тестов» будет просто методом, запускающим нужные вам тесты. Назовите методы как хотите, потому что мы никогда не будем их использовать. Phpunit позаботится о работе. Не забудьте прокомментировать их по группам, чтобы вы знали, как выполнять.

/**
 * All Tests in Library
 * @group Library
**/
   public function testLibrary() {
      UnitTest1::testUnit1();
      UnitTest2::testUnit2();
      FormTest::testForm();
   }

/**
 * All Form tests in library/XXX
 * @group XXX_Form
**/
   public function testForm() {
      FormTest::testForm();
   }
 }
 ?>

Теперь, чтобы получить желаемую функциональность, просто запустите «config» для нужной группы.

phpunit --group XXX_Form library_config.php
phpunit --group Library library_config.php

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

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

SuperFamousGuy
источник