Всем привет!
Столкнулся с тем что юнит-тесты стали страшно тормозить.
Пост пишу для того что бы с одной стороны обратить внимание на проблему, а с другой возможно получить какие либо комментарии. Т.е. может быть я просто что-то не так понимаю. Если окажется что это так, то буду рад любым советам и объяснениям.
Итак проблема:
как уже было сказано ранее, юнит тесты начали жутко тормозить (время выполнения доходит до 30-60с)
Начал разбираться и оказалось что метод CDbFixtureManager::getFixtures() грузит абсолютно все фикстуры из папки фикстур, не обращая внимания на то какие именно из них были указаны в свойстве $fixtures теста.
Мне кажется это неправильное поведение, поскольку при инициализации каждой фикстуры делается куча оочень тяжелых запросов (сбрасываются сиквенсы, чистятся и создаются таблицы).
Вероятно, проблему можно решить кастомным классом на базе CDbFixtureManager, чем я собственно, сейчас и займусь
Подгрузка фикстур
Re: Подгрузка фикстур
спасибо за ссылку, не нашел почему-то этот пост
в моем случае я решил по возможности отказаться от использования фикстур вообще, а где есть необходимость в установленных данных использовать стабы и моки
в моем случае я решил по возможности отказаться от использования фикстур вообще, а где есть необходимость в установленных данных использовать стабы и моки
Re: Подгрузка фикстур
все фикстуры не грузяться, но местами один отдельный тест в пакете идет секунд 16
из-за тех же фикстур
кто как разгоянет загрузку фикстур, может использует какието другие методы загрузки данных???
из-за тех же фикстур
кто как разгоянет загрузку фикстур, может использует какието другие методы загрузки данных???
Re: Подгрузка фикстур
исходные условия были такими 144 теста за 15 минут - для того что бы локально прогонять перед комитом - это долго
особенно долго если приходиться перезаупскать тесты после какогото большого рефакторинга
переписал я FixtureManager тоесть написал свой за два подхода
1. убрал загрузку файлов, тоесть они грузяться но только один раз, потом попадаеют в memcache
2. за втором этапом - убрал дурную (ИМХО) построчнут вставку, со всего файла фсе фикстуры собираються в один запрос. Отсутствуют дополнительные вызовы getLastInsertId().
это наложило несколько ограничений
1. так как все строки собираютсья в один запрос - в фикстурах должны присутсвовать одинаковый набор полей на один файл, а не так что в одной строке задано 3 поля, а для второй одно не нужно и задали два.
2. должны быть заданы все!!! первичные автоинкриментарные ключи (но они у меня и так были заданы)
вообщем это позволлио сократить время на 10 минут что очень даже не плохо
дальнейшее усеорение можно сделать переведя часть таблиц в memory, но тут стоит проблема - нужно именно часть таблиц перевести на память а остальные оставить транзакционными, и хочеть седалть так что бы оно легко могло переконфигурироваться.
особенно долго если приходиться перезаупскать тесты после какогото большого рефакторинга
переписал я FixtureManager тоесть написал свой за два подхода
1. убрал загрузку файлов, тоесть они грузяться но только один раз, потом попадаеют в memcache
2. за втором этапом - убрал дурную (ИМХО) построчнут вставку, со всего файла фсе фикстуры собираються в один запрос. Отсутствуют дополнительные вызовы getLastInsertId().
это наложило несколько ограничений
1. так как все строки собираютсья в один запрос - в фикстурах должны присутсвовать одинаковый набор полей на один файл, а не так что в одной строке задано 3 поля, а для второй одно не нужно и задали два.
2. должны быть заданы все!!! первичные автоинкриментарные ключи (но они у меня и так были заданы)
вообщем это позволлио сократить время на 10 минут что очень даже не плохо
дальнейшее усеорение можно сделать переведя часть таблиц в memory, но тут стоит проблема - нужно именно часть таблиц перевести на память а остальные оставить транзакционными, и хочеть седалть так что бы оно легко могло переконфигурироваться.