Oma töös kasutame aktiivselt platvormi SonarQube koodi kvaliteedi hoidmiseks kĂ”rgel tasemel. Ăhe esitatud projekti integreerimise kĂ€igus, mis on kirjutatud VueJs+Typescript, tekkisid probleemid. SeetĂ”ttu sooviksin rÀÀkida lĂ€hemalt, kuidas suudeti need lahendada.

Antud artiklis rÀÀgitakse, nagu eelnevalt mainitud, platvormist SonarQube. Veidi teooriat â mis see ĂŒldse on, neile, kes kuulevad sellest esmakordselt:
SonarQube (endine Sonar) â avatud lĂ€htekoodiga platvorm pidevaks analĂŒĂŒsiks (ingl. continuous inspection) ja koodi kvaliteedi mÔÔtmiseks.
Toetab koodi analĂŒĂŒsi ja vigade otsimist vastavalt programmimise standardite MISRA C, MISRA C++, MITRE/CWE ja CERT Secure Coding Standards reeglitele. Samuti oskab tuvastada vigu OWASP Top-10 ja CWE/SANS Top-25 programmi vigade loenditest.
Hoolimata asjaolust, et platvorm kasutab erinevaid valmis tööriistu, koondab SonarQube tulemused ĂŒhele teabelehe (ingl. dashboard), hoides jooksuajaloo ja vĂ”imaldades seega nĂ€ha tarkvara kvaliteedi ĂŒldist suundumust arendamise kĂ€igus.
Edasi saate lugeda
Toetatakse suurt hulka programmeerimiskeeli. Ăhelt lingilt vaadates â rohkem kui 25 keelt. Spetsiifilise keele toetamiseks on vajalik vastava plugina installimine. Community versioon sisaldab plugina, mis töötab Javascript (sealhulgas typesŃript), kuigi vikis on kirjutatud vastupidist. Selle eest vastutab plugin Javascript SonarJS , Typescripti eestSonarTS Infode saatmiseks katvuse kohta kasutatakse ametlikku klienti vastavalt.
sonarqube-scanner , mis, kasutades seadistusiconfig failist, saadab need andmed serverisseedasi konsolideerimiseks ja aggregatsiooniks. SonarQube npm-moodul
Tooge Javascript on Vue SonarQube ja projekt, mis kasutabTypescripti Serveri seadistamiseks kasutame.
docker-compose SonarQube sonar.yaml version: '1' services: simplesample-sonar: image: sonarqube:lts ports: - 9001:9000 - 9092:9092 network_mode: bridge.
KĂ€ivitamine::
docker-compose -f sonar.yml upPĂ€rast seda
on saadaval aadressil âPraegu ei ole seal projekte ja see on tĂ”si. Parandame seda olukorda. Aluseks vĂ”tsin ametliku nĂ€idisprojekti SonarQube VueJS+TS+Jest .

. Kloneerime selle endale: git clone https://github.com/vuejs/vue-test-utils-typescript-example.gitEsmalt peame installima kliendi
, mis nimetataksesonar-scanner SonarQube, npm jaoks on olemas wrapper: yarn add sonarqube-scanner, jaoks npm on wrappers:
yarn add sonarqube-scannerJa lisame kohe meeskonna scripts selle töötamiseks.
package.json:
{
âŠ
scripts: {
...
"sonar": "sonar-scanner"
...
},
âŠ
}SeejÀrel, et skannimistööriist töötaks, peame mÀÀrama projekti seaded spetsiaalses failis. Alustame pÔhitest.
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 â aadress Sonarâa;
- sonar.projectKey â projekti unikaalne identifikaator serveris Sonarâa;
- sonar.projectName â selle nimetus, mida saab igal ajal muuta, kuna projekti identifitseerimine toimub projectKey;
- sonar.sources â kaust allikfailide jaoks, tavaliselt see on src, kuid see vĂ”ib olla mis tahes. See kaust mÀÀratakse suhte vĂ”rra juurkaustaga, millega skanner kĂ€ivitatakse;
- sonar.tests â parameeter, mis koosneb eelnevatest. See on kaust, kus asuvad testid. Antud projektis ei ole sellist kausta, ja test asub lĂ€himasse kausta âtestâ, seega ignoreerime seda ja kasutame jĂ€rgmisi parameetreid;
- sonar.test.inclusions â tee testide jaoks, kasutades mustrit; neid vĂ”ib olla mitu, eraldatud koma abil;
- sonar.sourceEncoding â koodimine allikafailide jaoks.
Esimese skannimise kÀivitamiseks on kÔik valmis, vÀlja arvatud pÔhieelse tegevuse: testimootori kÀivitamine, et genereerida teavet katvuse kohta, mida skanner hiljem kasutab.
Kuid selleks tuleb testimootor seadistada selle teabe genereerimiseks. Antud projektis on testimootor Jest. Ja selle seaded asuvad faili vastavas jaotises. package.json.
Lisame need seaded:
"collectCoverage": true,
"collectCoverageFrom": [
"src/**/*",
"!src/main.ts",
"!src/App.vue",
"!src/**/*.d.*",
"!src/**/*__tests__*"
],See tÀhendab, et mÀÀrame katvuse arvutamise vajaduse lipu ja allika (koos eranditega), mille alusel see moodustatakse.
NĂŒĂŒd kĂ€ivitame testi:
yarn testNÀhes jÀrgmist:

PÔhjus on selles, et komponentide koodis endas ei ole. Lahendame selle.
HelloWorld.vue:
...
methods: {
calc(n) {
return n + 1;
}
},
mounted() {
this.msg1 = this.msg + this.calc(1);
},
...Seda on katvuse arvutamiseks piisavalt.
PÀrast testi uuesti kÀivitamist veendume selles:

Ekraanil peaksime nÀgema katvuse teavet ning projekti kaustas luuakse kaust coverage teavet testide katvuse kohta universaalses formaadis LCOV (LTP GCOV laienemine).
Gcov â vabalt levitatav utiliit koodikattuvuse uurimiseks. Gcov genereerib tĂ€pse tĂ€itmisarvu iga programmi operaatori jaoks ja vĂ”imaldab lisada annotatsioone lĂ€htekoodile. Gcov tuleb standardse utiliidina GCC paketi koosseisus.
Lcov â gcov'i graafiline liides. See kogub mitme lĂ€htekoodi failiga gcov'i faile ja loob komplekti HTML-lehti koodi ja katvuse andmetega. Samuti genereeritakse navigeerimise lihtsustamiseks lehed. Lcov toetab ridade, funktsioonide ja harude katvust.
PĂ€rast testide sooritamist asub katvuse teave coverage/lcov.info.
Me peame ĂŒtlema Sonarâlt, kust seda vĂ”tta. SeetĂ”ttu lisame jĂ€rgmised read tema konfiguratsioonifaili. Kuid on ĂŒks asi: projektid vĂ”ivad olla mitmekeelsed, st kaustas src asuvad lĂ€htekoodid mitmete programmeerimiskeelte jaoks ja kuuluvus ĂŒhte vĂ”i teise ning vastavalt sellele kasutatakse teatud pluginaid, mÀÀratakse nende laiendi jĂ€rgi. Ja katvuse info vĂ”ib eri programmeerimiskeelte jaoks olla erinevates kohtades, seega on igale programmeerimiskeele jaoks oma seadistusosa. Meie projekt kasutab Serveri seadistamiseks kasutame, seega vajame seadistusosa just selle jaoks:
sonar-project.properties:
sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.infoKĂ”ik on valmis skanneri esimeseks kĂ€ivitamiseks. Tahan mĂ€rkida, et projekt Sonarâs luuakse automaatselt esmakordsel skanneri sisselĂŒlitamisel selle projekti jaoks. JĂ€rgnevatel kordadel akumuleerub teave, et nĂ€ha projekti parameetrite muutumise dĂŒnaamikat ajas.
Seega kasutame varasemalt loodud kÀsklust package.json:
yarn run sonar MÀrkus: vÔib kasutada ka parameetrit -X kuna see vÔimaldab detailsemat logimist.
Kui skanner kĂ€ivitati esmakordselt, allalaaditakse esmalt skanneri binaarfail. SeejĂ€rel kĂ€ivitatakse see ja alustatakse serveri skaneerimist Sonarâlt installitud pluginate tuvastamiseks, arvutades seelĂ€bi toetatavad programmeerimiskeeled. Samuti laaditakse alla mitmed muud erinevad parameetrid selle tööks: kvaliteediprofiilid, aktiivsed reeglid, mÔÔdikute hoidla, serveri reeglid.


MĂ€rkus: millele me kĂ€esolevas artiklis sĂŒvitsi ei lasku, kuid alati on vĂ”imalik pöörduda ametlike allikate poole.
SeejĂ€rel algab kausta analĂŒĂŒsimine src kĂ”ikide toetatud programmeerimiskeelte lĂ€htefailide olemasolu tuvastamine (kui ei ole selgelt mÀÀratletud mĂ”nda konkreetset), millele jĂ€rgneb nende indekseerimine.

Edasi liikudes on mitmed erinevad analĂŒĂŒsid, millele me selles artiklis tĂ€helepanu ei pööra (nt sellised nagu: lintimine, koodeksemÀÀramise mÀÀramine jne).
Skaneri töö lÔpus toimub kogu kogutud teabe agregatsioon, arhiveerimine ja selle saatmine serverisse.
PĂ€rast seda saame juba vaadata, mida veebiliideses saavutatud on:

Nagu nÀeme, on midagi saavutatud ja isegi kuvatakse mingit katvust, kuid see ei vasta meie Jest-aruandele.
KÀime asju lÀbi. Vaatame projekti lÀhemalt, klÔpsame katvuse vÀÀrtusel ja "sukeldume" detailreportsse failide kohta:

Siin nÀeme lisaks pÔhifailile, millega tegeleme, HelloWorld.vue, on olemas ka fail main.ts, mis rikkus kogu katvuse pildi. Aga kuidas see juhtus, me olime selle katvusest vÀlja jÀtnud. Jah, kÔik on Ôige, kuid see oli tasemel Jest, kuid skanner on selle indekseerinud, mistÔttu see sattus tema arvutustesse.
Parandame selle:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...Tahaksin teha tÀpsustuse: peale nende kaustade, mis on selles parameetris mÀÀratud, lisatakse ka kÔik kaustad, mis on loetletud parameetris sonar.test.inclusions.
PÀrast skanneri kÀivitamist nÀeme juba Ôiget teavet:


Arutame jĂ€rgmise punkti â Quality profiles. RÀÀkisin varem toe pakkumisest Sonarmitme programmikeele samal ajal. Just seda me nĂŒĂŒd nĂ€eme. Kuid me teame, et meie projekt on kirjutatud TS, seega miks koormata skannerit liigsete manipuleerimiste ja kontrollidega. AnalĂŒĂŒsimiseks mÀÀrame keele, lisades veel ĂŒhe parameetri konfiguratsioonifaili Sonar:
sonar-project.properties:
...
sonar.language=ts
...KĂ€ivitame skanneri uuesti ja vaatame tulemust:

Katvus on tÀielikult kadunud.
Kui vaatame skanneri logi, siis nÀeme jÀrgmist rida:
![]()
See tÀhendab, et meie projekti faile ei ole lihtsalt indekseeritud.
Olukord on jÀrgmine: ametlikult on tugi VueJs plugines olemas, mis vastutab , Typescripti eest, kuid selle tuge ei ole plugines Javascript.

, mille kohta on ametlik ticet bug-trackeris avatud. Infode saatmiseks katvuse kohta kasutatakse ametlikku klienti jaoks TSSiin on mĂ”ned vastused ĂŒhelt SonarQube arendajalt, kes kinnitab seda fakti. Sonar:
Aga meil on ju kĂ”ik töötanud, ĂŒtlete Te. Jah, see on tĂ”si, proovime natuke


âhĂ€kkeridaâ Kui on tugi.
.vue -failidele-faile SonarKui nii on, proovime talle öelda, et ta vaataks neid kui Serveri seadistamiseks kasutame.
Lisame parameetri:
sonar-project.properties:
...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...KÀivitame skÀnneri:

Ja voilĂ , kĂ”ik on tagasi oma kohtades, ja ainult ĂŒhe profiiliga Serveri seadistamiseks kasutame. See tĂ€hendab, et probleem toetuse osas on lahendatud VueJs+TS jaoks SonarQube.
Proovime minna edasi ja parandada katte teavet.
Mida oleme senini teinud:
- oleme projekti lisanud Sonar-skÀnneri;
- seadsime Jest katte teabe genereerimiseks;
- konfigureerisime Sonar-skÀnneri;
- lahendasime toetuse probleemi -failidele-failide + Serveri seadistamiseks kasutame.
Lisaks kattele testide kaudu on veel teisi huvitavaid kasulikke koodikvaliteedi kriteeriume, nÀiteks koodi dubleerimine ja ridade arv (osaleb koodi keerukuse koefitsientide arvutuses) projekti.
Praeguses plugina versioonis ei hakka TS (Infode saatmiseks katvuse kohta kasutatakse ametlikku klienti) töötama CPD (Copy Paste Detector) ja koodiridade arvutamine -failidele-failide.
Koodi dubleerimise sĂŒnteetilise olukorra loomiseks dubleerime lihtsalt komponendi faili teise nimega, lisame koodi main.ts tĂŒhifunktsiooni ja dubleerime selle teise nimega. Et kontrollida dubleerimist nii -failidele, kui ka .ts -failides.
main.ts:
...
funktsioon name(params:string): void {
console.log(params);
}
...Selleks on vajalik ajutiselt kommenteerida konfiguratsiooni rida:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...KÀivitame skÀnneri koos testimisega:
yarn test && yarn run sonarMeie katet langetatakse, kuid praegu pole see meid huvitav.
Koodiridade dubleerimise vaates nÀeme:

Kontrollimiseks kasutame CPD-utiliiti â jscpd:
npx jscpd src
Koodiridade jaoks:

VÔib-olla lahendatakse see tulevaste pluginate versioonides SonarJS(TS). Tahan mÀrkida, et nad hakkavad jÀrk-jÀrgult need kaks plugina kokku sulandama , Typescripti eest, mis, arvan, on Ôige.
NĂŒĂŒd sooviks uurida katte teabe parandamise varianti.
Kuni nĂ€eme katte protsenti kogu projektis ja konkreetselt failides. Kuid on vĂ”imalus seda nĂ€itajat laiendada teabega testide arvu ĂŒksuse-katsete kohta projektis ning ka failide lĂ”ikes.
On olemas teek, mis oskab Jest-aruannet konverteerida formaati Sonar:
ĂŒldised testandmed â .
Paigaldame selle teegi oma projekti:
yarn add jest-sonar-reporterJa lisame selle konfiguratsiooni Jest:
package.json:
âŠ
"testResultsProcessor": "jest-sonar-reporter"
âŠNĂŒĂŒd teeme testi:
yarn testPĂ€rast seda luuakse projekti juurde fail test-report.xml.
Kasutame seda konfiguratsioonis Sonar:
sonar-project.properties:
âŠ
sonar.testExecutionReportPaths=test-report.xml
âŠJa kĂ€ivitame skĂ€nneri uuesti:
yarn run sonarVaadake, mis on muutunud liideses Sonar:

Ja mitte midagi ei muutunud. Asi on selles, et Sonar ei kĂ€sitle Jest-raportis kirjeldatud faile kui testifailideks. ĂŒksuse-testimiseks. Selle olukorra parandamiseks kasutame konfiguratsiooniparametrit Sonar sonar.tests, kus mÀÀrame selgelt testide kaustad (meil on praegu ĂŒks):
sonar-project.properties:
...
sonar.tests=src/components/__tests__
...KĂ€ivitame skanneri uuesti:
yarn run sonarVaadake, mis on muutunud liideses:

NĂŒĂŒd nĂ€eme meie ĂŒksuse-testide arvu ja klĂ”psates saame vaadata selle arvu jaotust projekti failides:

KokkuvÔte
Nii et oleme uurinud pideva analĂŒĂŒsi tööriista. SonarQubeOleme selle edukalt integreerinud projekti, mis on kirjutatud VueJs+TS. Lahendasime mĂ”ned ĂŒhilduvusprobleemid. Parandasime testide katvuse nĂ€itaja informatiivsust. Antud artiklis kĂ€sitlesime ainult ĂŒhte koodi kvaliteedi kriteeriumi (vĂ”ib-olla ĂŒhte peamist), kuid SonarQube toetab ka teisi kvaliteedi kriteeriume, sealhulgas turvakatsete tegemist. Kuid mitte kĂ”ik need vĂ”imalused ei ole tĂ€ielikult juurdepÀÀsetavad community-versioonis. Ăks huvitav ja kasulik funktsioon on integreerimised SonarQube erinevate koodihalduse sĂŒsteemidega, nĂ€iteks sellistega nagu GitLab ja BitBucket. Et vĂ€ltida merge pull(merge) request'ipeamise reposi harusse, kui katvuse tase langeb. Kuid see on juba tĂ€iesti teise artikli teema.
PS: KÔik, mida artiklis kookirutena kirjeldati, on saadaval minu forgis. .
Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Jah5
26,3%Olen kuulnud sellest platvormist ja soovin seda kasutada3
15,8%Ei3
15,8%Olen kuulnud sellest platvormist ja ei soovi seda kasutada2
10,5%Kasutame teist platvormi0
0,0%Kuulen sellest esmakordselt6
31,6%HÀÀletas 19 kasutajat. 3 kasutajat jÀid erapooletuks.
Samba 4.12.0 vÀljalase
Allikas: habr.com
