11

我有一个 PHP 部署脚本,我想先运行 PHPUnit 测试,如果测试失败则停止。我已经在谷歌上搜索了很多,很难找到关于从 php 运行单元测试的文档,而不是从命令行工具。

对于最新版本的 PHPUnit,您可以执行以下操作:

$unit_tests = new PHPUnit('my_tests_dir');
$passed = $unit_tests->run();

最好是不需要我手动指定每个测试套件的解决方案。

4

5 回答 5

8

弄清楚了:

$phpunit = new PHPUnit_TextUI_TestRunner;

try {
    $test_results = $phpunit->dorun($phpunit->getTest(__DIR__, '', 'Test.php'));
} catch (PHPUnit_Framework_Exception $e) {
    print $e->getMessage() . "\n";
    die ("Unit tests failed.");
}
于 2013-03-14T05:13:02.603 回答
6

最简单的方法是实例化 PHPUnit_TextUI_Command 类的对象。

所以这里有一个例子:

require '/usr/share/php/PHPUnit/Autoload.php';

function dummy($input)
{
   return '';
}

//Prevent PHPUnit from outputing anything
ob_start('dummy');

//Run PHPUnit and log results to results.xml in junit format
$command = new PHPUnit_TextUI_Command;
$command->run(array('phpunit', '--log-junit', 'results.xml', 'PHPUnitTest.php'),
              true);

ob_end_clean();

这样,结果将以可以解析的 junit 格式记录在 results.xml 文件中。如果您需要不同的格式,您可以查看文档。您还可以通过更改传递给 run 方法的数组来添加更多选项。

于 2013-03-09T15:08:33.193 回答
2

使用 PHPUnit 7.5:

use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\TestSuite;

$test = new TestSuite();
$test->addTestSuite(MyTest::class);
$result = $test->run();

$result 对象包含很多有用的数据:

$result->errors()
$result->failures
$result->wasSuccessful()

ETC...

于 2019-03-22T11:00:01.173 回答
1

PHP7 & phpunit ^7 解决方案

use PHPUnit\TextUI\Command;

$command = new Command();
$command->run(['phpunit', 'tests']);

与 CLI 命令的效果相同:

vendor/bin/phpunit --bootstrap vendor/autoload.php tests
于 2020-02-19T20:59:16.210 回答
0

PHPUnit 似乎没有任何内置配置来防止它直接将其输出转储到响应中(至少从 PHPUnit 5.7 开始没有)。

所以,我曾经ob_start将输出分流到一个变量,并设置第三个参数doRuntofalse以防止 PHPUnit 停止脚本:

<?php

$suite = new PHPUnit_Framework_TestSuite();
$suite->addTestSuite('App\Tests\DatabaseTests');

// Shunt output of PHPUnit to a variable
ob_start();
$runner = new PHPUnit_TextUI_TestRunner;
$runner->doRun($suite, [], false);
$result = ob_get_clean();

// Print the output of PHPUnit wherever you want
print_r($result);
于 2017-10-20T01:22:38.700 回答