Покриття коду тестами та 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 (детальніше тут)

На цьому все. Успіхів!