测试依赖关系和测试集和setter在一起



我对单元测试和TDD很熟悉,我现在的疑虑是我正在运行的以下测试:

class TypeTest extends TestCase
{
private $typeNameForTests = "staff";
public function setUp()
{
parent::setUp();
}
public function testMake()
{
$type = Type::make($this->typeNameForTests);
$this->assertTrue(
$type instanceof Type,
"make() should return an instance of " . Type::class
); 
return $type;
}
/**
*   @depends testMake
*/
public function testToString($type)
{
$this->asserTrue(
$type->__toString() == 'staff',
"make() parameter should be set as the type name"
);
}
/**
* @depends testMake
*/
public function testSetAndGetParent($type)
{
$parent = $this->createMock(Type::class);
$type->setParent($parent);
$parent === $type->getParent();
}
}

我连接两个第一个测试的方式可以吗?断言方法的返回是必要的,在这种情况下有意义吗?

测试依赖关系(testToString)在那里有意义吗?

在同一个测试中测试Get和Set怎么样?

我很感激任何意见,因为我觉得我可能想得太多了。。。

谢谢!

回答您的问题:

我连接两个第一个测试的方式可以吗?断言方法的返回是必要的,在这种情况下有意义吗?测试依赖关系(testToString)在那里有意义吗?

我不会在这两种情况之间引入依赖关系,因为这实际上是两种不同的行为。第一种方法是测试创建新实例的make()方法的行为,第二种方法是检测强制转换为字符串的行为。

依赖测试应该是一个例外,而不是一个规则。如果没有其他方法,比如在每个测试方法中重复调用太贵(比如集成测试中的网络调用等),请使用它们。

在同一测试中测试Get和Set怎么样?

在我看来这很好。您仍然覆盖相同的行为——一旦设置了父对象,就可以访问它。

我的主要建议是开始关注每个测试方法的单一行为,而不是单一方法。通常需要一个方法调用,但不是每次都需要。

我会将您的测试用例更新为:

  1. 试着更好地命名测试方法。描述你期望的行为。使用testIt...testItShould...开始您的测试方法

  2. 与其专注于为每种生产方法添加一种测试方法,不如专注于描述行为(testMaketestMakeCreatesNewType)。通过这种方式,您可以有多个测试方法来描述单个生产方法的行为。

  3. 避免@depends。它几乎不需要,而且只适用于集成测试,当您需要尽可能少地进行I/O调用时。单元测试应该是独立的。

  4. 关注每个测试用例的可读性。在这个特殊的例子中,我认为私有财产并没有让事情变得更可读。

  5. 使用更具体的断言以获得更好的反馈。当测试失败时,使用更专业的断言(如assertInstanceOfassertSame等)可以为您提供更好的错误消息,从而减少对自定义消息的需求,并有效地提高测试的可读性。

  6. 移除无用的setUp()。它只调用只发出噪音的父对象。

class TypeTest extends TestCase
{
public function testMakeCreatesNewType()
{
$type = Type::make('staff');
$this->assertInstanceOf(Type::class, $type); 
}
public function testItCanBeCastToString()
{
$type = Type::make('staff');
$this->asserSame('staff', (string) $type);
}
public function testItExposesTheParent()
{
$type = Type::make('staff');
$parent = $this->createMock(Type::class);
$type->setParent($parent);
$this->assertSame($parent, $type->getParent());
}
public function testItReturnsNullIfParentWasNotSet()
{
$type = Type::make('staff');
$this->assertNull($type->getParent());
}
}

这将使测试更具可读性、可维护性和可靠性。

最新更新