我想知道为什么像PHPUnit这样的单元测试系统包含看似重复的运算符,只会增加单元测试的开销。我能理解其中的一些方法,但大多数似乎都是在浪费时间。
public function testPop(array stack)
{
this->assertEquals('foo', array_pop(stack));
this->assertEmpty(stack);
}
对比原始代码(更短更快)
public function testPop(array stack)
{
this->assert('foo' == array_pop(stack));
this->assert(empty(stack));
}
这些方法只是为了让那些不懂编程语言的人仍然可以编写单元测试吗?我相信这些项目的作者都比我聪明,所以一定有原因。
这些函数通常提供更有用的输出。例如,assertEquals
测试可以告诉您期望值和实际值,但它们并不相等。
例如,以下代码:
this->assertEquals(1, 0);
将产生以下输出:
Failed asserting that 0 matches expected 1.
这也是关于冗长的。此:
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);
与
var poppedValue = stack.Pop();
Assert.That(poppedValue, Is.EqualTo(foo));
阅读最后一个例子几乎就像有人在向你解释代码。当你处理旧的/别人的代码时,这是非常宝贵的。
原因是能够为失败的测试呈现更干净的消息,例如compare;
Test failed: 'foo' == array_pop(stack) assertion failed
至
Test failed: foo should be 2, actual value 5.