为什么在PHPUnit中,特定的断言比通用的断言更好?

9

请原谅我的无知; 我还是新手单元测试领域。

有人能够解释一下为什么..

$this->assertGreaterThan( 2, $result );

..比..

$this->assertTrue( $result > 2 );

..更好(以及其他所有特定的assert方法)吗?

谢谢!

3个回答

17

如果你向你的妈妈/爸爸/叔叔展示这些内容,assertGreaterThan 更直观易懂。此外,isGreaterThan 的失败信息也会更好。

"1 was not greater than 2"
或者
"false was not true"

哪一个更具表现力


1
谢谢Martin。还有,我应该补充一下我的一个朋友提到的:“这些库是可扩展的,所以如果出于某种原因,你想让所有GreaterThan检查都做一些特殊的事情,那只需要扩展并定义自己的例程。” - Spot

3

实际上,最好的方法可以提供更好的可读性和更好的错误消息:使用PHPUnit函数为基础的断言Hamcrest库

assertThat(count($users), greaterThan(2));

>> Expected: greater than 2
>>      but: was 1

或者

assertThat($users, arrayWithSize(greaterThan(2)));

>> Expected: array with size greater than 2
>>      but: was array with size 1

通过将字符串作为断言方法的第一个参数或Hamcrest的assertThat函数的参数,或PHPUnit的assertThat函数的第三个参数,您可以始终提供可读的错误消息:

self::assertTrue('At least one user found', !empty($users));

>> At least one user found
>> Expected: true
>>      but: false

或者

assertThat('At least one user found', !empty($users), is(true));

>> At least one user found
>> Expected: true
>>      but: false

Hamcrest看起来非常不错。我一定会认真研究它。根据您的经验,Hamcrest是否会影响PHPUnit扩展?谢谢。 - Spot
@Spot - 我们已经一起使用了两年多,没有出现任何问题。为了让PHPUnit计算执行的断言数量,您需要使用一个自定义测试用例,它重写了runBare方法。如果您已经有自己的抽象测试用例,就像我们一样,那么添加这个功能是微不足道的。 - David Harkness

0
比...更好吗?谁这么说的?两者都一样好。可读性在两种情况下是不同的,但都不是特别好的。您可以通过提取一些变量来进一步改善它:
$minimumValue = 2;
$this->assertGreaterThan($minimumValue, $result);

而且

$resultGreaterThanMinimumValue = $result > 2;
$this->assertTrue($resultGreaterThanMinimumValue);

这仍然不是理想的(因为这些断言在英语中读起来不像句子),但这两种方法都没有更好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接