PHPUnit "No Tests Executed" 如果我启用测试字符串比较

PHPUnit "No Tests Executed" if I enable test string comparison

我有几个用 PHPUnit 编写的非常基本的测试,出于某种原因,当我启用其中一个断言时,我得到 "No Tests Executed."

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

我正在测试从 Soap 服务器返回的字符串,它是 "true" 或 "false."

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

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

我得到"No tests executed!"

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

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

我宁愿失败也不失败"No tests executed."

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

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

$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.

为什么我需要 "catch" 这个失败的断言? php单元不应该只报告测试失败吗?

我正在从 cli 执行 php这样的单元。

php单元--详细--调试--配置testSuite.xml

testSuite.xml 看起来像这样:

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

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

我确定我仍然遗漏了一些东西,但就目前而言,开箱即用的 php 单元并没有给我留下深刻的印象。我想它可行,但它似乎让我比我想要的更努力地工作,以便编写一些简单的测试和断言。

更新 2 所以我从 phpunit 得到了我最初期待的回复。现在失败报告为失败。我不确定我现在做的事情与以前有什么不同。现在我觉得我只是在用我自己毫无意义的胡言乱语把 Whosebug 搞得一团糟。感谢您的帮助。

最好使用非常具体的测试 - assertNotEquals('x', 'y') 而不是 assertFalse('x'=='y') - 必须思考关于一件事比必须将其也转化为不同的条件更好。

当我创建一个新测试 class 时,我倾向于进行一些健全性检查,以确保测试本身 运行,一些简单但明显失败的事情'assertTrue(false)'。如果那没有失败 - 那么就会发生一些非常错误的事情。我经常发现它与名字(甚至 upper/lower-case)相关。

为了调试正在发生的事情,我会尝试着手解决最简单、最小的问题,但不能达到您的预期。从那里调试它,或者让其他人看一下。 "other person" 同样可以是一个 Rubber Duck,你可以一步一步地与之交谈。

我想通了。正如我开始怀疑的那样,它与 PHPUnit 无关。这不可能只发生在我身上,这是 PHPUnit 的错。我正在用 PHPUnit 做任何了不起的事情。

问题是我进行的 curl 调用超时设置太短。超时设置为 10 秒,但我访问的服务时不时需要 2 分钟的等待时间(这是机器对机器的事情,所以没什么大不了的)。短超时被击中,PHPUnit 将报告未执行测试!