Неустранимая ошибка PHPUnit: допустимый объем памяти исчерпан

Когда я запускаю свои тесты, PHPUnit 8 аварийно завершает работу и генерирует фатальную ошибку: допустимый объем памяти x байтов исчерпан. Я думаю, что он падает только при сбое некоторых тестов.

Когда я впервые использовал его вчера, я установил 2 очень простых теста, сравнивающих 2 строки. Все работало нормально, когда оба теста прошли. Когда я сознательно позволил 1 тесту провалиться, он все еще работал Когда оба теста провалились, я получил указанную ошибку.

я узнал что --process-isolation при выполнении PHPUnit 8 эта проблема решается, однако теперь выполнение тестов занимает невероятное количество времени (5 минут для примерно 30 простых сравнений строк), увеличиваясь с каждым новым тестом, что, очевидно, невозможно в долгосрочной перспективе.

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

Я уже удалил и переустановил PHPUnit 8, который никак не повлиял на проблему.

Может быть важно: я установил PHPUnit с Composer.

Обновление: хорошо, я только что попробовал это на машине моего коллеги, и она прекрасно работала там с той же кодовой базой. Это становится странным...

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

class MyClassTest extends TestCase
{
    public function myFunctionProvider()
    {
        // horizontal tab
        $ht = "\u{0009}";
        ...

        return [
            'descr_1' => ['   abc  ', 'abc'  ],
            'descr_2' => ['d e  f'  , 'd e f'],
            'descr_3' => ['ghi'     , 'ghi'  ],

            'descr_4' => [$ht . $ht . 'jkl' . $ht               , 'jkl'    ],
            'descr_5' => ['m' . $ht . $ht , 'n' . $ht . 'o'     , 'm n o'  ],
            ...
        ];
    }

    /**
     * @dataProvider myFunctionProvider
     */
    public function testMyFunction(string $dirtyString, string $expectedResult): void
    {
        $actualResult = MyClass::myFunction($dirtyString);

        $this->assertEquals(
            $expectedResult,
            $actualResult
        );
    }
}

Как я могу заставить PHPUnit не использовать все мои ресурсы и нормально функционировать?

Изменить: На основе комментария Якуба Заласа, вот реализация myFunction():

public static function myFunction(string $dirtyString): string
{                                                                          
    $regex = '/\s+| +/';                                                   
    $dirtyString = trim($dirtyString, $regex);                             
    $cleanedString = preg_replace($regex, ' ', $dirtyString);              

    return $cleanedString;                                                 
}      

0 ответов

Я знаю, что это старый вопрос, но я только что столкнулся с той же проблемой с ужасной фатальной ошибкой "память исчерпана" при запуске PHP Unit с Symfony phpunit-bridge. На мой взгляд, добавление флага "--process-olated" запускало тесты. Исходя из предыдущего опыта, я обнаружил, что это часто смягчает модульные тесты PHP, которые вызывают эту ошибку памяти.

В частности, для Symfony команда:

$ ./vendor/bin/simple-phpunit --process-isolation
Другие вопросы по тегам