
Покриття коду тестами та 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
в браузері. Ми повинні побачити приблизно наступне:
Всі лінки зліва клікабельні. Іншими словами, ми може подивитися детальну інформацію по будь-якій директорії або файлу. Наприклад, подивимося каталог 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 (детальніше тут)
На цьому все. Успіхів!