Подключил PHPUnit в Kohana Framework, возникла необходимость протестировать ряд методов в модели и хелперы в проекте. Сейчас сижу и ломаю голову над PHPUnit, пытаюсь понять, есть ли возможность создать тест, который будет передавать в метод все возможные параметры значений (bool, array, object, int, float, null ..). Возможно я чего-то не понимаю. Как я вижу принцип работы тестов: Есть метод, в который передается к примеру id пользователя, внутри метода выполняется ряд действий. Метод может вернуть исключение в виде 404 ошибки если пользователь не обнаружен, да и вообще вернуть то, что сам и не ожидал получить Суть теста заключается в выявлении некорректного поведения метода. Если не прав поправьте. Да и вообще сейчас мало зная о PHPUnit, слабо себе представляю практическое применение. На русском языке не нашел достаточное кол-во примеров, возможно подскажут форумчане)
в двух словах объяснить сложно. читайте статьи. их в нете куча. общая суть такая: вы создаете кучу тестов. каждый тест проверяет чтото одно. например в вашем случае нужно написать тесты на метод находящий юзера по ид. вы в самом тесте создаете необходимые объекты подключаете библиотеки. вызываете метод с заведомо правильным ИД юзера - те чтобы точно знать какого именно юзера должен вернуть метод. и проверяете реально ли нашел метод его или нет. второй тест на случай если такого юзера нет. все тоже. но прописываете ИД юзера которого точно нет в БД. и сраниваеете результат. если метод вернул исключение 404 как у вас - то все хорошо - иначе ошибка теста. третий тест, например, для случая когда передали вообще не ИД а какойто мусор. вы заранее знаете что ДОЛЖЕн вернуть метод в этом случае. и проверяете что он реально возвращает. ну и тд. тест на каждый конкретный случай. потом запускаете их все вместе. и сразу видно в каком именно тесте сработал ассерт. получается что нужно добиться от метода поведения такого - чтобы все тесты выполнялись корректно. по идее тесты начинают писать еще ДО написания самого класса. тоесть тесты уже есть и они все несрабатывают, везде ошибка. и вы далее начинаете реализовывать всю логику класса. запуская тесты иногда. и до тех пор пока все тесты не начнут выполнятся успешно. в будущем. если например будете чтото менять в коде метода, рефакторинг например или новый функционал добавлять. запуск тестов сразу покажет что и где сломалось.
Суть тестов - дать некоторую уверенность, что приложение ведёт себя согласно требований. как-то так. И как следствие - если ты чего-то не предусмотрел, то тесты не покажут этого, просто потому что они не написаны. Небольшой пример Код (Text): <?php /** * Проверка захода пользователя с некорректным паролем */ public function testIncorrectUserLoginAction() { $login = 'demo'; $password = 'demo2'; $this->getRequest() ->setMethod('POST') ->setPost(array('login' => $login, 'password' => $password, )); $this->dispatch('/login'); $this->assertModule('default'); $this->assertController('login'); $this->assertAction('index'); $this->assertResponseCode(200); $this->assertQuery('#loginerror'); $this->assertNull(Zend_Auth::getInstance()->getIdentity()); } Зашёл пользователь с некорректным паролем. Проверяем, что вызвались нужный модуль, контроллер, действие, вернулся ответ с нужным кодом и сообщением об ошибке ('#loginerror') и др. В итоге, если я где-то что-то поменяю и оно каким-то боком коснётся информации об ошибке входа (пропадёт блок '#loginerror'), то я увижу это при выполнении тестов. Но конкретно в этом тесте я не увижу, если на странице появится вдруг какая-нибудь отладочная информация или пропадёт весь остальной шаблон.