我有很多没有单元测试的遗留代码。在大多数情况下,它们是具有自动加载类的独立脚本,通过直接执行每个.php文件来运行。
我想有一些方法可以自动运行这些脚本,检查它们是否运行完整而没有错误。这不仅会检测错误的新代码,还会自动查找哪些脚本正在运行时出错(而不是尝试解析错误日志)。
我看到了php_check_syntax
,但已弃用。它似乎比php -l
更好,因为它不只是lint - 它执行脚本,并且似乎将运行时错误捕获到一个可以读取的变量。这看起来就像我想做的那样。
是否有php_check_syntax
的替代品可以帮助我实现这一目标?
答案 0 :(得分:1)
也许创建一个使用try
和catch
(和finally
)块的包装器会起作用。
答案 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);
}