Как я могу пропустить выполнение медленных тестов при запуске определенного набора тестов в PHPUnit, но все же запускать все тесты, когда мне нужно полное покрытие кода? - PullRequest
1 голос
/ 24 сентября 2019

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

В частности, выполнение одного из тестов занимает более 2 секунд (см. Ниже).

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

Какя могу сделать это?

Для записи моя конфигурация phpunit.xml выглядит так:

<phpunit bootstrap="bootstrap.php">
    <testsuite name="Crating">
        <directory>../module/Crating/test/</directory>
    </testsuite>
</phpunit>

Команда, которую я использую для запуска моего набора тестов, выглядит примерно так:

phpunit -c phpunit.xml --testsuite CratingCalc

Один из файлов в моем каталоге ../module/Crating/test/ - CrateRepositoryTest.php.Это выглядит так:

class CrateRepositoryTest extends TestCase
{

    function testCombine()
    {
        //mocked up hardcoded data
        $fake = new FakeCratingDataModel();

        //connection to real live database
        $real = new CratingDataModel();    

        /* 
         * Tests that verify mocked up data to match live data
         * Purpose to have them is to alert me when live database data or schema change
         */
        $this->assertEquals($fake->getContentsBySalesOrderNumber(7777), $real->getContentsBySalesOrderNumber(7777));
        $this->assertEquals($fake->getContentsByShopJobNumber(17167), $real->getContentsByShopJobNumber(17167));
        $this->assertEquals($fake->getNearCrating(20, 20, 20), $real->getNearCrating(20, 20, 20));
        $this->assertEquals($fake->getContentsByInquiryNumber(640, 2), $real->getContentsByInquiryNumber(25640, 2));
    }
}

1 Ответ

1 голос
/ 25 сентября 2019

Группы.

Обычно вы можете добавлять аннотации @group small или у меня есть @group ci (только для вещей, которые я буду запускать в полной среде CI).

Имея маленький,Средние или большие тесты на самом деле настолько распространены, есть специальные групповые аннотации - @small, @medium & @large, а также есть настройки для файла phpunit.xml, которые также могут давать ограничения по времени для каждого (и убивать, и проваливать их,если они занимают слишком много времени:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  ....
  timeoutForLargeTests="5"
  timeoutForMediumTests="2"
  timeoutForSmallTests="1"
  .... >

У меня есть два способа запуска моих тестов - полная версия, не исключающая каких-либо групп (выполнение тестов 1250 занимает около 50 секунд ,без покрытия) и более быстрые тесты, добавляющие --exclude-group ci,large,webtest к команде phpunit, которые могут выполнить 630 тестов менее чем за 4 секунды .

...