PHP

Создаём Unit тесты при помощи Zend_Test_PHPUnit_ControllerTestCase

В этом уроке я покажу вам как создавать тесты на примере приложения TodoIt.

Настройка PHPUnit
Всё, что вам надо так это папка /tests. Инструмент ZF cli создаст файл phpunit.xml, но он будет пустым! Вот, что нужно туда добавить:
<phpunit colors="true" bootstrap="./TestHelper.php">
    <testsuite name="TodoIt Test Suite">
        <directory>./</directory>
    </testsuite>
 
    <filter>
        <whitelist>
            <directory suffix=".php">../library/</directory>
            <directory suffix=".php">../application/</directory>
            <exclude>
                <directory suffix=".phtml">../application/</directory>
            </exclude>
        </whitelist>
    </filter>
 
    <logging>
        <log highlowerbound="80" lowupperbound="50" highlight="true" yui="true" charset="UTF-8" target="./log/report" type="coverage-html"></log>
    </logging>
  
</phpunit>

Этот файл используется для конфигурации phpunit. Поскольку это XML, то его очень просто прочитать. Так же нам надо создать TestHelper.php, который будет использоваться как bootstrap. В общем, содержание данного файла очень схоже с index.php. TestHelper.php выглядит следующим образом:
<?php
 
error_reporting(E_ALL | E_STRICT);
date_default_timezone_set('Europe/London');
 
define('APPLICATION_ENV', 'unittesting');
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
 
$root = realpath(dirname(__FILE__) . '/../');
$library = $root . '/library';
$models = $root . '/application/models';
 
$path = array(
    $library,
    $models,
    get_include_path()
);
set_include_path(implode(PATH_SEPARATOR, $path));
 
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
 
// чистим за собой
unset($root, $library, $models, $path);

Теперь мы готовы к написанию тестов.

Класс тестов
Расположите тесты в каталоге tests/application/controllers для того, чтобы быстро их найти. (Тесты для моделей в tests/application/models и т.д.). Начнём с тестирования AuthController::indexAction(). В первую очередь проверим наличие формы.

Сам AuthControllerTest будет находиться в tests/application/controllers/AuthControllerTest.php:
<?php
 
if (!defined("PHPUnit_MAIN_METHOD")) {
    define("PHPUnit_MAIN_METHOD", "AuthControllerTest::main");
}
 
require_once 'PHPUnit/Framework/TestCase.php';
 
/**
 * @group Controllers
 */
class AuthControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public static function main()
    {
        $suite  = new PHPUnit_Framework_TestSuite(get_class($this));
        $result = PHPUnit_TextUI_TestRunner::run($suite);
    }
     
    public function setUp()
    {
        $application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
 
        $this->bootstrap = $application;
        return parent::setUp();
    }
 
    public function tearDown()
    {
        /* Tear Down Routine */
    }
 
    public function testLoginDisplaysAForm()
    {
        $this->dispatch('/auth/index');
        $this->assertQueryContentContains('h1', 'Login');
        $this->assertQuery('form#login'); // id of form
    }
}

В первую очередь мы должны убедиться в том, что можем запускать PHPUnit тесты из командной строки:

phpunit tests\application\controllers\AuthControllerTest.php

Мы можем это делать благодаря константе PHPUnit_MAIN_METHOD статического метода AuthControllerTest::main(). Инструмент phpunit cli запустит метод, который активирует тесты.

Методы setUp() и tearDown() запускаются до и после теста. Так как мы наследуем от Zend_Test_PHPUnit_ControllerTestCase то можем использовать специальные методы. Их мы используем в setUp().

Каждый тест должен начинаться с ключевого слова test:
public function testLoginDisplaysAForm()
{
    $this->dispatch('/auth/index');
    $this->assertResponseCode(200);
    $this->assertQueryContentContains('h1', 'Login');
    $this->assertQuery('form#login'); // id формы
}

Начнём мы с вывода dispatch(). Метод assertQuery предназначен для проверки того, что находится в объекте response. Он использует DOM пути для того, чтобы достучаться до элемента. Вызов assertQueryContentContains позволяет нам установить присутствует текст с тегом H1 на странице или нет.

Теперь вы знаете как тестировать ваши приложения.
Теги:
Unit тесты, Zend_Test_PHPUnit_ControllerTestCase
Добавлено: 16 Мая 2018 09:07:32 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...