单元测试概念,如果将这些断言拆分为" unit&#34 ;?

时间:2012-12-17 13:28:11

标签: php unit-testing testing phpunit

尽管事实上我正在玩单元测试一段时间,但我无法真正理解“单元”的概念,即单一功能。

例如,我正在以newXxx

的形式测试一组魔术方法
public function testMagicCreatorWithoutArgument()
{
    $retobj = $this->hobj->newFoo();

    // Test that magic method sets the attribute
    $this->assertObjectHasAttribute('foo', $this->hobj);
    $this->assertInstanceOf(get_class($this->hobj), $this->hobj->foo);

    // Test returned $retobj type
    $this->assertInstanceOf(get_class($this->hobj), $retobj);
    $this->assertNotSame($this->hobj, $retobj);

    // Test parent property in $retobj
    $this->assertSame($this->hobj, $retobj->getParent());
}

正如您所看到的,此测试方法中有三个“组”断言。我应该将它们分成三个单一的测试方法,以遵循“单元测试”原则吗?

Split会是这样的:

public function testMagicCreatorWithoutArgumentSetsTheProperty()
{
    $this->hobj->newFoo();

    $this->assertObjectHasAttribute('foo', $this->hobj);
    $this->assertInstanceOf(get_class($this->hobj), $this->hobj->foo);
}

/**
 * @depends testMagicCreatorWithoutArgumentReturnsNewInstance
 */
public function testMagicCreatorWithArgumentSetsParentProperty()
{
    $retobj = $this->hobj->newFoo();

    $this->assertSame($this->hobj, $retobj->getParent());
}

public function testMagicCreatorWithoutArgumentReturnsNewInstance()
{
    $retobj = $this->hobj->newFoo();

    $this->assertInstanceOf(get_class($this->hobj), $retobj);
    $this->assertNotSame($this->hobj, $retobj);
}

1 个答案:

答案 0 :(得分:4)

您的测试方法正在对此进行测试:

   $retobj = $this->hobj->newFoo();

在一个测试中,并对此一个对象执行多个断言。这似乎并不合理。

如果您在一次测试中测试多个方法调用,我会更担心。为什么?早期断言将中止测试而不对另一种方法执行测试。 best 表示第二种方法未经过测试,而最差则隐藏了第二次测试显示的证据(证据可以帮助确定第一种方法的原因或范围)失败)

出于这个原因,我确实试图在单元测试方法中避免过多的断言。检查空对象,然后检查(在同一测试中)填充字段是不合理的。但是,我不会将这些断言链接在一起,而是宁愿有多个测试来测试同一个返回实体的不同功能。

与以往一样,这里有一定程度的实用性。