Покрытие кода тестами и SonarQube

Покрытие кода тестами и SonarQube

Сегодня кратко поговорим о том, как генерировать отчёты по тестам, в том числе и для SonarQube.

Важно: предполагается, что у Вас установлен SonarQube (смотри предыдущую статью), а также xdebug, sqlite3 и pdo драйвер.

В основном пока работаю под Homestead - здесь нет проблем ни с xdebug (для включения / выключения достаточно выполнить команды xon и xoff соответственно), ни с sqlite. Однако, поскольку Сонар установлен не внутри вирутальной машины, нам потребуется запускать тесты непосредственно в нашей системе (всё та же Ubuntu 18.04). Проверить, есть ли нужный драйвер можно командой:

$ php -i | grep PDO

 

Вывод должен быть таким (mysql опционально, ну а PostgreSQL нам в любом случае нужен для SonarQube):

PDO
PDO support => enabled
PDO drivers => mysql, pgsql, sqlite
PDO Driver for MySQL => enabled
PDO Driver for PostgreSQL => enabled
PDO Driver for SQLite 3.x => enabled

Если нужного драйвера нет, установим:

// используйте свою версию php 
$ sudo apt-get install php7.3-sqlite

// и перезапустим nginx
$ sudo service nginx restart 

 

Отчёты можно сгенерировать двумя способами:

- добавив следующий код в phpunit.xml:

<logging>
    <log type="coverage-html" target="report"
         lowUpperBound="50" highLowerBound="80" />
    <log type="coverage-clover" target="report/сoverage.xml"/>
</logging>

 

при этом следует понимать, что отчёты будут создаваться при каждом запуске тестов, что совершенно не нужно и, к тому же, замедляет выполнение тестов. Поэтому я предпочитаю второй способ:
- генерировать тесты из консоли только при необходимости. Если нужен полный html-отчёт, выполним следующую команду из корня проекта:

$ vendor/bin/phpunit --coverage-html report

 

где report - директория, в которой будет сохранён результат. Если такой директории в проекте нет, она будет создана. Войдём в report и откроем файл index.html в браузере. Мы должны увидеть примерно следующее:

phpunit coverage report

Все ссылки слева кликабельные. Другими словами, мы может посмотреть подробную информацию по любой директории или файлу. Например, посмотрим каталог Http:

Соответственно, сразу видно, над чем ещё нужно поработать.

Отчёты для SonarQube

Согласно документации:

Анализаторы SonarSource не запускают ваши тесты и не генерируют отчеты. Они импортируют только предварительно сгенерированные отчеты. 

Напомню: если мы будем генерировать отчёты внутри виртуальной машины (Homestead) или контейнера (Docker), SonarQube их не подхватит, поскольку пути в xml-файле будут неправильными. Сгенерируем отчёт из корневой папки проекта в нашей оси:

$ vendor/bin/phpunit --coverage-clover report/coverage.xml

 

Также добавьте в файл sonar-project.properties следующий код (пример для laravel, помимо вендоровских директорий исключено всё, что может содержать файлы билдов и кэшированные файлы):

# Path is relative to the sonar-project.properties file. Defaults to .
sonar.sources=app,database,resources,routes

# Here, you can exclude all the directories that you don't want to analyse.
sonar.exclusions=bootstrap/**,config/**,node_modules/**,public/**,resources/lang/**,storage/**,tests/**,vendor/**,

# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

sonar.tests=tests

# Reusing PHPUnit reports
sonar.php.coverage.reportPaths=.report/сoverage.xml
#sonar.php.tests.reportPath=report/testResults.xml

// что по модульным тестам?
// Path to the PHPUnit unit test execution report file. Path may be absolute or relative to project root.
sonar.php.tests.reportPath

 

Теперь можем смело запускать sonarscanner и анализировать покрытие также и на странице проекта SonarQube (подробнее тут)

На этом всё. Успехов!