为什么单元测试系统包含无用的断言方法?

时间:2012-02-15 23:17:34

标签: unit-testing tdd build-automation

我想知道为什么像PHPUnit include what seems to be repetitive operators这样的单元测试系统只会增加单元测试的开销。我可以理解其中的几种方法,但大多数似乎都浪费时间。

public function testPop(array stack)
{
    this->assertEquals('foo', array_pop(stack));
    this->assertEmpty(stack);
}

vs原始代码(更短更快)

public function testPop(array stack)
{
    this->assert('foo' == array_pop(stack));
    this->assert(empty(stack));
}

这些方法是否适用于那些不了解其编程语言的人仍然可以编写单元测试?我相信这个项目的作者比我自己聪明,所以必须有一个理由。

3 个答案:

答案 0 :(得分:6)

这些函数通常会提供更有用的输出。例如,assertEquals测试可以告诉您预期值和实际值,并且它们不相等。

例如,以下代码:

this->assertEquals(1, 0);

将产生此输出:

Failed asserting that 0 matches expected 1.

答案 1 :(得分:2)

这也是关于冗长的问题。这样:

this->assert(foo == array_pop(stack));

比...更简洁:

this->assertEqual(foo, array_pop(stack));

甚至更好:

$popped_value = array_pop(stack);
this->assertEqual($popped_value, foo);

在其他框架(例如.NET的NUnit)中,它变得更好:

Assert.AreEqual(stack.Pop(), foo);

VS

var poppedValue = stack.Pop();
Assert.That(poppedValue, Is.EqualTo(foo));

阅读最后一个示例几乎就是,好像有人在向您解释代码。当你处理旧/某人的其他代码时,这是非常宝贵的。

答案 2 :(得分:0)

原因是afaik能够为失败的测试提供更清晰的消息,例如比较;

Test failed: 'foo' == array_pop(stack) assertion failed

Test failed: foo should be 2, actual value 5.