PHPUnit и тестирование заголовков

Redjik

Джедай-мастер
Какой вообще смысл коды тестировать 0_o.

По хорошему поисковики все и так сожрут.
Клиент вообще не узнает какой код пришел.

=> нужно для апи, возможно даже RESTful

И если я правильно наванговал, то именно апи и нужно тестить (народ какбе намекает и показывает в сторону функциональных тестов)
 

WMix

герр M:)ller
Партнер клуба
Активист, извени конечно, но кажись ты не понимаешь смысла unit тестов. те по идеи можно потестить как ведет себя Response в той или иной ситуации. но вопрос голой математики. ничего общего с протоколами, файловой системой или базами данный.
 

Активист

Активист
Команда форума
Активист, извени конечно, но кажись ты не понимаешь смысла unit тестов. те по идеи можно потестить как ведет себя Response в той или иной ситуации. но вопрос голой математики. ничего общего с протоколами, файловой системой или базами данный.
Помоему всё чаще и чаще на этом форуме люди пытаются навязать свою точку зрения как единственно верную не аргументируя ее.
Unit тестирование - это тестирование элементов кода. Я сначала пишу тест, потом код, который полностью покрывается этим тестом.
Почему вы отвергаете тестирование например файловой системы или базы данных, когда для той же базы данных у PHPUnit есть определенные механизмы? Чем вы предлагаете тестировать работу с базой данных и файловой системой?

Есть крайне сложные SQL запросы и SQL логика, еще раз повторюсь - крайне сложная, со сложной структурой базы данных, например - у меня это поиск свободных мест (не оплаченных в течение 2-х часов 5-тью спосабами, включая оффлайновый или через (Сбербанк "Система Город" через выставление и регистрацию счетов) в автобусе типа "Хендай" с 50 местами на конкретную дату и время определенного маршурата и перевозчика "ООО Рога и Копыта" со своим графиком движения и другими ценами, от точки C до D маршрута от А до B и бронирование этого места путем создания заказа. Когда вы напишите и спроектируете эту базу данных, вам априори придется вносить туда изменения (например - добавить новый тип билета с новыми типами рассчета - льготный билет по цене 0), и в связи с этим нужно все протестировать, потому что заказчик, покупатель, кассир могут попасть на бабки, если вдруг, в итоговом заказе бронь аннулируется (это простой пример) или забронируется место одно и тоже двумя покупателями на пересечении отрезков A C D B и одному придется "сидеть на коленях другого". Добавьте туда еще мем кеш и попробуйте найти логическую багу, когда вдруг вам говорят, что люди не могут забронировать заказ... Какими функциональными тестами я это проверю, если у меня взаимосвязано очень много, и важно, что бы все отработало как надо после внесения тех или иных изменений, в т.ч. не нарушалась целостность данных, которые еще и нужно иногда обрабатывать и передавать в контролирующие органы как отчетные документы или сводные ведомости по рассчетам сервисного сбора.
 

WMix

герр M:)ller
Партнер клуба
да может механизмы существуют, но это для лохов которые мокнуть нормально не могут, или просто чтоб писанины было меньше, тип нехай пусть ходит через базу. смысл в другом. если говорить о коде ответа сервера можно представить следующее. когда вызывается redirect то getHttpCode должна быть равной 304. при этом ни о каких http-запросах или ответах речи нет. разговор только о поведении обьекта, о его состоянии.
 

whirlwind

TDD infected, paranoid
Активист, да не слушай ты их. И проверку code coverage используют (например в dell software), и заголовки тестируют (например в ror). Тесты это всегда компромис между behaviour и state testing. В случае наличия прослойки из процедурного интерфейса, где отсутствует возможность заюзать полиморфизм для мокирования, остается только state testing. PHP как раз такой случай. Просто нужно поработать на инфраструктурой. Например, я предпочитаю заворачивать процедурный интерфейс в ОО-обертку и потом ее мокать или стабить в зависимости что легче и понятнее. В таком случае сам системный вызов под тесты не подпадает, а в обертке ошибиться сложно, так как просто вызов с аналогичным системному сигнатурой делегируется системной функции. Пример, как я это делаю на плюсах

https://github.com/robot-aquila/wquik/blob/master/include/aquila/core/IWinApi.h интерфейс обертки
https://github.com/robot-aquila/wquik/blob/master/include/aquila/core/WinApi.h реализация обертки
https://github.com/robot-aquila/wquik/blob/master/tests/include/aquila/core/MockWinApi.h мок
 

WMix

герр M:)ller
Партнер клуба
Есть крайне сложные SQL запросы
тебе не нужно тестить работает ли база данных. - она работает! тебе не нужно тестить сложное, но units своего рода еденицы, каждый маленький метод, никаким образом не связанный с программой. как только метод ДОЛЖЕН обратиться наружу, засовываем мок, и проверяем а был ли запрос наружу, если да, то смоделируй ответ того вызова.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
whirlwind, он не хочет тестировать формирование заголовков. Он хочет тестировать, какие коды статуса отдает веб-сервер. Зачем тестировать веб-сервер?
 

whirlwind

TDD infected, paranoid
WMix, я эту проблему называю сложный диалект. Предположим, касательно СУБД, мы сделали так, как ты сказал. Но где гарантия, что в коде не осталась ошибка в самом SQL запросе? Тест написанный на моках эту проблему замолчит. А если задача теста тестировать в реальных а не академических целях, то этот вариант не работает. Наиболее оптимальным будет тест с inmemory СУБД, фикстурой в виде дампа в файле или черезbuilder/object mother.
 

fixxxer

К.О.
Партнер клуба
Активист, да не слушай ты их. И проверку code coverage используют (например в dell software), и заголовки тестируют (например в ror). Тесты это всегда компромис между behaviour и state testing
Вот очень опасные слова твои для неопытного в этих делах человека. Легко сделать неправильный вывод.
 

Adelf

Administrator
Команда форума
Я похоже чего-то не понимаю раз дискуссия все еще идет. Заголовок, который отдастся браузеру - это результат работы целой системы. Не какого-то отдельного класса(юнита), а почти всех частей системы. Это не юнит-тестирование. Это функциональное. И тестят это другими тулзами. Не мучай phpunit.

Ну или да... замочить базу, другие сервисы.. и тестить только бизнес-логику. Такой вариант есть, но результат работы БЛ - это не HTTP заголовки.
 
Сверху