我正在尝试自动化我的测试。作为一个冒烟测试,我想在继续实际的单元测试之前用phpmd检查我的php代码。听起来很明智对吧?
问题是,当我的php文件中出现致命错误时,phpmd似乎会崩溃。对于一个测试,我在函数定义中添加了一个额外的荣誉,比如:

function foo() {{
    // Stuff
}

如果我需要一个1退出代码,phpmd似乎完全崩溃,而是返回一个0退出代码。使我的自动脚本无用。是否有方法抑制这些错误并返回预期的退出代码?对于phpunit,--process-isolation选项解决了这个问题,但是对于phpmd,我似乎找不到这样的选项。
相关自动测试代码
#!/usr/bin/php
<?php

    exec('meta/phpmd', $output, $returnCode);
    if ($returnCode == 1) {
        echo '[Fail] PHP code is breaking', PHP_EOL;
        exit(1);
    } elseif ($returnCode == 2) {
        echo '[Warn] PHP code is unclean', PHP_EOL;
    } else {
        echo '[OK] Code is clean! ', PHP_EOL;
    }

最佳答案

作为一种解决方法(以及可能的解决方案),可以在将语法传递给phpmd之前检查语法。我将测试代码更改为:

#!/usr/bin/php
<?php

$dir_root = dirname(dirname(__DIR__));
$dir_php  = $dir_root . DIRECTORY_SEPARATOR . 'api' . DIRECTORY_SEPARATOR . 'App';

exec('find ' . $dir_php . ' -iname *.php | xargs -n1 php -l 2>/dev/null', $output, $returnCode);
if ($returnCode != 0) {
    echo '[Fail] PHP contains syntax errors', PHP_EOL,
         implode(PHP_EOL, $output), PHP_EOL;
    exit($returnCode);
}

exec('meta/phpmd', $output, $returnCode);
if ($returnCode == 1) {
    echo '[Fail] PHP code is breaking', PHP_EOL;
    exit(1);
} elseif ($returnCode == 2) {
    echo '[Warn] PHP code is unclean', PHP_EOL;
}

将质量php -l代码归功于reddit的winglian
https://www.reddit.com/r/PHP/comments/2t7mvc/lint_an_entire_directory_of_php_files_in_parallel/

10-02 10:22