0

尽管我已经玩了一段时间的单元测试,但我无法真正理解“单元”的概念,这是一个单一的功能。

例如,我正在测试以下形式的一组魔术方法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());
}

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

拆分将类似于:

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);
}
4

1 回答 1

4

您的测试方法正在测试这个:

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

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

如果您在一个测试中测试多个方法调用,我会更加担心。为什么 ?早期断言将中止测试并且不对进一步的方法执行测试。充其量这意味着第二种方法没有经过测试,最坏的情况是它隐藏了第二次测试揭示的证据(该证据可以帮助确定第一次失败的原因或范围)

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

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

于 2012-12-17T13:33:43.210 回答