Как тестировать методы, работающие с большими наборами данных?
Я работаю с большими массивами данных на пхп. Пишу скрипты с математическими вычислениями. Для каждого скрипта (для совокупности методов в класса) пишу модульные тесты (phpunit), в основном, чтобы сравнивать ручные просчеты (в тестах) и автоматические просчеты (в скрипте).
Из-за того, что образуются большие переменные, например, несколько массивов на 1лям данных, я стараюсь освобождать память и удаляю их при первой ненадобности.
Но для тестов мне нужно, чтобы метод их возвращал, чтобы я сравнивал результаты.
Я решил проблему установкой констант в окружении, если тестовое окружение, то возвращай результат (небольшой по размеру), если боевой, то удаляй.
Как по мне, не совсем хорошее решение, так как метод возвращает разные(по типу) результаты в зависимости от окружение. Как решить? Кто что посоветует? Или оставить так?
Уточнение:Во время тестов, мне нужно что бы метод класса возвращал данные, так как я буду их сверять на правильность. Тесты работают с тестовой небольшой базой. В боевых условиях, с настоящей базой, данных очень много, получаются большие массивы, и хранить/возвращать их, метод не должен. Выход один, изменить логику метода, в зависимости от окружение. А это не гуд. Как еще можно поступить?
@ua6xh не понял Вашего вопроса..... тестирую я на другой БД(тестовой) в которое мало данных и поэтому тесты проходят быстро. для тестов мне нужно возвращать данные из методов, а для боевого запуска - нет.
В любом случае изменение логики метода в зависимости от окружения плохое решение, я бы сделал такой вариант, смый главный мотод в котором генеряться данные разбил бы на подметоды, и вынес бы генерацию данных в отдельный метод например generateData и тестировал бы его в phpunit, вызывал бы его в основном метода $data = $this->generateData(), а потом удалял бы данные.
придумал решение. в методе класса я делаю операции с данными из БД и сохраняю результаты. ничего возвращать не буду (как и в случае на боевом сервере). а в тестах выберу данные и проверю на правильность. заодно и проверю этим сохранение в БД.
@pavel_salauyou а почему не юнит? Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода.
У меня это все в одном методе(выборка с БД, обработка данных, сохранение в БД). Если я ошибаюсь, скажите, почем это не юнит тесты и как из этого сделать юнит. спс
я уже написал что над осделать, надо разбить ваш МЕГА метод на подметоды и тестировать каждый по отдельности, в тех методах возвращать данные в МЕГА методе можете не возвращать его соотвественно и не тестировать