===== Code coverage with SonarQube =====
Internal reference: topics/06-3.md
\\
==== Introduction ====
SonarQube is a Java-based open-source code coverage tool. Beside running code coverage, it allows static code analysis to evaluate the reliability and security of a program. With ''SonarQube'', development teams may use fully customizable reports and a dashboard to show the quality of the code in their apps.
This program can analyze the static code of more than 25 languages, including PHP: Hypertext Preprocessor (PHP), Java,.NET, JavaScript, Python, and others. For a complete list, go to the SonarQube docs.
SonarQube also provides code analysis for security issues, code smells, and code duplication, as well as code coverage for unit tests.
\\
==== Constraints of SonarQube ====
As a reminder: Test coverage statistics and test execution reports will show you how much of your code is covered by your test cases.
SonarQube cannot determine coverage by itself. Set up of a third-party coverage tool is therefore required in order to import data into SonarQube. The right ''SonarScanner'' configuration is required in order to integrate code analysis into your build procedure.
\\
==== Getting started ====
The following procedure describes steps to set up SonarQube code coverage using JavaScript
As prerequisites you should have the following components installed on your system:
* NodeJS
* Docker
* A text editor or IDE
=== Step 1: Download and start SonarQube ===
SonarQube must be run on servers or virtual machines because it is an on-premise solution (VMs). Without having to explicitly configure the server on your system, starting up an instance can be replaced by installing a Docker container from the Sonar image.
docker pull sonarqube:latest
docker run -d --name sonarqube -p 9000:9000 sonarqube:latest
Once your instance is up and running, you can log in and access the sonarqube instance from your local browser through http://localhost:9000 using System Administrator default credentials.
login: admin
password: admin
=== Step 2: Create a new project ===
* As Project type select ''Create a local Project''
Then set ''Project display name and key'' and the ''main branch name (default: main)''.
* Hit the button ''Create project''
=== Step 3: Analysis method ===
* As analysis method select ''Locally''
* Generate the ''Token name'' (Expiration in 30 days is ok)
* Save the generated token and handle it as password.
* Hit the button ''Continue''
=== Step 4: Download and unzip the scanner ===
* Download the scanner for your platform.
* Unzip it either in your project directory or where your tools are usually stored.
* Add the ''bin'' directory of the unzipped folder in your ''PATH'' variable.
* Check before running code coverage that your target app (i.e. traffic light api) has the following node package are installed.
dependencies: {
...
@types/jest: ^29.5.11,
jest: ^29.7.0,
jest-sonar-reporter: ^2.0.0,
sonarqube-scanner: ^4.2.6,
supertest: ^6.3.3
}
* Create in your project folder a file ''sonar-project.properties''. Here you can store your settings, especially project-key, source-path, SonarQube host url and token. In the example the code source is in directory ''src'' and unit tests are on the same directory level in directory ''tests''.
#SonarQube configuration for server connection
sonar.projectKey=??
sonar.host.url=http://localhost:9000
sonar.token=??
sonar.sources=??
sonar.exclusions=
sonar.test=tests
sonar.language=javascript
sonar.scm.disabled=true
sonar.test.inclusions=tests/*.test.js
sonar.javascript.coveragePlugin=lcov
sonar.javascript.lcov.reportPaths=./coverage/lcov.info
sonar.testExecutionReportPaths=./coverage/test-reporter.xml
sonar.sourceEnconding=UTF-8
=== Step 5: Run the tests ===
* Run first the code coverage with jest.
jest --coverage --coverageDirectory='coverage' --collectCoverageFrom='src/**/*.js'
* Execute the scanner as shown.
In the example the scanner binaries are stored in the project folder. The path to the scanner is used in a bash script.
#!/usr/bin/env bash
#
# set tool variable
tool=??/M324_Code/sonar-scanner/bin/sonar-scanner.bat
# run tool
$tool
* Analyse the generated report in SonarQube
---
Based on this [[https://www.aviator.co/blog/implementing-sonarqube-code-coverage-in-a-simple-javascript-application/|Article]].
----
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Daniel Garavaldi