2

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

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

我的大部分单元测试经验都是使用JUnitNUnit,一旦第一个断言失败,它们都会停止测试方法。也许我只是习惯了,但似乎额外的失败消息只是噪音。它让我想起了旧的 C 编译器,由于缺少分号,会产生 50 个错误。

我可以将 SimpleTest 配置为快速失败,还是我只需要采用不同的风格?

4

4 回答 4

5

您可以扩展/修改 Reporter 类,使其在paintFail() 之后退出()。
(无需修改单元测试)

或者

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

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

将结束当前的测试功能。

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

于 2010-01-30T15:15:34.383 回答
3

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

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

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

于 2010-01-30T00:45:40.277 回答
1

assert 方法确实返回一个布尔值来表示通过或失败,因此您可以检查它并在失败时停止测试。

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

这是一个简单的例子:

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

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

于 2010-01-29T23:20:05.853 回答
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.');
  }
}

产生:

在此处输入图像描述

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

于 2016-09-02T18:38:36.893 回答