如果启用测试字符串比较,PHPUnit“No Tests Executed”

时间:2015-01-26 15:07:41

标签: php unit-testing phpunit

我有几个用PHPUnit编写的基本测试,出于某些原因,当我启用其中一个断言时,我得到“No Tests Executed。”

我不是一个熟练的单元测试人员,所以显然我做错了,但我很难找到解决方案。

我正在测试从Soap服务器返回的字符串,它是“true”还是“false”。

在我的单元测试中,如果我写这个

$hasErrors = 'false';
$this->assertTrue('true' == $hasErrors);

我得到“没有执行测试!”

如果我执行以下操作 - 我知道它不是相同的测试但它是成功的并且PHPUnit报告它是成功的 - 我只是好奇为什么这个运行测试,而之前的不只是显示失败但说不会执行任何测试。

$hasErrors = 'false';
$this->assertFalse('true' == $hasErrors);

我希望失败而不是说“没有执行测试。”

如果我使用assertNotEquals而不是assertFalse,也会发生同样的事情。

更多信息。在处理文本字符串“true”时,我可能偶然发现了一个phpunit错误。我认为php单元希望将其视为布尔值而不是字符串。所以我做了一些代码更改以使用布尔值。

$result = $xmlresponse->xpath('//result');
$hasErrors = (string) $result[0]->hasErrors;
if ($hasErrors == 'true') {
    $errors = TRUE;
} else {
    $errors = FALSE;
}
$this->assertFalse($errors);

现在我明白了。

PHP Fatal error:  Uncaught Failed asserting that true is false.

为什么我需要“捕获”这个失败的断言?不应该只是phpunit报告测试失败了吗?

我正在从cli执行这样的phpunit。

phpunit --verbose --debug --configuration testSuite.xml

testSuite.xml如下所示:

<phpunit>
  <testsuites>
    <testsuite name="connector">
      <file>TestNewAccount.class.php</file> 
      <file>TestModifyAccount.class.php</file>  
    </testsuite>
  </testsuites>
</phpunit> 

更新 所以我想我对PHPunit开箱即用的期望是无效的。我预计phpunit会运行测试,报告成功和失败,就是这样。但显然它报告了成功,并在断言失败时抛出了致命的例外。我不明白为什么它如此沉重的失败以及为什么它不会简单地报告失败而不必在我的测试中捕获异常并自己处理它。

我确信我仍然缺少一些东西,但就目前而言,我并没有对开箱即用的phpunit印象深刻。我想它可行,但它似乎让我比我想要的更努力,以便编写一些简单的测试和断言。

更新2 所以我得到了我原本期待的phpunit的回复。现在失败报告为失败。我现在不确定我现在做的与以前不同。现在我觉得我只是用我自己无谓的漫无边际的混乱Stackoverflow。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

使用非常具体的测试是好的做法 - assertNotEquals(&#39; x&#39;,&#39; y&#39;)而不是assertFalse(&#39; x&#39; = =&#39; y&#39;) - 不得不考虑一件事比将其转化为不同的条件更好。

当我创建一个新的测试类时,我倾向于进行一些健全性检查,以确保测试本身正在运行,这很简单,显然是失败的,因为&#39; assertTrue(false)&# 39 ;.如果这不会失败 - 那么就会发生一些非常错误的事情。我经常发现它与名字(甚至大/小写)相关。

为了调试正在发生的事情,我试着尽可能地做到最简单,尽可能小的事情。从那里调试它,或让其他人看一看。 &#34;其他人&#34;同样可以是Rubber Duck,你可以逐步说出来。

答案 1 :(得分:0)

我想出来了。我开始怀疑它与PHPUnit无关。这不仅仅发生在我身上,而且是PHPUnit的错。我用PHPUnit做了很多非凡的事情。

问题是我正在进行太短的超时设置的curl调用。超时设置为10秒,但是我所需要的服务需要2分钟的等待时间(这是机器到机器之类的东西,所以不是很大)。短暂超时被击中,PHPUnit将报告No Tests Executed!