在运行时挂钩到PHPUnit整体测试状态

时间:2012-09-26 14:31:38

标签: php unit-testing phpunit

我有一个PHPUnit引导程序文件,它创建一个用于与DB相关的单元测试的测试数据库,并在测试完成后注册一个关闭函数来销毁数据库。每次运行都有一个新的数据库!

问题:当测试失败时,我想保留数据库以进行调试。目前,我必须手动禁用register_shutdown_function()电话,然后重新运行测试。

如果我可以访问PHPUnit运行的最终成功/失败状态,我可以根据PHPUnit引导程序文件中的开关动态触发数据库销毁过程。

PHPUnit将此信息存储在某处以触发正确的结果事件,即输出OK vs FAILURES!。但是,根据我发现的情况,此信息不会暴露给用户级引导程序文件。有没有做过这样的事情?

如果你想探索,这是从命令行运行PHPUnit时发生的PHPUnit的堆栈跟踪......

PHP   1. {main}() /usr/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46
PHP   3. PHPUnit_TextUI_Command->run() /usr/share/php/PHPUnit/TextUI/Command.php:130
PHP   4. PHPUnit_TextUI_Command->handleArguments() /usr/share/php/PHPUnit/TextUI/Command.php:139
PHP   5. PHPUnit_TextUI_Command->handleBootstrap() /usr/share/php/PHPUnit/TextUI/Command.php:620
PHP   6. PHPUnit_Util_Fileloader::checkAndLoad() /usr/share/php/PHPUnit/TextUI/Command.php:867
PHP   7. PHPUnit_Util_Fileloader::load() /usr/share/php/PHPUnit/Util/Fileloader.php:79
PHP   8. include_once() /usr/share/php/PHPUnit/Util/Fileloader.php:95
PHP   9. [YOUR PHPUNIT BOOTSTRAP RUNS HERE]

1 个答案:

答案 0 :(得分:5)

为了访问PHPUnit测试用例的状态,我通常建议使用:

请参阅文档:PHPUnit_Framework_TestListenerhow to add it to the xml config

小样本:

使用此

扩展XML文件
<listeners>
 <listener class="DbSetupListener" file="/optional/path/to/DbSetupListener.php"/>
</listeners>

示例监听器

<?php
class DbSetupListener implements PHPUnit_Framework_TestListener {
    private $setupHappend = false;

    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) {
        $this->error = true;
    }

    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) {
        $this->error = true;
    }

    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { }
    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { }
    public function startTest(PHPUnit_Framework_Test $test) { }
    public function endTest(PHPUnit_Framework_Test $test, $time) { }

    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
    {
        if(!$this->setupHappend) { 
            $this->setupDatabase();
            $this->setupHappend = true;
        }
    }

    public function endTestSuite(PHPUnit_Framework_TestSuite $suite) {
        // If you have multiple test suites this is the wrong place to do anything
    }

    public function __destruct() {
        if($this->error) {
            // Something bad happend. Debug dump or whatever
        } else {
            // Teardown
        }
    }

}

这应该让你相当容易。如果您只需“倾听”特定的teststestsuites,那么您可以使用startTeststartTestSuite的参数。

两个对象都有getName()方法,分别为您提供测试套件和测试用例的名称。