Решение проблем пути с PHPUnit
Я только начал использовать PHPUnit, но я столкнулся с небольшой проблемой.
мой код использует $_SERVER ['DOCUMENT_ROOT'] для вычисления путей для includes, который работает, когда мой сервер apache работает на PHP, но DOCUMENT_ROOT не установлен, когда я запускаю phpunit из командной строки с помощью "PHPUnit Tests", поэтому они не работают.
Я что-то пропустил в конфигурации PHPUnit? Должен ли он каким-то образом интегрироваться с apache?
4 ответов
поздний ответ, К сожалению.
Нет, ты ничего не теряешь. PHP CLI (PHP для командной строки) - это другой зверь, чем PHP в качестве модуля Apache / CGI.
что вы могли бы сделать, хотя это изменить setUp() файлы для установки $_SERVER['DOCUMENT_ROOT'] к чему вам нужно (с $_SERVER по-прежнему доступен как суперглобальный даже в контексте CLI), например:
public function setUp() {
$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/../application";
}
просто будьте осторожны, вы, вероятно, хотите поместить это в свой tearDown():
public function tearDown() {
unset($_SERVER['DOCUMENT_ROOT']);
}
PHPUnit поддерживает ваше глобальное состояние если вы используете глобальные (также суперглобальные) данные вообще, что может значительно замедлить ваши тесты, поэтому лучше избегать их после выполнения теста.
$_SERVER['DOCUMENT_ROOT'] также можно установить в файле начальной загрузки и то же самое Bootstrap_test.php присоединяется к файлу конфигурации phpunit phpunit.xml С именем атрибута bootstrap=Bootstrap_test.php
мне удалось выполнить требование установить $_SERVER ['DOCUMENT_ROOT'] для конфигурации задания Дженкинса. В "Bootstrap_test.РНР" выглядит как
<phpunit
backupGlobals="false"
backupStaticAttributes="false"
strict="true"
verbose="true"
bootstrap="Bootstrap_test.php">
<testsuites>
<testsuite name="PHPUnit Test Suite">
<file>PHPUnitTest.php</file>
</testsuite>
</testsuites>
<logging>
<log type="coverage-clover" target="logs/clover.xml"/>
</logging>
</phpunit>
и содержание в Bootstrap.php объявляется с помощью define() функция:
define('BASE_PATH', realpath(dirname(__FILE__)));
$_SERVER['DOCUMENT_ROOT'] = BASE_PATH;
на BASE_PATH переменной, как правило, держат полный путь к каталогу заданий Дженкинса. Скажем, Дженкинса зовут Test_Job. Каталог, в котором Дженкинс разместит исходный код проекта, -/var/lib/jenkins/jobs/Test_Job/workspace (предполагая, что рабочий каталог Дженкинса как /var/lib/jenkins).
Если Bootstrap_test.php размещен в базовом каталоге,BASE_PATH проведет /var/lib/jenkins/jobs/Test_Job/workspace и наконец $_SERVER['DOCUMENT_ROOT'].
лучшим способом было бы отделить ваш код от использования $_SERVER или любой другой глобальный массив. Например сделать
class MyClass
{
protected $_docroot;
public function __construct($docroot)
{
$this->_docroot = $docroot;
}
public function getDocRoot()
{
return $this->_docroot;
}
}
вместо
class MyClass
{
public function getDocRoot()
{
return $_SERVER['DOCUMENT_ROOT'];
}
}
Это позволяет сделать
// in your actual code
$instance = new MyClass($_SERVER['DOCUMENT_ROOT']);
$docroot = $instance->getDocRoot();
// in your test
$instance = new MyClass($variable_holding_the_correct_path);
$docroot = $instance->getDocRoot();
имейте в виду, что это всего лишь простой пример развязки. Это может быть намного сложнее в вашем случае , но в целом это стоит усилий, особенно если вы выполняете модульные тесты.
просто хочу документ вызов других файлов php (например config.php) изнутри тестов PHPUnit.
У меня есть тестовый класс:
class xyzTest extends TestCase {
public static function setUpBeforeClass() {
require_once __DIR__ . '/../../app/config/Config.php';
}
...
на config.php Я установил некоторые константы, например пути к файлам. Эти пути относительно $_SERVER['DOCUMENT_ROOT'].
Я хочу проверить мой xyz класс, использующий эти константы пути.
Однако $_SERVER superglobal пуст, при вызове PHPUnit из командной строки. Я попытался следовать хорошему совету от ответ выше и выберите $_SERVER['DOCUMENT_ROOT'] В PHPUnits setUp методы. Это не исправило мою проблему.
я исправил это путем добавления if заявление в мой Config.php, например:
if ($_SERVER['DOCUMENT_ROOT']) {
$DocumentRoot = realpath($_SERVER['DOCUMENT_ROOT']);
} else {
$DocumentRoot = realpath(dirname(__FILE__) . '/../..'); //for PHPUnit
}
надеюсь, это избавит кого-то от головной боли.