Неустранимая ошибка PHPUnit: допустимый объем памяти исчерпан - PullRequest
0 голосов
/ 21 февраля 2019

Когда я запускаю свои тесты, 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;                                                 
}      
...