当测试从测试抽象类的抽象测试继承时,在PhpUnit中使用什么代码覆盖率注释?

问题描述 投票:1回答:1

说我有那些课程:

abstract class A;
class X extends A;
class Y extends A;

说我有那些测试:

abstract class ATest extends TestCase;
class XTest extends ATest;
class YTest extends ATest;

[因此,我确保XY不会“破坏/松散”基类A的预期行为,而不必重复进行常见的测试(它们在ATest中排除)。

[如果XTestYTest覆盖ATest的方法,则很可能会调用parent::whatever()(或不取决于行为),但是ATest中的某些方法可能不会被覆盖并且它们将像调用时属于XTestYTest的测试一样被调用。

好吧,到这里,好吧。

如果我设置了这些覆盖率注释:

/** @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运行程序时,我得到XY覆盖了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,并将此元信息扩展到ATestX中?

注意:为此项目使用PHPUnit 6.5.11。

inheritance annotations phpunit abstract-class code-coverage
1个回答
0
投票

通过覆盖抽象类,没有难闻的气味。这就是代码覆盖范围的工作方式。有代码,所以您必须覆盖它。

TestY还是抽象类也没关系。类ATest不是测试用例。但是我知道你的意思。 PHP中没有注释,它仍然是注释。因此,没有继承的一部分。

也许..难闻的气味来自继承问题,您应该考虑关于继承的组成或策略模式。以我的经验,遗留软件主要存在问题。

© www.soinside.com 2019 - 2024. All rights reserved.