【发布时间】:2020-05-31 18:04:11
【问题描述】:
假设我有这些课程:
abstract class A;
class X extends A;
class Y extends A;
假设我有这些测试:
abstract class ATest extends TestCase;
class XTest extends ATest;
class YTest extends ATest;
这样,我确保X 和Y 不会“破坏/松散”基类A 的预期行为,同时我不必对常见事物重复测试(它们在ATest 中被分解)。
如果XTest 或YTest 覆盖ATest 的方法,他们很可能会调用parent::whatever()(或不调用,取决于行为),但ATest 中的方法可能不会被覆盖,它们将在调用时像属于 XTest 或 YTest 的测试一样被调用。
好的,到这里为止。
如果我设置了这些覆盖注释:
/** @covers \My\Nice\Project\A */
abstract class ATest extends TestCase
/** @covers \My\Nice\Project\X */
class XTest extends ATest
/** @covers \My\Nice\Project\Y */
class YTest extends ATest
然后当我使用 --coverage-html 运行 phpunit 运行器时,我得到 X 和 Y 覆盖 100%,但 A 覆盖 0%。
原因是 ATest 从未真正被测试运行程序调用,因为它是一个抽象测试类(运行程序无法实例化它),并且在运行它的测试时,它实际上是通过 XTest 和YTest 扩展。
问题
我希望覆盖class A,而我不想在没有@covers 注释的情况下离开测试。
可能的解决方案
abstract class ATest extends TestCase
/**
* @covers \My\Nice\Project\X
* @covers \My\Nice\Project\A
*/
class XTest extends ATest
/**
* @covers \My\Nice\Project\Y
* @covers \My\Nice\Project\A
*/
class YTest extends ATest
问题
我觉得里面有味道。
这是正确的方法吗?如果不是,我应该如何告诉 phpunit TestA 覆盖 A 并将此元信息扩展到 TestX 和 TestY?
注意:此项目使用 PHPUnit 6.5.11。
【问题讨论】:
标签: inheritance annotations phpunit abstract-class code-coverage