PHPunit - 错误

5

当PHPunit框架不希望发生的错误发生时,测试会停止,PHP会抛出错误,但是PHPunit不会记录它是一个错误。如何确保PHPunit将其记录为错误。


1
你能详细说明一下吗?你所说的错误是什么类型的?PHPUnit的预期输出是什么,实际输出又是什么? - janmoesen
据我所知,PHPunit具有断言、失败和错误。假设代码中存在语法错误,例如多余的逗号或缺少分号,这将导致某个测试无法运行,测试将停止,但PHPunit不会将其报告为错误,而是由php输出错误,但PHPunit没有记录此类错误的日志。是否有一种方法可以强制PHPunit记录诸如语法错误之类的内容,而不仅仅是物流代码断言? - Anthony
你能提供一个有说明性的测试用例吗?(认真的) - Gordon
如果我有一个用户类,并且在这个类中我有一个注册函数。我创建了一个测试用例,在其中注册了一个用户。如果原始用户类的语法有误,PHPunit将停止测试其他测试,并且PHP会抛出错误,而PHPunit不记录任何错误或失败。对于模糊之处,我深表歉意。 - Anthony
这是当我运行我的AllTests脚本时的输出(不包括实际的SQL查询)。PHPUnit 3.4.14,作者Sebastian Bergmann。................................mysqlNet :: write()错误:插入到表(title,titleSlug,description....)中的值(...,):表中有一个SQL语法错误;请检查与您的MySQL服务器版本相对应的手册以获取正确的语法使用方式,位于第1行附近的')'。 - Anthony
@Anthony:你确定 mysqlNet 类没有简单地 echo 出那个错误吗?这不是 PHP 语法错误,而是 SQL 语法错误。我认为你的类并没有简单地 trigger_error 或者 throw 任何东西,而是输出了错误然后退出。请确认一下。 - janmoesen
3个回答

5
免责声明,我是PHPUnit的新手,也在试图弄清楚发生错误时会发生什么。

来自PHPUnit文档

当被测试的代码包含PHP语法错误时,TextUI测试运行器可能会退出而不打印错误信息。标准测试套件加载器可以选择检查测试套件源文件中的PHP语法错误,但不能检查测试套件源文件包含的源文件。

还有这个选项:

--syntax-check           Try to check source files for syntax errors.

请查看我对原问题的最后一条评论。(默认情况下它是隐藏的。)似乎没有 PHP 语法错误,只是 SQL 语法错误。 - janmoesen
@janmoesen 我知道,但在评论中,OP也说:“假设代码中有语法错误。多了一个逗号或者缺少分号。这将导致某个测试无法运行,测试将停止,但PHPUnit不会将其报告为错误,而php将输出错误,但PHPUnit没有记录这个错误。” - Tim Lytle

0

OP所说的是语法或PHP错误会导致PHPUnit崩溃。 PHP致命错误会使PHP解释器崩溃(或者至少导致其停止),这意味着PHPUnit无法继续执行。

如果您真的想避免这种情况,可以在脚本中添加以下一些内容。此脚本假定脚本位于测试目录(./)中,并且代码树从../开始(类似于正常的ZendFramework 1设置)。不要使用此脚本进行代码覆盖率,它仅对最后一次运行的单元测试正确:

#!/bin/bash
   for i in $(find ../ -name "*.php"); do
        msg=`php -l $i`
        if [ "$?" != "0" ]; then
            echo $msg;
        fi
    done

   for i in $(find ./ -name "*Test.php"); do
     echo "Running Test: $i";

     phpunit $i
    done

HTH.


0

为避免 PHP 解释器遇到错误时崩溃操作系统,您需要使用常规的 PHP 错误捕获来捕获错误。

在提交到主开发流之前,应检查和测试自动化测试。

我捕获 PHPUnit 的输出(phpunit ... > PHPUnit.log),然后解析 PHPUnit 的状态(Success with Skipped/Incomplete、OK、FAILURE 等),如果找不到这些状态,则知道 PHPUnit 没有完成,发生了错误。由于我的 PHP 配置显示错误,因此错误的结果也已转储到终端。

出现错误时,我只需将此日志文件发送到开发团队或最后更改测试文件的人进行调查。如果脚本尝试决定发送电子邮件的根本原因/人员,则可能会产生复杂的电子邮件逻辑。通常,脚本会向我发送电子邮件以进行调查,并且开发团队会被 CC 到电子邮件中,以防我不在或无法立即进行调查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接