Jacoco показывает неверную проверку покрытия Результат - PullRequest
0 голосов
/ 25 апреля 2019

Я настроил плагин My ​​Jacoco В моем проекте через maven.

Вот моя конфигурация jacoco

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.3</version>
    <configuration>
      <excludes>
      </exclude>**/some/package/SomeClass*</exclude>
      </excludes>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
      <execution>
        <id>report</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>report</goal>
        </goals>
      </execution>
      <execution>
        <id>jacoco-check</id>
        <goals>
          <goal>check</goal>
        </goals>
        <configuration>
          <rules>
            <rule>
              <element>CLASS</element>
              <excludes>
                <exclude>*Test</exclude>
              </excludes>
              <limits>
                <limit>
                  <counter>LINE</counter>
                  <value>COVEREDRATIO</value>
                  <minimum>80%</minimum>
                </limit>
              </limits>
            </rule>
          </rules>
        </configuration>
      </execution>
    </executions>
  </plugin>

Screenshot

Я выполнил тест и показал 94% покрытия для абстрактного класса, я протестировал этот абстрактный класс, используя его конкретную реализацию.

Когда я запускаю сборку maven

Я получаю следующую ошибку

Нарушено правило для класса my.package.AbstractParser.1: коэффициент покрытия строк равен 0,00, но ожидаемый минимум равен 0,80

Я пытался протестировать абстрактный класс с помощью фиктивногореализация в тесте все еще я получаю ту же ошибку

Может кто-нибудь сказать мне, что я делаю здесь не так.

РЕДАКТИРОВАТЬ: я выяснил причину сбоя

Я написал встроенную карту инициализации

return new HashMap<String, String>() {
    {
      put(input, "");
    }
  };

И охват показал 0% по этой части.так что мой тест не охватывал эту часть.

Но я устал

 final Map<String, String> defaultMap = new HashMap<>();
  defaultMap.put(input, "");
  return defaultMap;

Пройдена сборка даже без покрытия новым кодом.Может кто-нибудь объяснить мне, почему это произошло с inline-инициализацией ???

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Ваша конфигурация

          <rules>
            <rule>
              <element>CLASS</element>
              <excludes>
                <exclude>*Test</exclude>
              </excludes>
              <limits>
                <limit>
                  <counter>LINE</counter>
                  <value>COVEREDRATIO</value>
                  <minimum>80%</minimum>
                </limit>
              </limits>
            </rule>
          </rules>

означает, что покрытие линии должно быть не менее 80% для каждого класса .

return new HashMap<String, String>() {
    {
      put(input, "");
    }
  };

объявляет анонимный класс , что BTW видно в отчете JaCoCo - см. первую строку таблицы на скриншоте ниже

report

Принимая во внимание

  final Map<String, String> defaultMap = new HashMap<>();
  defaultMap.put(input, "");
  return defaultMap;

не объявляет ни одного класса.

0 голосов
/ 25 апреля 2019

Попробуйте добавить это к вашей сборке Gradle

android {
    testOptions {
        unitTests {
            all {
                jvmArgs '-noverify'
            }
        }
    }
}

Существует проблема с тестами и покрытием, поэтому вам необходимо настроить параметр jvmArgs для проверки покрытия, его можно включить в самой IDE, но при запуске покрытия в CI / maven / везде, где оно должно быть настроено в gradle

...