Статьи

CakePHP — веб-тесты с SimpleTest

У меня был взрыв с CakePHP в прошлом месяце или два, и я думал, что поделюсь некоторыми вещами, которые я изучил. Итак, в ближайшие пару недель я запишу некоторые вопросы / разочарования, с которыми я столкнулся, и мои решения.

CakePHP

Прежде всего, сообщество и разработчики были абсолютно выдающимися в своей поддержке. Я обнаружил, что когда Google не может дать мне ответ на мои вопросы, IRC-канал Cake или группа обсуждения Google объяснят решение точно и информативно.

Эта проблема

Во всяком случае, вернемся к реальной истории. Я влюбился в интеграцию CakePHP с библиотеками SimpleTest. С типом работы, которую я обычно делаю, юнит-тестирование трудно использовать успешно. То есть большинство приложений, над которыми я работаю, имеют очень простые компоненты, а не много сложных функций / методов. Я бы только проверял, работают ли они вообще или нет, а не работают ли они в самых разных ситуациях.

SimpleTestНапример, модульное тестирование простого списка новостей и подробной информации, вероятно, излишне. Конечно, вы можете проверить свои классы, просто создав их экземпляры, но это только так далеко. Мой новый метод предусматривает использование Scripttable Browser от SimpleTest для фактического сканирования веб-страниц и обеспечения отображения правильных данных. Таким образом, я могу перехватить все мои ошибки php, включая уведомления и предупреждения, убедиться, что отправляются правильные заголовки, и утверждать, что определенный текст появляется на странице. Модульное тестирование редко отлавливает плохо закодированный метод, который выдает уведомление PHP, а Scriptable Browser.

Итак, теперь, когда все знают, что Scripttable Browser от SimpleTest — величайшая вещь со времен xDebug, каков наилучший способ его реализации?

Решения

Вот базовый тестовый пример, который я использую в Cake:

<?php  
class categoriesWebTestCase extends CakeWebTestCase  
{  
    function testcategoriesviewCase()   
    {  
        $this->get("http://example.com/categories/add");  
        $this->assertResponse(200);  
    }  
}  
?> 

Объяснение : Это так просто, как только может. Здесь у меня есть короткий класс, который расширяет CakeWebTestCase — это необходимо. Каждый метод тестового класса считается тестовым и может иметь много тестов. В этом случае у меня только один контрольный пример с одним тестом. Метод get () браузера SimpleTest запрашивает страницу так же, как и любой другой браузер. Затем я утверждаю, что заголовок ответа был 200 или ОК. Метод assertResponse () считается тестом. Это гарантирует, что страница загружена правильно и не выбрасывает другие заголовки, такие как 404 — не найдено.

 

Давайте возьмем это на себя и убедимся, что на странице нет распространенных ошибок PHP:

    <?php  
    class categoriesWebTestCase extends CakeWebTestCase  
    {  
        function testcategoriesviewCase()   
        {  
            $this->get("http://example.org/categories/");  
            $this->assertResponse(200);  
            $this->assertNoText("Error:");  
        }  
    }  
    ?>  

Объяснение: То же, что и раньше, с дополнительным тестом. Это может быть очевидно, но метод assertNoText () гарантирует, что страница не содержит ни одной из этих строк. Это идеально подходит для перехвата ошибок PHP, ошибок тортов и всего, что может оказаться нежелательным на странице.

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

 

А как насчет страниц администратора или защищенных паролем? SimpleTest охватил вас:

    <?php  
    class categoriesWebTestCase extends CakeWebTestCase  
    {  
        function testcategoriesadmin_addCase()   
        {  
            $this->get("http://example.org/admin/categories/add");  
            $this->assertText("Login");  
            // Fill out the login form  
            $this->setField("data[User][username]", "admin");  
            $this->setField("data[User][password]", "password");  
            // Click Submit  
            $this->clickSubmit("Login");  
            // Now we should be in the admin area  
            $this->assertResponse(200);  
            $this->assertNoText("Error:");  
        }  
    }  
    ?>  

Объяснение: Опять же, методы SimpleTest очень умно названы, так что можно без труда определить их функцию. В этом случае мы пытаемся открыть страницу в защищенной паролем области. Первое, что мы делаем, это открываем страницу и утверждаем, что Cake правильно перенаправил нас на страницу входа. Я выполняю это, проверяя, чтобы текст «Логин» был на странице. Следующие две строки фактически заполняют поля формы входа авторизованным именем пользователя и паролем. clickSubmit () делает именно то, что вы думаете, он «кликает» на вводе типа submit со значением «Login». На этом этапе наша исходная страница должна загрузиться, так как Cake обычно перенаправляет вас туда, куда вы хотели в конечном итоге попасть. В завершение я выполнил еще несколько тестов, чтобы убедиться в отсутствии сообщений об ошибках. Это’Это так просто!

 

Но как насчет редактирования и просмотра страниц? Вам нужен идентификатор в URL для правильного доступа к странице. Как вы можете быть уверены, что ваши тесты всегда будут использовать существующий идентификатор? Вот где у меня больше всего проблем с SimpleTest, но я нашел эффективное решение:

    <?php  
    class categoriesWebTestCase extends CakeWebTestCase  
    {  
        function testcategoriesindexCase()   
        {  
            // First, open the index/list page  
            $this->get("http://example.com/categories/");  
            // Turn on OB to prevent printing data  
            ob_start();  
            $this->showSource();  
            $contents = ob_get_contents();  
            ob_end_clean();  
            // Grab any available ID's from links with the label Edit  
            $pattern = "/<a href=.*?([0-9]+)">Edit<\/a>/";  
            preg_match($pattern, $contents, $match);  
            if (!emptyempty($match[1])) {  
                // Restart the browser, and open the edit page  
                $this->restart();  
                $this->get("http://example.com/categories/edit/".$match[1]."");  
                $this->assertResponse(200);  
            }  
        }  
    }  
    ?>  

Объяснение: пара новых вещей здесь. Для того, чтобы открыть страницу редактирования / просмотра, мне нужен первичный ключ. Единственный способ убедиться, что идентификатор существует в базе данных, это очистить экран от фактических ключей. Итак, как вы получаете содержимое страницы? Метод showSource () выведет возвращенное содержимое на экран. Чтобы предотвратить это, я включаю буферизацию вывода, собираю содержимое и очищаю буфер. Как только у меня будет содержимое индекса или страницы списка, я смогу найти любые ссылки для добавления / редактирования страниц с соответствующими номерами ID. После использования регулярного выражения для соответствия определенному номеру идентификатора я могу открыть страницу редактирования. Однако перед этим я перезагружаю браузер, чтобы убрать все необычное и убедиться, что страница возвращает правильный заголовок.

Возможно, есть лучший способ сделать это (как правило, есть), но до сих пор это работало хорошо для меня.

Выполните тесты

Единственное, о чем я не упомянул, это как на самом деле запускать тесты. Это может быть важно …

Из пекарни

Прежде всего, вам нужно включить набор тестов для вашей установки CakePHP 1.2. После успешной установки и настройки CakePHP получите последнюю версию SimpleTest со своего веб-сайта и распакуйте ее либо в свой каталог cake / vendors, либо в каталог app / vendors . Теперь у вас должен быть каталог vendors / simpletest со всеми файлами и папками SimpleTest.

Убедитесь, что у вас есть хотя бы уровень DEBUG 1 в вашем файле app / config / core.php . Проверьте вашу установку, запустив любой из основных тестов CakePHP, указав в браузере http://www.example.com/test.php .

Кроме того, вам может понадобиться изменить путь включения к ядру торта внутри test.php. Как только вы откроете его в браузере, вы сможете запустить тесты вашего приложения.

Вывод

SimpleTest обладает множеством функциональных возможностей, вы можете узнать больше на их сайте http://simpletest.org/ . Я нашел их страницу документации и, в частности, раздел браузера со скриптами, которые были чрезвычайно полезны.

Дайте мне знать, если кто-нибудь найдет это полезным.