автоматизированные тесты — PHP: убедитесь, что унаследованные скрипты работают без ошибок, замена на `php_check_syntax`

У меня много устаревшего кода, в котором нет модульных тестов. По большей части они представляют собой автономные сценарии с автоматически загружаемыми классами, запускаемые путем непосредственного выполнения каждого отдельного файла .php.

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

Я видел php_check_syntax но это устарело. Кажется предпочтительнее php -l потому что он не просто задерживается — он выполняет сценарии и, похоже, фиксирует ошибки времени выполнения в переменной, которую затем можно прочитать. И это похоже на то, что я хотел бы сделать.

Есть ли замена для php_check_syntax что поможет мне достичь этого?

1

Решение

Возможно создание оболочки, которая использует try а также catch (а также finally) блоки будут работать.

http://php.net/manual/en/language.exceptions.php

1

Другие решения

Я принял ответ Рафаэля. Это был правильный путь по этому поводу. Я выкладываю полный сценарий, созданный из него здесь.

Он запускается из командной строки с помощью:

php scripttest.php "http://example.com/?param1=test" и выйдет с кодом 9 при любых ошибках. Он подберет ошибки разбора, используя php -l команда, а также исключения, использующие блок Try Catch. Он не обнаружит, если скрипт завершится рано. Это должно быть обнаружено путем проверки пустого вывода.

<?php

$url = $argv[1];
$parsed_url = parse_url($url);

if(!$url || $parsed_url == false){
echo "Provided url is empty or malformed.";
exit(9);
}

$docroot = "/Library/WebServer/Webs";
if    ($parsed_url['scheme'] == "https") $docroot .= "/example.com-https";
elseif($parsed_url['scheme'] == "http")  $docroot .= "/example.com";
else{
echo "Couldn't detect protocol.";
exit(9);
}

$filepath = $docroot.$parsed_url['path'];
if(is_dir($filepath)) $filepath .= 'index.php';

if(!file_exists($filepath)){
echo "Filepath doesn't exist.";
exit(9);
}

/**
* lint
*/
$success_str = "No syntax errors detected";
$output      = array();
exec("php -l $filepath", $output);

if(!$output){
echo "linting exec produced no output.";
exit(9);
}
$success = (substr($output[0], 0, strlen($success_str)) === $success_str);
if(!$success){
echo join("\n", $output);
exit(9);
}/**
* run-time check
*/
$_REQUEST = parse_str ($parsed_url['query']);

try{

$finished      = false;
$has_exception = false;
$exception     = '';

ob_start();        // buffer all output
require $filepath; // execute script
ob_end_clean();    // wipe buffer

$finished      = true;

}catch(Exception $e){

$has_exception = true;
$exception     = $e->getMessage();
}

if($finished && !$has_exception){
echo "SUCCESS";
exit(0);
}else{
echo "Failed with exception $exception";
exit(9);
}
1

По вопросам рекламы [email protected]