如果我启用测试字符串比较,则 PHPUnit“未执行任何测试”


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

我有几个用PHPUnit编写的非常基本的测试,由于某种原因,当我启用其中一个断言时,我得到"未执行任何测试"。

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

我正在测试从 Soap 服务器返回的字符串,它是"真"或"假"。

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

$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。感谢您的帮助。

使用一个非常具体的测试 - assertNotEquals('x', 'y') 而不是 assertFalse('x'=='y') - 必须考虑一件事比必须将其转换为不同的条件要好。

当我创建一个新的测试类时,我倾向于进行一些健全性检查,以确保测试本身正在运行,就像"assertTrue(false)"这样简单且明显失败的事情。如果这没有失败 - 那么就会发生一些非常错误的事情。我经常发现它与名称(甚至大写/小写)相关。

为了调试正在发生的事情,我会尝试尽可能简单,最小,这不会达到您的期望。从那里调试它,或者让其他人看看。"另一个人"同样可以是一只橡皮鸭,你一步一步地谈论它。

我想

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

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