说我有那些课程:
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
和[ C0]扩展名。
我想覆盖YTest
,而我不想离开没有class A
注释的测试。
@covers
我觉得里面有气味。
这是正确的方法吗?如果没有,我应该如何告诉phpunit 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
覆盖TestA
,并将此元信息扩展到A
和TestX
中?
注意:为此项目使用PHPUnit 6.5.11。
通过覆盖抽象类,没有难闻的气味。这就是代码覆盖范围的工作方式。有代码,所以您必须覆盖它。
TestY
还是抽象类也没关系。类ATest
不是测试用例。但是我知道你的意思。 PHP中没有注释,它仍然是注释。因此,没有继承的一部分。
也许..难闻的气味来自继承问题,您应该考虑关于继承的组成或策略模式。以我的经验,遗留软件主要存在问题。