PHP:确保遗留脚本运行没有错误,替换`php_check_syntax`

时间:2016-06-14 16:35:36

标签: php automated-tests end-to-end

我有很多没有单元测试的遗留代码。在大多数情况下,它们是具有自动加载类的独立脚本,通过直接执行每个.php文件来运行。

我想有一些方法可以自动运行这些脚本,检查它们是否运行完整而没有错误。这不仅会检测错误的新代码,还会自动查找哪些脚本正在运行时出错(而不是尝试解析错误日志)。

我看到了php_check_syntax,但已弃用。它似乎比php -l更好,因为它不只是lint - 它执行脚本,并且似乎将运行时错误捕获到一个可以读取的变量。这看起来就像我想做的那样。

是否有php_check_syntax的替代品可以帮助我实现这一目标?

2 个答案:

答案 0 :(得分:1)

也许创建一个使用trycatch(和finally)块的包装器会起作用。

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

答案 1 :(得分: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);
}