Π ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠ΅ ΠΌΡ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ SonarQube Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π½ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠ΄Π° Π½Π° Π²ΡΡΠΎΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅. ΠΡΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΌ Π½Π° VueJs+Typescript, Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠΎΡΡΠΎΠΌΡ Ρ ΠΎΡΠ΅Π» Π±Ρ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅ΠΉ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π°Π»ΠΎΡΡ ΠΈΡ ΡΠ΅ΡΠΈΡΡ.
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΡΠ΅ΡΡ ΠΏΠΎΠΉΠ΄Π΅Ρ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Π» Π²ΡΡΠ΅, ΠΎ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ SonarQube. ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΎΡΠΈΠΈ β ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π²ΠΎΠΎΠ±ΡΠ΅, Π΄Π»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ ΡΠ»ΡΡΠΈΡ ΠΎ Π½Π΅ΠΉ Π²ΠΏΠ΅ΡΠ²ΡΠ΅:
SonarQube (Π±ΡΠ²ΡΠΈΠΉ Sonar) β ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° (Π°Π½Π³Π». continuous inspection) ΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠ΄Π°.
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΠΈΡΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ MISRA C, MISRA C++, MITRE/CWE ΠΈ CERT Secure Coding Standards. Π ΡΠ°ΠΊΠΆΠ΅ ΡΠΌΠ΅Π΅Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈΠ· ΡΠΏΠΈΡΠΊΠΎΠ² OWASP Π’ΠΎΠΏ-10 ΠΈ CWE/SANS Π’ΠΎΠΏ-25 ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, SonarQube ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ (Π°Π½Π³Π». dashboard), Π²Π΅Π΄Ρ ΠΈΡΡΠΎΡΠΈΡ ΠΏΡΠΎΠ³ΠΎΠ½ΠΎΠ² ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΎΠ±ΡΡΡ ΡΠ΅Π½Π΄Π΅Π½ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π² Ρ ΠΎΠ΄Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ·Π½Π°ΡΡ Π½Π°
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ·ΡΠΊΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π‘ΡΠ΄Ρ ΠΏΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· ΡΡΡΠ»ΠΊΠΈ Π²ΡΡΠ΅ β ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ 25 ΡΠ·ΡΠΊΠΎΠ². ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΏΠ»Π°Π³ΠΈΠ½. Π community-Π²Π΅ΡΡΠΈΡ Π²Ρ ΠΎΠ΄ΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Javascript (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ typesΡript), Ρ ΠΎΡΡ Π² wiki Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅. ΠΠ° Javascript ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΏΠ»Π°Π³ΠΈΠ½ SonarJS, Π·Π° Typescript SonarTS ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ sonarqube-scanner, ΠΊΠΎΡΠΎΡΡΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈΠ· config-ΡΠ°ΠΉΠ»Π°, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ SonarQube Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΈ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ»Ρ Javascript Π΅ΡΡΡ
ΠΠ»Ρ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° SonarQube Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ docker-compose.
sonar.yaml:
version: '1'
services:
simplesample-sonar:
image: sonarqube:lts
ports:
- 9001:9000
- 9092:9092
network_mode: bridge
ΠΠ°ΠΏΡΡΠΊ:
docker-compose -f sonar.yml up
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ SonarQube Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ β
ΠΠΎΠΊΠ° Π² Π½Π΅ΠΌ Π½Π΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΈ ΡΡΠΎ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ. ΠΡΠ΄Π΅ΠΌ ΠΈΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΠ° ΠΎΡΠ½ΠΎΠ²Ρ Ρ Π²Π·ΡΠ» ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ-ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ VueJS+TS+Jest. Π‘ΠΊΠ»ΠΎΠ½ΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ ΠΊ ΡΠ΅Π±Π΅:
git clone https://github.com/vuejs/vue-test-utils-typescript-example.git
Π‘Π½Π°ΡΠ°Π»Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ SonarQube, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ sonar-scanner, Π΄Π»Ρ npm Π΅ΡΡΡ ΠΎΠ±Π΅ΡΡΠΊΠ°:
yarn add sonarqube-scanner
Π ΡΡΠ°Π·Ρ ΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² scripts Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΈΠΌ.
package.json:
{
β¦
scripts: {
...
"sonar": "sonar-scanner"
...
},
β¦
}
ΠΠ°Π»Π΅Π΅, Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΊΠ°Π½Π΅ΡΠ°, Π½ΡΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅. ΠΠ°ΡΠ½Π΅ΠΌ Ρ Π±Π°Π·ΠΎΠ²ΡΡ .
sonar-project.properties:
sonar.host.url=http://localhost:9001
sonar.projectKey=test-project-vuejs-ts
sonar.projectName=Test Application (VueJS+TS)
sonar.sources=src
# sonar.tests=
sonar.test.inclusions=src/**/*tests*/**
sonar.sourceEncoding=UTF-8
- sonar.host.url β Π°Π΄ΡΠ΅Ρ SonarβΠ°;
- sonar.projectKey β ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ SonarβΠ°;
- sonar.projectName β Π΅Π³ΠΎ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ projectKey;
- sonar.sources β ΠΏΠ°ΠΏΠΊΠ° Ρ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ°ΠΌΠΈ, ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΠΎ src, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΡΠΌ. ΠΡΠ° ΠΏΠ°ΠΏΠΊΠ° Π·Π°Π΄Π°Π΅ΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΡΠΎΠ²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ, ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ°ΠΏΠΊΠ° ΠΎΡΠΊΡΠ΄Π° Π·Π°ΠΏΡΡΠ΅Π½ ΡΠΊΠ°Π½Π΅Ρ;
- sonar.tests β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ΄Π΅Ρ Π² ΠΏΠ°ΡΠ΅ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌ. ΠΡΠΎ ΠΏΠ°ΠΏΠΊΠ°, Π³Π΄Π΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ ΡΠ΅ΡΡΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅, Π½Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ, Π° ΡΠ΅ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ΄ΠΎΠΌ Ρ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΡΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ Π² ΠΏΠ°ΠΏΠΊΠ΅ ‘test‘, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π΅Π³ΠΎ ΠΏΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ;
- sonar.test.inclusions β ΠΏΡΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ°ΡΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· Π·Π°ΠΏΡΡΡΡ;
- sonar.sourceEncoding β ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ° Π΄Π»Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠ»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΊΠ°Π½Π΅ΡΠ° Π²ΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ, ΠΊΡΠΎΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ: Π·Π°ΠΏΡΡΠΊ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ°, Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΈ Π±ΡΠ΄Π΅Ρ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΊΠ°Π½Π΅Ρ.
ΠΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π° ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ β ΡΡΠΎ Jest. Π Π΅Π³ΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠ°ΠΉΠ»Π° package.json.
ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
"collectCoverage": true,
"collectCoverageFrom": [
"src/**/*",
"!src/main.ts",
"!src/App.vue",
"!src/**/*.d.*",
"!src/**/*__tests__*"
],
Π’ΠΎ Π΅ΡΡΡ Π·Π°Π΄Π°Π΅ΠΌ ΡΠ°ΠΌ ΡΠ»Π°Π³ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΏΠΎΠΊΡΡΡΠΈΡ ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ (Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ), Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡΡΡ.
Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠ΅ΡΡ:
yarn test
Π£Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
ΠΡΠΈΡΠΈΠ½Π° Π² ΡΠΎΠΌ, ΡΡΠΎ Π² ΡΠ°ΠΌΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅, ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΠΎΠ³ΠΎ, ΠΊΠΎΠ΄Π° Π½Π΅Ρ. ΠΡΠΏΡΠ°Π²ΠΈΠΌ ΡΡΠΎ.
HelloWorld.vue:
...
methods: {
calc(n) {
return n + 1;
}
},
mounted() {
this.msg1 = this.msg + this.calc(1);
},
...
ΠΡΠΎΠ³ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΠΏΠΎΠΊΡΡΡΠΈΡ.
ΠΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΡΠ° ΡΠ±Π΅Π΄ΠΈΠΌΡΡ Π² ΡΡΠΎΠΌ:
ΠΠ° ΡΠΊΡΠ°Π½Π΅ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ, Π° Π² ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½Π° ΠΏΠ°ΠΏΠΊΠ° coverage Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ ΡΠ΅ΡΡΠ°ΠΌΠΈ Π² ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅ LCOV (LTP GCOV extension).
Gcov β ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΠΌΠ°Ρ ΡΡΠΈΠ»ΠΈΡΠ° Π΄Π»Ρ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠΊΡΡΡΠΈΡ ΠΊΠΎΠ΄Π°. Gcov Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΎΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ. Gcov ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΡΠΈΠ»ΠΈΡΠ° Π² ΡΠΎΡΡΠ°Π²Π΅ ΠΏΠ°ΠΊΠ΅ΡΠ° GCC.
Lcov β Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ gcov. ΠΠ½ ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΡΠ°ΠΉΠ»Ρ gcov Π΄Π»Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² Ρ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ°ΠΌΠΈ ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ HTML ΡΡΡΠ°Π½ΠΈΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡΠΌΠΈ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ. Π’Π°ΠΊΠΆΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ. Lcov ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ ΡΡΡΠΎΠΊ, ΡΡΠ½ΠΊΡΠΈΠΉ, Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠΉ.
ΠΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² coverage/lcov.info.
ΠΠ°ΠΌ Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·Π°ΡΡ SonarβΡ ΠΎΡΠΊΡΠ΄Π° Π΅Π΅ Π²Π·ΡΡΡ. ΠΠΎΡΡΠΎΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠΎΡΠΊΠΈ Π² Π΅Π³ΠΎ ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΠΎ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ: ΠΏΡΠΎΠ΅ΠΊΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΌΡΠ»ΡΡΠΈΡΠ·ΡΡΠ½ΡΠ΅, ΡΠΎ Π΅ΡΡΡ Π² ΠΏΠ°ΠΏΠΊΠ΅ src Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ Π΄Π»Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠ·ΡΠΊΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΡ ΠΊ ΡΠΎΠΌΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌΡ, ΠΈ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎ Π΅Π³ΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ. Π ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ Ρ
ΡΠ°Π½ΠΈΡΡΡ Π² ΡΠ°Π·Π½ΡΡ
ΠΌΠ΅ΡΡΠ°Ρ
Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ
ΡΠ·ΡΠΊΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π―Π Π΅ΡΡΡ ΡΠ²ΠΎΠΉ ΡΠ°Π·Π΄Π΅Π» Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΡΠΎΠ³ΠΎ. Π£ Π½Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Typescript, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ ΡΠ°Π·Π΄Π΅Π» Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π»Ρ Π½Π΅Π³ΠΎ:
sonar-project.properties:
sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.info
ΠΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ Π·Π°ΠΏΡΡΠΊΡ ΡΠΊΠ°Π½Π΅ΡΠ°. Π₯ΠΎΡΡ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ Π² SonarβΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠΊΠ°Π½Π΅ΡΠ° Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π·Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π°ΠΊΠΊΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ, ΡΡΠΎΠ±Ρ Π²ΠΈΠ΄Π΅ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΡΠ°ΠΊ, Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΡΠ°Π½Π΅Π΅ Π² package.json:
yarn run sonar
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ -X Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΠΊ ΡΠΊΠ°Π½Π΅ΡΠ° Π±ΡΠ» Π²ΠΏΠ΅ΡΠ²ΡΠ΅, ΡΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΊΠ°ΡΠ°Π΅ΡΡΡ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠΊΠ°Π½Π΅ΡΠ°. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ²Π΅Ρ SonarβΠ° Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Π²ΡΡΠΈΡΠ»ΡΡ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π―Π. Π’Π°ΠΊΠΆΠ΅ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ: quality profiles, active rules, metrics repository, server rules.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π° Π½ΠΈΡ ΠΌΡ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ, Π½ΠΎ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ.
ΠΠ°Π»Π΅Π΅ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π°Π½Π°Π»ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ src Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π»Ρ Π²ΡΠ΅Ρ (Π΅ΡΠ»ΠΈ Π½Π΅ Π·Π°Π΄Π°Π½ ΡΠ²Π½ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ) ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ Π―Π, Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΠ΅ΠΉ.
ΠΠ°Π»Π΅Π΅ ΠΈΠ΄ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Ρ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π½Π΅ Π·Π°ΠΎΡΡΡΡΠ΅ΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ: Π»ΠΈΠ½ΡΠΈΠ½Π³, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΈ ΡΠ΄).
Π ΡΠ°ΠΌΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΡΠΊΠ°Π½Π΅ΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅ΠΉ ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, Π°ΡΡ ΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° Π΅Π΅ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΆΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π² Π²ΡΠ±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅:
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠ΅, Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π½Π°ΡΠ΅ΠΌΡ Jest-ΠΎΡΡΠ΅ΡΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ. ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ, ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΊΡΡΡΠΈΡ, ΠΈ "ΠΏΡΠΎΠ²Π°Π»ΠΈΠΌΡΡ" Π² Π΄Π΅ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡΡΠ΅Ρ ΠΏΠΎ ΡΠ°ΠΉΠ»Π°ΠΌ:
ΠΠ΄Π΅ΡΡ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ, ΠΈΡΡΠ»Π΅Π΄ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° HelloWorld.vue, ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΈ ΡΠ°ΠΉΠ» main.ts, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ ΠΏΠΎΡΡΠΈΡ Π²ΡΡ ΠΊΠ°ΡΡΠΈΠ½Ρ ΠΏΠΎΠΊΡΡΡΠΈΡ. ΠΠΎ ΠΊΠ°ΠΊ ΠΆΠ΅ ΡΠ°ΠΊ, ΠΌΡ Π΅Π³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ°Π»ΠΈ ΠΈΠ· ΡΠ°ΡΡΠ΅ΡΠ° ΠΏΠΎΠΊΡΡΡΠΈΡ. ΠΠ°, Π²ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, Π½ΠΎ ΡΡΠΎ Π±ΡΠ»ΠΎ Π½Π° ΡΡΠΎΠ²Π½Π΅ Jest, Π½ΠΎ ΡΠΊΠ°Π½Π΅Ρ Π΅Π³ΠΎ ΠΏΡΠΎΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π», ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ ΠΏΠΎΠΏΠ°Π» Π² Π΅Π³ΠΎ ΡΠ°ΡΡΠ΅ΡΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΠΌ ΡΡΠΎ:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...
Π₯ΠΎΡΠ΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎΡΠ½Π΅Π½ΠΈΠ΅: ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΠ΅Ρ ΠΏΠ°ΠΏΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π΄Π°Π½Ρ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅, ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π²ΡΠ΅ ΠΏΠ°ΠΏΠΊΠΈ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ sonar.test.inclusions.
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΊΠ°Π½Π΅ΡΠ° Π²ΠΈΠ΄ΠΈΠΌ ΡΠΆΠ΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ:
Π Π°Π·Π±Π΅ΡΠ΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ β Quality profiles. Π― Π³ΠΎΠ²ΠΎΡΠΈΠ» Π²ΡΡΠ΅ ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ SonarβΠΎΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π―Π ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΠΎΡ ΡΡΠΎ ΠΊΠ°ΠΊ ΡΠ°Π· ΠΌΡ ΠΈ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌ. ΠΠΎ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ Ρ Π½Π°Ρ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° TS, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π°ΡΠ΅ΠΌ Π½Π°ΠΏΡΡΠ³Π°ΡΡ ΡΠΊΠ°Π½Π΅Ρ Π»ΠΈΡΠ½ΠΈΠΌΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΈΡΠΌΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌΠΈ. Π―Π·ΡΠΊ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ΅ΡΠ΅Π· Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π² ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ SonarβΠ°:
sonar-project.properties:
...
sonar.language=ts
...
Π‘Π½ΠΎΠ²Π° Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠΊΠ°Π½Π΅Ρ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
ΠΠΎΠΊΡΡΡΠΈΠ΅ ΠΏΡΠΎΠΏΠ°Π»ΠΎ Π²ΠΎΠ²ΡΠ΅.
ΠΡΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π² Π»ΠΎΠ³ ΡΠΊΠ°Π½Π΅ΡΠ°, ΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΡΠΎΡΠΊΡ:
Π’ΠΎ Π΅ΡΡΡ ΡΠ°ΠΉΠ»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΡΠΎΡΡΠΎ Π½Π΅ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Ρ.
Π‘ΠΈΡΡΠ°ΡΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ: ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° VueJs Π΅ΡΡΡ Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ SonarJS, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° Javascript.
ΠΠΎ ΡΡΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π½Π΅Ρ Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ SonarTS Π΄Π»Ρ TS, ΠΎ ΡΠ΅ΠΌ Π·Π°Π²Π΅Π΄Π΅Π½ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΊΠ΅Ρ Π² Π±Π°Π³-ΡΡΠ΅ΠΊΠ΅ΡΠ΅ SonarβΠ°:
ΠΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ²Π΅ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² SonarQube, ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡΠΈΠΉ ΡΡΠΎΡ ΡΠ°ΠΊΡ.
ΠΠΎ Ρ Π½Π°Ρ ΠΆΠ΅ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ, Π²ΠΎΠ·ΡΠ°Π·ΠΈΡΠ΅ ΠΡ. ΠΠ°, ΡΠ°ΠΊ ΠΈ Π΅ΡΡΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ βΠΏΠΎΡ
Π°ΠΊΠ΅ΡΠΈΡΡβ.
ΠΡΠ»ΠΈ Π΅ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° .vue-ΡΠ°ΠΉΠ»ΠΎΠ² SonarβΠΎΠΌ, ΡΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ Π΅ΠΌΡ ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΈΡ
ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π» ΠΊΠ°ΠΊ Typescript.
ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ:
sonar-project.properties:
...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...
ΠΠ°ΠΏΡΡΡΠΈΠΌ ΡΠΊΠ°Π½Π΅Ρ:
Π, Π²ΡΠ°Π»Ρ, Π²ΡΠ΅ Π²Π΅ΡΠ½ΡΠ»ΠΎΡΡ Π½Π° ΠΊΡΡΠ³ΠΈ ΡΠ²ΠΎΡ, ΠΈ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Typescript. Π’ΠΎ Π΅ΡΡΡ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ VueJs+TS Π΄Π»Ρ SonarQube.
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΠΎΠΉΡΠΈ Π΄Π°Π»ΡΡΠ΅ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΡΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ.
Π§ΡΠΎ ΠΆΠ΅ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ:
- Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡ Sonar-ΡΠΊΠ°Π½Π΅Ρ;
- Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ Jest Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ;
- ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ Sonar-ΡΠΊΠ°Π½Π΅Ρ;
- ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ .vue-ΡΠ°ΠΉΠ»ΠΎΠ² + Typescript.
ΠΡΠΎΠΌΠ΅ ΠΏΠΎΠΊΡΡΡΠΈΡ ΡΠ΅ΡΡΠ°ΠΌΠΈ Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ (ΡΡΠ°ΡΡΠ²ΡΠ΅Ρ Π² ΡΠ°ΡΡΠ΅ΡΠ΅ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ², ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΊΠΎΠ΄Π°) ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ TS (SonarTS) Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ CPD (Copy Paste Detector) ΠΈ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° .vue-ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΏΠΎ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°, ΠΏΡΠΎΡΡΠΎ Π·Π°Π΄ΡΠ±Π»ΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΊΠΎΠ΄ main.ts ΡΡΠ½ΠΊΡΠΈΡ-ΠΏΡΡΡΡΡΠΊΡ ΠΈ Π·Π°Π΄ΡΠ±Π»ΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π² .vue, ΡΠ°ΠΊ ΠΈ Π² .ts -ΡΠ°ΠΉΠ»Π°Ρ .
main.ts:
...
function name(params:string): void {
console.log(params);
}
...
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠΎΡΠΊΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...
ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠΊΠ°Π½Π΅Ρ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ:
yarn test && yarn run sonar
Π£ Π½Π°Ρ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΡΠΏΠ°Π΄Π΅Ρ ΠΏΠΎΠΊΡΡΡΠΈΠ΅, Π½ΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π½Π°ΠΌ ΡΡΠΎ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ.
Π ΡΠ°Π·ΡΠ΅Π·Π΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° ΡΠ²ΠΈΠ΄ΠΈΠΌ:
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ CPD-ΡΡΠΈΠ»ΠΈΡΠΎΠΉ β jscpd:
npx jscpd src
ΠΠ»Ρ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°:
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ ΡΠ΅ΡΠΈΡΡΡ Π² Π±ΡΠ΄ΡΡΠΈΡ Π²Π΅ΡΡΠΈΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² SonarJS(TS). Π₯ΠΎΡΡ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π½Π°ΡΠΈΠ½Π°ΡΡ ΡΠ»ΠΈΠ²Π°ΡΡ ΡΡΠΈ Π΄Π²Π° ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² ΠΎΠ΄ΠΈΠ½ SonarJS, ΡΡΠΎ, Π΄ΡΠΌΠ°Ρ, ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ.
Π’Π΅ΠΏΠ΅ΡΡ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ.
ΠΠΎΠΊΠ° ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ ΡΠ΅ΡΡΠ°ΠΌΠΈ Π² ΠΏΡΠΎΡΠ΅Π½ΡΠ½ΠΎΠΌ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ, ΠΏΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡΡ, ΠΈ ΠΏΠΎ ΡΠ°ΠΉΠ»Π°ΠΌ Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ. ΠΠΎ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΡΡΠΎΡ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ unit-ΡΠ΅ΡΡΠΎΠ² ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π² ΡΠ°Π·ΡΠ΅Π·Π΅ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΌΠ΅Π΅Ρ Jest-ΡΠ΅ΠΏΠΎΡΡ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΠΎΡΠΌΠ°Ρ Π΄Π»Ρ SonarβΠ°:
generic test data β
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΊ ΡΠ΅Π±Π΅ Π² ΠΏΡΠΎΠ΅ΠΊΡ:
yarn add jest-sonar-reporter
Π Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Π³ΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Jest:
package.json:
β¦
"testResultsProcessor": "jest-sonar-reporter"
β¦
Π’Π΅ΠΏΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ΅ΡΡ:
yarn test
ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π² ΠΊΠΎΡΠ½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΡΠ°ΠΉΠ» test-report.xml.
ΠΠ°Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ Π΅Π³ΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ SonarβΠ°:
sonar-project.properties:
β¦
sonar.testExecutionReportPaths=test-report.xml
β¦
Π ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠΊΠ°Π½Π΅Ρ:
yarn run sonar
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΠ»ΠΎΡΡ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ SonarβΠ°:
Π Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΠ»ΠΎΡΡ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Sonar Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ»Ρ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² Jest-ΡΠ΅ΠΏΠΎΡΡΠ΅, ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ»Ρ unit-ΡΠ΅ΡΡΠΎΠ². ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Sonar sonar.tests, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ²Π½ΠΎ ΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΠ°ΠΏΠΊΠΈ Ρ ΡΠ΅ΡΡΠ°ΠΌΠΈ (ΠΎΠ½Π° Ρ Π½Π°Ρ ΠΏΠΎΠΊΠ° ΠΎΠ΄Π½Π°):
sonar-project.properties:
β¦
sonar.tests=src/components/__tests__
β¦
ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠΊΠ°Π½Π΅Ρ:
yarn run sonar
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΠ»ΠΎΡΡ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅:
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π°ΡΠΈΡ unit-ΡΠ΅ΡΡΠΎΠ² ΠΈ, ΠΏΡΠΎΠ²Π°Π»ΠΈΠ²ΡΠΈΡΡ ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡ Π²Π½ΡΡΡΡ, ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΠΏΠΎ ΡΠ°ΠΉΠ»Π°ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ°:
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠ°ΠΊ, ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° SonarQube. Π£ΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π² Π½Π΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° VueJs+TS. Π Π΅ΡΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ. ΠΠΎΠ²ΡΡΠΈΠ»ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ ΡΠ΅ΡΡΠ°ΠΌΠΈ. Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΡΠΈΡΠ΅ΡΠΈΠ΅Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠ΄Π° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ), Π½ΠΎ SonarQube ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ. ΠΠΎ Π½Π΅ Π²ΡΠ΅ ΡΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² community-Π²Π΅ΡΡΠΈΠΈ. ΠΠ΄Π½Π° ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ β ΡΡΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ SonarQube Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡΠΌΠΈ ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ GitLab ΠΈ BitBucket. Π§ΡΠΎΠ±Ρ Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΡΡ merge pull(merge) requestβΠ° Π² ΠΎΡΠ½ΠΎΠ²Π½ΡΡ Π²Π΅ΡΠΊΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΏΡΠΈ Π΄Π΅Π³ΡΠ°Π΄Π°ΡΠΈΠΈ ΠΏΠΎΠΊΡΡΡΠΈΡ. ΠΠΎ ΡΡΠΎ ΠΈΡΡΠΎΡΠΈΡ ΡΠΆΠ΅ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠ°ΡΡΠΈ.
PS: ΠΡΠ΅, ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΡΠ°ΡΡΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ΄Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π²
Π’ΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΌΠΎΠ³ΡΡ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΠΎΠΏΡΠΎΡΠ΅.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π»ΠΈ ΠΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ SonarQube:
-
26,3%ΠΠ°5
-
15,8%ΠΠ΅Ρ3
-
15,8%Π‘Π»ΡΡΠ°Π» ΠΎ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ ΠΈ Ρ ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ3
-
10,5%Π‘Π»ΡΡΠ°Π» ΠΎ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ ΠΈ Π½Π΅ Ρ ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ2
-
0,0%ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΄ΡΡΠ³ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ0
-
31,6%ΠΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ»ΡΡΡ ΠΎ Π½Π΅ΠΉ6
ΠΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 19 ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. ΠΠΎΠ·Π΄Π΅ΡΠΆΠ°Π»ΠΈΡΡ 3 ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com