【问题标题】:Unit testing concept, should these assertions be splitted to be "unit"?单元测试概念,是否应该将这些断言拆分为“单元”?
【发布时间】:2012-12-17 13:28:11
【问题描述】:

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

比如我在测试一组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);
}

【问题讨论】:

  • 据我所知,“单元测试”中的“单元”是指测试“单元”(作为类和方法)作为测试整个应用程序的对比。因此,“单元”不需要您将其拆分为 3 个方法,而只是要求您在一般情况下隔离测试。
  • @zerkms 好的,那么您认为每个方法制作多个断言是否可以?
  • 我认为它没有任何问题(我的想法基于我的个人经历和我所读过的内容)。实际上我会以完全相同的方式编写它。
  • 尽可能多地,我倾向于每种测试方法都使用一种测试方法。

标签: php unit-testing testing phpunit


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • “证据可以帮助确定第一次失败的原因或范围”——以及相反的观点:一个小错误可能会导致 100 次失败测试的噪音。
  • 不确定如何避免后者。你能解释一下吗?
  • 我的意思是多次测试有时弊大于利,因为如果他们测试紧密相关的东西 - 它们可能总是一起失败,因此会产生噪音(如果你有单个测试方法中的断言)。所以我同意你的回答,即测试长度决定是实践和经验的问题(这就是我 +1 的原因 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2011-08-31
  • 2011-09-06
  • 2013-03-18
相关资源
最近更新 更多