Тестирование PHP, для процедурного кода - PullRequest
23 голосов
/ 16 февраля 2011

Есть ли способ тестирования процедурного кода? Я смотрел на PHPUnit, который кажется отличным способом создания автоматизированных тестов. Однако он, похоже, ориентирован на объектно-ориентированный код, есть ли альтернативы для процедурного кода?

Или я должен преобразовать сайт в объектно-ориентированный, прежде чем пытаться проверить сайт? Это может занять некоторое время, что является небольшой проблемой, так как у меня не так много времени, чтобы тратить.

Спасибо

Daniel.

1 Ответ

34 голосов
/ 16 февраля 2011

Вы можете протестировать процедурный код с помощью PHPUnit.Модульные тесты не привязаны к объектно-ориентированному программированию. Они проверяют единицы кода .В ОО единица кода является методом.В процедурном PHP я предполагаю, что это целый скрипт (файл).

Хотя OO-код проще поддерживать и тестировать, это не означает, что процедурный PHP не может быть протестирован.

За пример, у вас есть этот скрипт:

simple_add.php

$arg1 = $_GET['arg1'];
$arg2 = $_GET['arg2'];
$return = (int)$arg1 + (int)$arg2;
echo $return;

Вы можете проверить это так:

class testSimple_add extends PHPUnit_Framework_TestCase {

    private function _execute(array $params = array()) {
        $_GET = $params;
        ob_start();
        include 'simple_add.php';
        return ob_get_clean();
    }

    public function testSomething() {
        $args = array('arg1'=>30, 'arg2'=>12);
        $this->assertEquals(42, $this->_execute($args)); // passes

        $args = array('arg1'=>-30, 'arg2'=>40);
        $this->assertEquals(10, $this->_execute($args)); // passes

        $args = array('arg1'=>-30);
        $this->assertEquals(10, $this->_execute($args)); // fails
    }

}

Для этого примераЯ объявил метод _execute, который принимает массив параметров GET, захватывает выходные данные и возвращает их вместо включения и захвата снова и снова.Затем я сравниваю выходные данные, используя обычные методы утверждений из PHPUnit.

Конечно, третье утверждение не будет выполнено (хотя и зависит от error_reporting), поскольку протестированный скрипт выдаст ошибку Undefined index ,

Конечно, при тестировании вы должны поместить error_reporting в E_ALL | E_STRICT.

...