Скажите, что у меня есть эти классы:
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
затем, когда я запускаю phpunit runner с --coverage- html, я получаю X
и Y
на 100%, но A
на 0%.
Причина в том, что ATest
никогда не вызывается бегущим тестом, так как это абстрактный класс теста (бегун не может создать его экземпляр), и при запуске его sts, он на самом деле вызывается с помощью расширений 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 для этого проекта.