【问题标题】:Test dependencies and testing get and setter together测试依赖项和测试 get 和 setter 在一起
【发布时间】:2019-07-01 10:39:08
【问题描述】:

我对单元测试和 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 怎么样?

感谢您的任何意见,因为我觉得我可能对某些原则想得过多...

谢谢!

【问题讨论】:

    标签: php unit-testing phpunit tdd


    【解决方案1】:

    回答您的问题:

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

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

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

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

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

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

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

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

    2. 与其专注于为每个生产方法添加测试方法,不如专注于描述行为(testMake vs testMakeCreatesNewType)。这样,您就可以拥有多个测试方法来描述单一生产方法的行为。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-27
      • 2016-02-06
      • 2014-10-20
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2016-02-26
      相关资源
      最近更新 更多