Php 取决于继承的测试

Php 取决于继承的测试,php,inheritance,phpunit,Php,Inheritance,Phpunit,我有两个班,家长和孩子: class Parent { public function parentAction() {...} } class Child extends Parent { public function childAction() {...} } 现在我正在用PHPUnit测试这些。(我不是真正的单元测试,但就问题的目的而言,我想你可以假设我是。我用这些测试类来做这件事: abstract class ParentBaseTest extends PHPU

我有两个班,家长和孩子:

class Parent
{
    public function parentAction() {...}
}

class Child extends Parent
{
    public function childAction() {...}
}
现在我正在用PHPUnit测试这些。(我不是真正的单元测试,但就问题的目的而言,我想你可以假设我是。我用这些测试类来做这件事:

abstract class ParentBaseTest extends PHPUnit_Framework_TestCase
{
    public function testParentAction() {...}

    protected function factoryMethod() 
    {
        return new Parent();
    }
}

class ParentTest extends ParentBaseTest
{
}

class ChildTest  extends ParentBaseTest
{
    protected function factoryMethod()
    {
        return new Child();
    }

    public function testChildAction() {...}
}
在这里将继承与factoryMethod结合使用的想法是,在不重写父级测试的情况下,ParentBaseTest的测试也将在子级上运行。换句话说,测试是子级是否正确遵守Liskov替换原则。使用抽象基类和空继承类是必要的,因为se PHPUnit不想运行两次基类测试,否则

但是,现在我想将对
testParentAction()
的依赖添加到
testChildAction()
(即在
testChildAction()
定义之前添加
/**@dependents testParentAction*/

这不起作用。因为PHPUnit不会改变运行测试以满足依赖关系的顺序,并在运行从
ParentTest
继承的测试之前运行
ChildTest
中定义的测试,所以它总是会导致跳过
testChildMethod()


有没有可能强制PHPUnit先运行继承的测试?或者有没有其他(干净的)方法来强制执行依赖关系?

我认为这里对单元测试有一个误解。虽然你的OOP理论是准确的,但它没有很好地应用于单元测试领域,让我解释一下我的观点

每个测试用例类都应该测试给定类的所有行为,该类中的每个测试用例都应该测试被测试类中每个方法的一小部分。这意味着在测试类中有一个工厂方法是没有意义的,因为它不应该改变或接收不同的实例进行测试,否则它将被删除在设置中,您可以实例化共享夹具,并且子类或父类在各自测试类的所有测试用例中共享

单元测试用例应该是独立运行的,所以你可以自由地运行一个给定的测试用例,它应该通过,并且没有其他的测试用例应该依赖于这个结果通过或者失败,否则你的测试中会有一个随机行为,这从来都不是一件好事。所以子测试不应该依赖于父测试,父测试不应该依赖于子测试子类的e测试(即使在OOP中,父类也应该不知道它的子类)

另外,测试用例可以以不同的顺序运行,这不应该影响测试的正确性,因为正如我所说的,每个测试用例应该能够独立运行


如果你想阅读更多关于如何做好单元测试的内容,我强烈推荐这本书:它面向java开发人员,但理论在所有框架中都是共享的,他们有一整节的测试气味,以及如何修复和防止它们。

我认为这里对单元测试存在误解。而你的OOP理论是准确地说,它并没有很好地应用于单元测试领域,让我解释一下我的观点

每个测试用例类都应该测试给定类的所有行为,该类中的每个测试用例都应该测试被测试类中每个方法的一小部分。这意味着在测试类中有一个工厂方法是没有意义的,因为它不应该改变或接收不同的实例进行测试,否则它将被删除在设置中,您可以实例化共享夹具,并且子类或父类在各自测试类的所有测试用例中共享

单元测试用例应该是独立运行的,所以你可以自由地运行一个给定的测试用例,它应该通过,并且没有其他的测试用例应该依赖于这个结果通过或者失败,否则你的测试中会有一个随机行为,这从来都不是一件好事。所以子测试不应该依赖于父测试,父测试不应该依赖于子测试子类的e测试(即使在OOP中,父类也应该不知道它的子类)

另外,测试用例可以以不同的顺序运行,这不应该影响测试的正确性,因为正如我所说的,每个测试用例应该能够独立运行


如果你想更多地了解如何做好单元测试,我强烈推荐这本书:它面向java开发人员,但理论在所有框架中都是共享的,他们有一个完整的测试部分,以及如何修复和防止它们。

@Jasper:我想你误读了markdrake,也误解了一些更基本的东西ic:这里没有人需要向你解释任何事情。我会用另一种说法说你无法理解答案。所以这不是关于一个理想或不太理想的世界,而是更多关于已经回答的问题:两个单元测试都需要自己测试这两种类型。句号。运行单独的测试来测试这些对象。如果有这两种类型之间隐藏的依赖关系,请修复它。这就是您测试的原因。@hakre您对我的措辞和语气完全正确。我将改写我的评论.在我看来,遵循Liskov替换原则,你应该能够在你的子类上运行你为父类编写的测试。你说使用工厂方法没有意义,但我不明白的是工厂方法如何导致测试错误。我也不明白为什么会有c测试之间不存在依赖关系。当您测试使用您正在测试的功能的东西时,如果对所用功能的原始测试失败,则将此测试标记为跳过,这意味着您可以更好地找出代码中的问题。@Jasper:我想您误读了markdrake,还误解了更基本的东西:Nobody h我需要向你解释任何事情。我会用另一种说法说你不能理解answe