PHP SimpleTest框架可以配置为快速失败吗?

时间:2010-01-29 23:18:23

标签: php unit-testing simpletest

我是PHP SimpleTest框架的新手,我很惊讶地看到失败的断言不会停止测试方法。换句话说,这会在测试报告中导致两条失败消息:

function testFoo() {
    $this->assertTrue(true, 'first: %s');
    $this->assertTrue(false, 'second: %s');
    $this->assertTrue(false, 'third: %s');
}

我的大部分单元测试经验都是JUnitNUnit,一旦第一个断言失败,它们都会暂停测试方法。也许我已经习惯了,但似乎额外的失败信息只是噪音。它让我想起旧的C编译器因为缺少分号而会出现50个错误。

我可以将SimpleTest配置为快速失败,还是只需要使用不同的样式?

4 个答案:

答案 0 :(得分:5)

您可以扩展/修改Reporter类,以便在paintFail()之后退出() (不需要修改单元测试)

或者

assert *函数返回一个布尔值,例如:

 $this->assertTrue(false, 'second: %s') or return;

将结束当前的测试功能。

PS:
如果您使用的是PHPUnit_TestCase类而不是UnitTestCase,则assert *函数将不会返回布尔值。

答案 1 :(得分:3)

这并没有真正回答你的问题,但是对于它的价值,PHPUnit总是失败。

http://www.phpunit.de/manual/current/en/goals.html说:

  

...第一次测试失败,测试执行停止,PHPUnit报告失败。

答案 2 :(得分:1)

assert方法确实为pass或fail返回一个布尔值,因此你可以检查它并在出现故障时停止测试。

我不认为这可以扩展到项目中的每个测试,但是一些特别嘈杂的测试可能会从中受益。

这是一个简单的例子:

function testBar() {
    $pass = $this->assertTrue(true, 'first: %s');
    $pass = $pass && $this->assertTrue(false, 'second: %s');
    $pass = $pass && $this->assertTrue(false, 'third: %s');
}

您可以使用if语句来包装更大的代码块。

答案 3 :(得分:1)

我需要这个,因为我的所有测试都依赖于数据库正在运行。如果数据库关闭,我真的不关心有10,000个故障的屏幕。由于simpletest在失败时立即打印,而且只是php代码,您实际上可以使用简单的die语句停止测试。

以下是我的关键“我连接”测试的代码。

function testDatabaseAccess()
{
  $connected = TRUE;
  GLOBAL $clients;
  $connected &= $this->assertTrue(is_object($clients), 'Clients database not connected.');

  GLOBAL $practices;
  $connected &= $this->assertTrue(is_object($practices), 'Practices database not connected.');

  GLOBAL $user;
  $connected &= $this->assertTrue(is_array($user), 'User not defined.');

  GLOBAL $practice;
  $connected &= $this->assertTrue(is_object($practice), 'Practice database not connected.');

  if (!$connected)
  {
    die('Not Connected.');
  }
}

产生:

enter image description here

当然我没有得到摘要行,但对于我的用例,我不需要或想要我的摘要行。没有数据库,没有测试点。对于我的其余测试,我实际上喜欢它不会立即失败。我通常希望一次看到我所有的失败。