Подгрузка фикстур

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Maxim
Сообщения: 13
Зарегистрирован: 2012.05.02, 19:15

Подгрузка фикстур

Сообщение Maxim »

Всем привет!

Столкнулся с тем что юнит-тесты стали страшно тормозить.
Пост пишу для того что бы с одной стороны обратить внимание на проблему, а с другой возможно получить какие либо комментарии. Т.е. может быть я просто что-то не так понимаю. Если окажется что это так, то буду рад любым советам и объяснениям.

Итак проблема:
как уже было сказано ранее, юнит тесты начали жутко тормозить (время выполнения доходит до 30-60с)
Начал разбираться и оказалось что метод CDbFixtureManager::getFixtures() грузит абсолютно все фикстуры из папки фикстур, не обращая внимания на то какие именно из них были указаны в свойстве $fixtures теста.
Мне кажется это неправильное поведение, поскольку при инициализации каждой фикстуры делается куча оочень тяжелых запросов (сбрасываются сиквенсы, чистятся и создаются таблицы).

Вероятно, проблему можно решить кастомным классом на базе CDbFixtureManager, чем я собственно, сейчас и займусь
Maxim
Сообщения: 13
Зарегистрирован: 2012.05.02, 19:15

Re: Подгрузка фикстур

Сообщение Maxim »

спасибо за ссылку, не нашел почему-то этот пост

в моем случае я решил по возможности отказаться от использования фикстур вообще, а где есть необходимость в установленных данных использовать стабы и моки
lexand
Сообщения: 58
Зарегистрирован: 2012.01.17, 19:56

Re: Подгрузка фикстур

Сообщение lexand »

все фикстуры не грузяться, но местами один отдельный тест в пакете идет секунд 16
из-за тех же фикстур

кто как разгоянет загрузку фикстур, может использует какието другие методы загрузки данных???
lexand
Сообщения: 58
Зарегистрирован: 2012.01.17, 19:56

Re: Подгрузка фикстур

Сообщение lexand »

исходные условия были такими 144 теста за 15 минут - для того что бы локально прогонять перед комитом - это долго
особенно долго если приходиться перезаупскать тесты после какогото большого рефакторинга

переписал я FixtureManager тоесть написал свой за два подхода
1. убрал загрузку файлов, тоесть они грузяться но только один раз, потом попадаеют в memcache
2. за втором этапом - убрал дурную (ИМХО) построчнут вставку, со всего файла фсе фикстуры собираються в один запрос. Отсутствуют дополнительные вызовы getLastInsertId().

это наложило несколько ограничений
1. так как все строки собираютсья в один запрос - в фикстурах должны присутсвовать одинаковый набор полей на один файл, а не так что в одной строке задано 3 поля, а для второй одно не нужно и задали два.
2. должны быть заданы все!!! первичные автоинкриментарные ключи (но они у меня и так были заданы)

вообщем это позволлио сократить время на 10 минут что очень даже не плохо

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