phpunit запускает тест дважды - получает два ответа. Почему?

Это мой тестовый файл phpunit

<?php // DemoTest - test to prove the point

function __autoload($className) {
    //  pick file up from current directory
    $f = $className.'.php'; 
    require_once $f;
}

class DemoTest extends PHPUnit_Framework_TestCase {
    // call same test twice - det different results 
    function test01() {
        $this->controller = new demo();
        ob_start();
        $this->controller->handleit();
        $result = ob_get_clean();  
        $expect = 'Actions is an array';
        $this->assertEquals($expect,$result);
    }

    function test02() {
        $this->test01();
    }
}
?>

Это тестируемый файл

<?php // demo.php
global $actions;
$actions=array('one','two','three');
class demo {
    function handleit() {
        global $actions;
        if (is_null($actions)) {
            print "Actions is null";
        } else {
            print('Actions is an array');
        }
    }
}
?>

В результате второй тест завершается неудачно, потому что $actions имеет значение null.

Мой вопрос: почему я не получаю одинаковые результаты для двух тестов?

Это ошибка в phpunit или я так понимаю php?


person Ian    schedule 07.10.2010    source источник


Ответы (1)


PHPUnit имеет функцию под названием «backup globals», если она включена, то в начале теста выполняется резервное копирование всех переменных в глобальной области видимости (делается снимок текущих значений) и после завершения каждого теста значения будут восстановлены снова к исходным значениям. Подробнее об этом можно прочитать здесь: http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html#content

Теперь давайте посмотрим на ваш набор тестов.

  1. test01 готов
  2. делается резервная копия всех глобальных переменных (на данный момент $actions в глобальной области видимости не заданы, т.к. код еще не запускался)
  3. test01 работает
  4. demo.php включен (благодаря автозагрузке), а $actions установлен в глобальном масштабе
  5. ваше утверждение успешно, потому что $actions установлен в глобальной области видимости
  6. test01 снесен. глобальные переменные возвращаются к своим исходным значениям. $actions в глобальном масштабе уничтожается в этот момент, потому что он был установлен внутри теста и не был частью глобального состояния перед началом теста.
  7. test02 запускается .. и завершается с ошибкой, потому что в глобальной области действия нет $actions.

Прямое решение вашей проблемы: включите demo.php в начало DemoTest.php, таким образом, $actions попадут в глобальную область видимости, для которой выполняется резервное копирование и восстановление до и после каждого теста.

Долгосрочное исправление: старайтесь избегать использования глобальных переменных. Это просто плохая привычка, и всегда есть лучшие решения, чем глобальное состояние с использованием «глобального».

person Anti Veeranna    schedule 10.10.2010