Π Π½Π°ΡΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° 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 Π² Vue-ΠΏΡΠΎΠ΅ΠΊΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Typescript.
ΠΠ° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ° 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=Π’Π΅ΡΡΠΎΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (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);
},
...Π’ΠΎΠ²Π° ΡΠ΅ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅.
Π‘Π»Π΅Π΄ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΡΠ°, Π½Π΅ΠΊΠ° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ Π² ΡΠΎΠ²Π°:

ΠΠ° Π΅ΠΊΡΠ°Π½Π° ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅, Π° Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΠΏΠ°ΠΏΠΊΠ° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ ΠΎΡ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ Π² ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½ ΡΠΎΡΠΌΠ°Ρ LCOV (ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° LTP GCOV).
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Π·Π° ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½ΠΈ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ, ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°ΠΉΠΊΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ Π΅Π·ΠΈΡΠΈ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ°: ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΈΠ»ΠΈ, Π°ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°, ΠΌΠ΅ΡΡΠΈΠΊΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π° ΡΡΡΠ²ΡΡΠ°.


ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΡΠΏΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π° ΡΡΡ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ, Π½ΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡΠ΅ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ.
Π‘Π»Π΅Π΄Π²Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ° src ΠΎΡΠ½ΠΎΡΠ½ΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π²ΡΠΈΡΠΊΠΈ (ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ Π½Π΅ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½) ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π΅Π·ΠΈΡΠΈ, ΠΏΠΎΡΠ»Π΅Π΄Π²Π°Π½ΠΈ ΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ.

Π‘Π»Π΅Π΄Π²Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈ, Π½Π° ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ°ΠΌΠ΅ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: Π»ΠΈΠ½ΡΠΈΠ½Π³, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π΄ΡΠ±Π»ΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ΄ ΠΈ Ρ.Π½.).
Π ΠΊΡΠ°Ρ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ»Π°ΡΠ° ΡΡΠ±ΡΠ°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:

ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π½Π΅ΡΠΎ Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΈ Π΄ΠΎΡΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° Π½ΡΠΊΠ°ΠΊΠ²ΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅, Π½ΠΎ ΡΠΎ Π½Π΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π½Π°ΡΠ΅ΡΠΎ Jest-ΠΎΡΡΠ΅Ρ.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ. ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ Π²ΡΡΡ Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ ΠΈ Π΄Π° "ΠΏΡΠΎΠ²Π°Π»ΡΠΌΠ΅" Π² Π΄Π΅ΡΠ°ΠΉΠ»Π΅Π½ ΠΎΡΡΠ΅Ρ ΠΏΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅:

Π’ΡΠΊ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΎΡΠ²Π΅Π½ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ, ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½ ΡΠ°ΠΉΠ» HelloWorld.vue, ΠΏΡΠΈΡΡΡΡΠ²Π° ΠΈ ΡΠ°ΠΉΠ» main.ts, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·Π²Π°Π»Ρ ΡΡΠ»ΠΎΡΡΠ½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π° Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ. ΠΠΎ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠ°, Π½ΠΈΠ΅ Π³ΠΎ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡ ΠΌΠ΅ ΠΎΡ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅. ΠΠ°, Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, Π½ΠΎ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ Π½Π° Π½ΠΈΠ²ΠΎ Jest, Π½ΠΎ ΡΠΊΠ΅Π½Π΅ΡΡΡ Π³ΠΎ Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π», Π·Π°ΡΠΎΠ²Π° ΡΠΎΠΉ ΠΏΠΎΠΏΠ°Π΄Π° Π² Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ.
ΠΠ΅ΠΊΠ° Π³ΠΎ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΠΌΠ΅:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...ΠΡΠΊΠ°ΠΌ Π΄Π° ΡΡΠΎΡΠ½Ρ: ΠΎΡΠ²Π΅Π½ ΠΏΠ°ΠΏΠΊΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π² ΡΠΎΠ·ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΏΠ°ΠΏΠΊΠΈ, ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° sonar.test.inclusions.
Π‘Π»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π²Π΅ΡΠ΅ ΠΊΠΎΡΠ΅ΠΊΡΠ½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ:


ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΌΠΎΠΌΠ΅Π½Ρ β ΠΠ°ΡΠ΅ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈ. Π‘ΠΏΠΎΠΌΠ΅Π½Π°Ρ ΠΏΠΎ-Π³ΠΎΡΠ΅ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° 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
...Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ°:

Π, voila, Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ Π²ΡΡΠ½Π° Π½Π° ΠΌΡΡΡΠΎΡΠΎ ΡΠΈ, ΡΠ°ΠΌΠΎ Ρ Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΡΠΈΠ» Π·Π° 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
