【问题标题】:Can PHP SimpleTest framework be configured to fail fast?可以将 PHP SimpleTest 框架配置为快速失败吗?
【发布时间】:2011-01-11 01:48:48
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php unit-testing simpletest


    【解决方案1】:

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

    或者

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

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

    将结束当前的测试功能。

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

    【讨论】:

      【解决方案2】:

      这并不能真正回答您的问题,但就其价值而言,PHPUnit 总是很快失败。

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

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

      【讨论】:

      • 我并没有真正选择 SimpleTest,它只是集成了 CakePHP。到目前为止,还不足以让我查看 PHPUnit。
      【解决方案3】:

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

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

      这是一个简单的例子:

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

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

      【讨论】:

        【解决方案4】:

        我需要这个,因为我所有的测试都依赖于正在运行的数据库。如果数据库出现故障,我并不真正关心有 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.');
          }
        }
        

        产生:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-06
          • 2010-09-15
          • 2013-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-21
          相关资源
          最近更新 更多