
Покрытие кода тестами и SonarQube
30.01.2020 00:55 | Другое, PHP
Сегодня кратко поговорим о том, как генерировать отчёты по тестам, в том числе и для 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
в браузере. Мы должны увидеть примерно следующее:
Все ссылки слева кликабельные. Другими словами, мы может посмотреть подробную информацию по любой директории или файлу. Например, посмотрим каталог 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 (подробнее тут)
На этом всё. Успехов!