Какую аннотацию покрытия кода использовать в PhpUnit, когда тест наследуется от абстрактного теста, который тестирует абстрактный класс? - PullRequest
1 голос
/ 16 февраля 2020

Скажите, что у меня есть эти классы:

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 для этого проекта.

1 Ответ

0 голосов
/ 24 февраля 2020

Нет плохого запаха при освещении абстрактных занятий. Вот как работает покрытие кода. Код существует, поэтому вы должны его охватить.

Неважно, что ATest также является абстрактным классом. Класс ATest не является тестовым сценарием. Но я знаю, что вы имеете в виду. В PHP нет комментариев, это все же комментарий. Таким образом, нет части наследования.

Возможно ... неприятный запах возникает из-за проблемы наследования, и вам следует подумать о композиции, а не о наследовании или шаблоне стратегии. По моему опыту, в основном проблема в устаревшем программном обеспечении.

...