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