ืืืจ ืึทืงืืืืืื ื ืืฆื ืื ืคึผืืึทืืคืึธืจืืข ืืื ืืื ืืืขืจ ืึทืจืืขื SonarQube ืฆื ืืึทืืื ืงืึธื ืงืืืึทืืืืขื ืืืืฃ ืึท ืืืื ืืืจืื. ืืืขื ืื ืืึทืืจืืืืื ื ืืืื ืขืจ ืคืื ืื ืคึผืจืึทืืืฉืขืงืก ืืขืฉืจืืื ืืื VueJs + ืืืคึผ ืกืงืจืืคึผื, ืืื ื ืื ื ืืืืคืืขืืืื ื ืคืจืืืืขืืขื . ืืขืจืืืขืจ, ืืื ืืืึธืื ืืื ืฆื ืืขืจืฆืืืื ืืืจ ืืื ืืขืจ ืืขืืึทื ืืื ืืืจ ืืขืจืืื ืฆื ืกืึธืืืืข ืืื.
ืืื ืืขื ืึทืจืืืงื ืืืจ ืืืขืื ืจืขืื, ืืื ืืื ืืขืฉืจืืื ืืืืื, ืืืขืื ืื SonarQube ืคึผืืึทืืคืึธืจืืข. ื ืืืกื ืืขืึธืจืืข - ืืืึธืก ืขืก ืืื ืืื ืึทืืืขืืืื, ืคึฟืึทืจ ืื ืืืืก ืืขืจื ืืืขืื ืขืก ืคึฟืึทืจ ืื ืขืจืฉืืขืจ ืืึธื:
SonarQube (ืคืจืืขืจ ืกืึธื ืึทืจ) ืืื ืึทื ืึธืคึฟื ืืงืืจ ืคึผืืึทืืคืึธืจืืข ืคึฟืึทืจ ืงืขืกืืืืขืจืืืง ืืืจืืงืืง ืืื ืืขืืฉืขืจืืึทื ื ืคืื ืงืึธื ืงืืืึทืืืืขื.
ืฉืืืฆื ืงืึธื ืึทื ืึทืืืกืืก ืืื ืืขืืช ืืืืขืงืฉืึทื ืืืื ืื ืึผืืืื ืคืื ืื ืคึผืจืึธืืจืึทืืืื ื ืกืืึทื ืืึทืจืืก MISRA C, MISRA C ++, MITER/CWE ืืื CERT Secure Coding Standards. ืขืก ืงืขื ืืืื ืืขืจืงืขื ืขื ืขืจืจืึธืจืก ืคืื ืื OWASP Top 10 ืืื CWE/SANS Top 25 ืคึผืจืึธืืจืึทืืืื ื ืขืจืจืึธืจืก ืจืฉืืืืช.
ืืจืึธืฅ ืืขื ืคืึทืงื ืึทื ืื ืคึผืืึทืืคืึธืจืืข ื ืืฆื ืคืึทืจืฉืืื ืคืึทืจืืืง ืืืฉืืจืื, SonarQube ืจืึทืืืกืึทื ืื ืจืขืืืืืึทืื ืฆื ืึท ืืืื ืืึทืฉืืึธืจื, ืืขืืขืกืงืขื ืึท ืืขืฉืืืืข ืคืื โโืืืืคื ืืื ืืขืจืืื ืึทืืึทืืื ื ืืืจ ืฆื ืืขื ืื ืึทืืืขืืืื ืข ืืึทื ื ืคืื ืขื ืืขืจืื ืืขื ืืื ืืืืืืืืืจื ืงืืืึทืืืืขื ืืขืฉืึทืก ืึทื ืืืืืงืืื ื.
ืืขืจ ืืขืืึทืืืก ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื ืืื
ื ืืจืืืก ื ืืืขืจ ืคืื ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทืื ืืขื ืขื ืืขืฉืืืฆื. ืืืื ืืฉืคืื ืืืื ืื ืืื ืคึฟืึธืจืืึทืฆืืข ืคืื โโืื ืืื ืง ืืืืื, ืืึธืก ืืขื ืขื ืืขืจ ืืื 25 ืฉืคึผืจืึทืื. ืฆื ืฉืืืฆื ืึท ืกืคึผืขืฆืืคืืฉ ืฉืคึผืจืึทื, ืืืจ ืืืื ืื ืกืืึทืืืจื ืื ืฆืื ืขืืขื ืคึผืืืืื. ืื ืงืื ืืืขืจืกืืข ืืืื ืึท ืคึผืืืืื ืคึฟืึทืจ ืืจืืขืื ืืื ืืืฉืึทืืืึทืกืงืจืืคึผื (ืึทืจืืึทื ืืขืจืขืื ื ืืืืคึผืกืกืงืจืืคึผื), ืืึธืืฉ ืื ืืืืงื ืืืื ืื ืคืึทืจืงืขืจื. ืืื ืืขืจ ืืืฉืึทืืืึทืกืงืจืืคึผื ืคึผืืืืื ืขื ืืคึฟืขืจืก SonarJS, ืคึฟืึทืจ ืืืคึผืกืงืจืืคึผื SonarTS ืจืืกืคึผืขืงืืืืืื.
ืืขืจ ืืึทืึทืืืขืจ ืงืืืขื ื ืืื ืืขื ืืฆื ืฆื ืฉืืงื ืงืึทืืืขืจืืืืฉ ืืื ืคึฟืึธืจืืึทืฆืืข sonarqube-scanner, ืืืึธืก, ื ืืฆื ืื ืกืขืืืื ืืก ืคืื ืงืึธื ืคืื-ืืขืงืข, ืกืขื ืื ืื ืืึทืื ืฆื ืื ืกืขืจืืืขืจ SonarQube ืคึฟืึทืจ ืืืืึทืืขืจ ืงืึทื ืกืึทืืึทืืืืฉืึทื ืืื ืึทืืืจืขืืึทืืืึธื.
ืคืึทืจ ืืืฉืึทืืืึทืกืงืจืืคึผื ืขืก ืื ืคืึทืจืึทื
ืฆื ืื ืกืืึทืืืจื ืื ืกืขืจืืืขืจ SonarQube ืืืืืจ ืืืืกื ืืฆื ืืึธืงืขืจ-ืงืึทืืคึผืึธืื.
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, ืืืืก ืืืืกื ืกืึธื ืึทืจ-ืกืงืึทื ืขืจ, ืคึฟืึทืจ npm ืขืก ืืื ืึท ืืืืงืขืืข:
yarn add sonarqube-scanner
ืืื ืืื ืืืืื ืื ืืึทืคึฟืขื ืฆื ืกืงืจืืคึผืก ืฆื ืึทืจืืขืื ืืื ืืื.
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.projectKey - ืืื ืฆืืง ืคึผืจืืืขืงื ืืืขื ืืืคืืขืจ ืืืืฃ ืื ืกืขืจืืืขืจ ืกืึธื ืึทืจ'ื;
- sonar.projectName - ืืืื ื ืึธืืขื, ืขืก ืงืขื ืขื ืืืื ืืฉืืื ืืืฉื ืืื ืงืืื ืฆืืื, ืืื ื ืื ืคึผืจืืืขืงื ืืื ืืืืขื ืึทืคืืื ืืืจื projectKey;
- sonar.sources - ืืขืงืข ืืื ืงืืืืื, ืืืืฉืึทืืืึทืื ืืึธืก ืกืจืง, ืึธืืขืจ ืงืขื ืขื ืืืื ืขืคึผืขืก. ืืขืจ ืืขืงืข ืืื ืืึทืฉืืืื ืงืึธืจืขืื ืฆื ืืขืจ ืืืึธืจืฆื ืืขืงืข, ืืืึธืก ืืื ืืขืจ ืืขืงืข ืคึฟืื ืืืึธืก ืื ืกืงืึทื ื ืขืจ ืืื ืืึธื ืืฉื;
- sonar.tests - ืึท ืคึผืึทืจืึทืืขืืขืจ ืืืึธืก ืืืื ืืื ืืึทื ืืึทื ืืื ืื ืคืจืืขืจืืืงืข. ืืึธืก ืืื ืืขืจ ืืขืงืข ืืื ืื ืืขืกืฅ ืืขื ืขื ืืืื. ืืื ืืขื ืคึผืจืืืขืงื, ืขืก ืืื ื ืื ืึทืืึท ืืขืงืข, ืืื ืื ืคึผืจืึธืืข ืืื ืืืื ืืขืื ืืขืจ ืงืึธืืคึผืึธื ืขื ื ืืืึธืก ืืื ืืขืกืืขื ืืื ืืขืจ ืืขืงืข 'ืคึผืจืึธืืข', ืึทืืื ืืืจ ืืืื ืึธืจืืจื ืขืก ืคึฟืึทืจ ืืืฆื ืืื ื ืืฆื ืื ืืืืึทืืขืจ ืคึผืึทืจืึทืืขืืขืจ;
- sonar.test.inclusions - ืืจื ืคึฟืึทืจ ืืขืกืฅ ืืื ืึท ืืึทืกืงืข, ืขืก ืงืขื ืืืื ืขืืืขืืข ืขืืขืืขื ืื ืืืกืืขื ืืคืืขืฉืืืื ืืืจื ืงืึธืืข;
- sonar.sourceEncoding - ืงืึธืืืจืื ื ืคึฟืึทืจ ืืงืืจ ืืขืงืขืก.
ืคึฟืึทืจ ืืขืจ ืขืจืฉืืขืจ ืงืึทืืขืจ ืคืื ืื ืกืงืึทื ืขืจ, ืึทืืฅ ืืื ืืจืืื, ืึทืืืฅ ืื ืืืืคึผื ืคึผืจืืกืืืื ื ืงืึทืืฃ: ืงืึทืืขืจ ืื ืคึผืจืึธืืข ืืึธืืึธืจ ืืื, ืึทืืื ืึทื ืขืก ืงืขื ืขื ืืืฉืขื ืขืจืืื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืื ืงืึทืืืขืจืืืืฉ, ืืืึธืก ืืขืจ ืกืงืึทื ืขืจ ืืืขื ืืขืจื ืึธื ื ืืฆื.
ืึธืืขืจ ืฆื ืืึธื ืืึธืก, ืืืจ ืืึทืจืคึฟื ืฆื ืงืึทื ืคืืืืขืจ ืื ืคึผืจืึธืืข ืืึธืืึธืจ ืฆื ืืืฉืขื ืขืจืืื ืื ืืื ืคึฟืึธืจืืึทืฆืืข. ืืื ืืขื ืคึผืจืืืขืงื, ืื ืคึผืจืึธืืข ืืึธืืึธืจ ืืื ืขืก ืืื. ืืื ืืืึทื ืกืขืืืื ืืก ืืขื ืขื ืืื ืื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืึธืคึผืืืืืื ื ืคืื ืืขืจ ืืขืงืข 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 ืงืืื ืืื ืึท ื ืึธืจืืึทื ื ืืฆื ืืื ืึท ืืืื ืคืื ืื GCC ืคึผืขืงื.
Lcov - ืืจืึทืคืืงืึทื ืฆืืืื ื ืคึฟืึทืจ gcov. ืขืก ืึทืกืขืืืึทืื ืืงืึธืื ืืขืงืขืก ืคึฟืึทืจ ืงืืืคื ืืงืืจ ืืขืงืขืก ืืื ืืจืืื ืึท ืกืืื ืคืื HTML ืืืขืืขืจ ืืื ืงืึธื ืืื ืงืึทืืืขืจืืืืฉ ืืื ืคึฟืึธืจืืึทืฆืืข. ืืืขืืขืจ ืืขื ืขื ืืืื ืืืฉืขื ืขืจืืืืึทื ืฆื ืืึทืื ื ืึทืืืืืึทืฆืืข ืืจืื ืืขืจ. Lcov ืฉืืืฆื ืงืึทืืืขืจืืืืฉ ืคืื ืกืืจืื ืืก, ืคืึทื ืืงืฉืึทื ื ืืื ืฆืืืืืื.
ื ืึธื ืื ืืขืกืฅ ืืขื ืขื ืืขืขื ืืืงื, ืงืึทืืืขืจืืืืฉ ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขื ืืืื ืืขืคึฟืื ืขื ืืื coverage/lcov.info.
ืืืจ ืืึทืจืคึฟื ืฆื ืืึธืื ืกืึธื ืึทืจ'ืคืื ืืื ืงืขื ืืื ืืึทืงืืืขื ืขืก? ืืขืจืืืขืจ, ืืึธืื ืืื ืื ืืืืื ืื ืคืืืืขื ืืข ืฉืืจืืช ืฆื ืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืข. ืืืขืจ ืขืก ืืื ืืืื ืคืื ื: ืคึผืจืึทืืืฉืขืงืก ืงืขื ืขื ืืืื ืืึทืืืืืืื ืืืืึทื, ืืึธืก ืืื, ืืื ืืขืจ ืืขืงืข ืกืจืง ืขืก ืืขื ืขื ืืงืืจ ืงืึธืืื ืคึฟืึทืจ ืขืืืขืืข ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทืื ืืื ืึทืคืืืืืืฉืึทื ืืื ืืืื ืึธืืขืจ ืื ืืขืจื, ืืื ืืื ืงืขืจ, ืื ื ืืฆื ืคืื ืืืื ืึธืืขืจ ืื ืืขืจื ืคึผืืืืื ืืื ืืืฉืืืกื ืืืจื ืืืึทื ืคืึทืจืืขื ืืขืจืื ื. ืืื ืงืึทืืืขืจืืืืฉ ืืื ืคึฟืึธืจืืึทืฆืืข ืงืขื ืขื ืืืื ืกืืึธืจื ืืื ืคืึทืจืฉืืืขื ืข ืขืจืืขืจ ืคึฟืึทืจ ืคืึทืจืฉืืืขื ืข ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทืื, ืึทืืื ืืขืืขืจ ืฉืคึผืจืึทื ืืื ืืืื ืืืืืขื ืข ืึธืคึผืืืืืื ื ืคึฟืึทืจ ืืึทืฉืืขืืืงื ืืขื. ืืื ืืืขืจ ืคึผืจืืืขืงื ื ืืฆื ืืืคึผืขืกืงืจืืคึผื, ืึทืืื ืืืจ ืืึทืจืคึฟื ืึท ืกืขืืืื ืืก ืึธืคึผืืืืืื ื ื ืึธืจ ืคึฟืึทืจ ืืื:
sonar-project.properties:
sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.info
ืึทืืฅ ืืื ืืจืืื ืคึฟืึทืจ ืืขืจ ืขืจืฉืืขืจ ืงืึทืืขืจ ืคืื ืื ืกืงืึทื ื ืขืจ. ืืื ืืืึธืื ืืื ืฆื ืืึธื ืึทื ืื ืคึผืจืืืขืงื ืืื ืกืึธื ืึทืจ'e ืืื ืืืฉืืคื ืืืืืึธืืึทืืืฉ ืืขืจ ืขืจืฉืืขืจ ืืึธื ืืืจ ืืืืคื ืื ืกืงืึทื ื ืขืจ ืคึฟืึทืจ ืึท ืืขืืขืื ืคึผืจืืืขืงื. ืืื ืกืึทืืกืึทืงืืืึทื ื ืฆืืื, ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขื ืืืื ืึทืงืืืืืึทืืืืืื ืืื ืกืืจ ืฆื ืืขื ืื ืืื ืึทืืืง ืคืื ืขื ืืขืจืื ืืขื ืืื ืคึผืจืืืขืงื ืคึผืึทืจืึทืืขืืขืจืก ืืืืขืจ ืฆืืึทื.
ืึทืืื, ืืึธืื ืืื ืื ื ืืฆื ืื ืืึทืคึฟืขื ืืืฉืืคื ืคืจืืขืจ ืืื package.json:
yarn run sonar
ืืึทืืขืจืงืื ื: ืืืจ ืงืขื ื ืืืื ื ืืฆื ืืขื ืคึผืึทืจืึทืืขืืขืจ -X ืคึฟืึทืจ ืืขืจ ืืืืืืื ืืึธืืื ื.
ืืืื ืื ืกืงืึทื ืขืจ ืืื ืืขืืืขื ืืึธื ืืฉื ืคึฟืึทืจ ืื ืขืจืฉืืขืจ ืืึธื, ืื ืืืื ืขืจื ืคืื ืื ืกืงืึทื ืขืจ ืืื ืืืขื ืืืื ืืึทืื ืืึธืืืื ืขืจืฉืืขืจ. ื ืึธื ืืขื, ืขืก ืกืืึทืจืฅ ืืื ืกืืึทืจืฅ ืกืงืึทื ืื ื ืื ืกืขืจืืืขืจ ืกืึธื ืึทืจ'ืึท ืคึฟืึทืจ ืืื ืกืืึทืืืจื ืคึผืืืืื ืก, ืืขืจืืื ืงืึทืืงืืึทืืืืืื ื ืฉืืืฆื ืฉืคึผืจืึทื. ืขืืืขืืข ืื ืืขืจืข ืคึผืึทืจืึทืืขืืขืจืก ืคึฟืึทืจ ืืืึทื ืึธืคึผืขืจืึทืฆืืข ืืขื ืขื ืืืื ืืึธืืืื: ืงืืืึทืืืืขื ืคึผืจืึธืืคืืืื, ืึทืงืืืื ืึผืืืื, ืืขืืจืืง ืจืืคึผืึทืืึทืืึธืจื, ืกืขืจืืืขืจ ืึผืืืื.
ืืึทืืขืจืงืื ื: ืืืจ ืืืขืื ื ืืฉื ืืืืื ืขื ืืืืฃ ืืื ืืื ืืขืืึทื ืืื ืื ืคืจืืืืืืขืจืง ืคืื ืืขื ืึทืจืืืงื, ืึธืืขืจ ืืืจ ืงืขื ืขื ืฉืืขื ืืืง ืงืึธื ืืึทืงื ืืึทืึทืืืขืจ ืงืืืืื.
ืืืืึทืืขืจ, ืื ืืขืงืข ืึทื ืึทืืืกืืก ืืืืื ืกืจืง ืคึฟืึทืจ ืื ืึทืืืืืืึทืืืืึทืื ืคืื ืืงืืจ ืืขืงืขืก ืคึฟืึทืจ ืึทืืข (ืืืื ืึท ืกืคึผืขืฆืืคืืฉ ืืืื ืขืจ ืืื ื ืืฉื ืืคืืจืืฉ ืกืคึผืขืกืืคืืขื) ืืขืฉืืืฆื ืฉืคึผืจืึทื, ืืื ืืืืขืจ ืกืึทืืกืึทืงืืืึทื ื ืื ืืขืงืกืื ื.
ืืืืึทืืขืจ ืงืืืขื ืคืึทืจืฉืืื ืื ืืขืจืข ืึทื ืึทืืืืขืก, ืืืึธืก ืืืจ ืืึธื ื ืื ืคืึธืงืืก ืืืืฃ ืืื ืืขื ืึทืจืืืงื (ืืืฉื, ืืื ืืื ืืื ื, ืืืืขืงืฉืึทื ืคืื ืงืึธื ืืืคึผืืืงืึทืืืึธื, ืืื"ื ื).
ืืื ืื ืกืืฃ ืคืื ืื ืึทืจืืขื ืคืื ืื ืกืงืึทื ื ืขืจ, ืึทืืข ืืขืืืืื ืืื ืคึฟืึธืจืืึทืฆืืข ืืื ืึทืืจืึทืืืืืึทื, ืึทืจืืฉืืืืขื ืืื ืืขืฉืืงื ืฆื ืื ืกืขืจืืืขืจ.
ื ืึธื ืืขื, ืืืจ ืงืขื ืขื ืฉืืื ืืขื ืืืึธืก ืืขืืจืืคื ืืื ืื ืืืขื ืฆืืืื ื:
ืืื ืืืจ ืงืขื ืขื ืืขื, ืขืคึผืขืก ืืขืืจืืขื, ืืื ืืคืืื ืืืืืื ืึท ืืื ืคืื ืงืึทืืืขืจืืืืฉ, ืึธืืขืจ ืขืก ืืื ื ืืฉื ืืืืึทืื ืืื ืืืขืจ ืขืก ืืื-ืืึทืจืืื.
ืืื ืก ืคืืืืจ ืขืก ืืืืก. ืืึธืืืจ ืงืืงื ืืื ืื ืคึผืจืืืขืงื ืืื ืืขืจ ืืขืืึทื, ืืจืืงื ืืืืฃ ืื ืงืึทืืืขืจืืืืฉ ืืืขืจื ืืื "ืคืึทืื ืืืจื" ืืื ืึท ืืืืืืื ืืขืงืข ืืึทืจืืื:
ืืึธ ืืืจ ืืขื, ืืื ืึทืืืฉืึทื ืฆื ืื ืืืืคึผื, ืืืืึทืืึทื ื ืืขืงืข HelloWorld.vue, ืขืก ืืื ืืืื ืึท ืืขืงืข ืืืืคึผื.ืฆ, ืืืึธืก ืกืคึผืืืื ืื ืืื ืฆืข ืืืื ืคืื ืื ืงืึทืืืขืจืืืืฉ. ืืืขืจ ืืื ืงืืื ืขืก ืืืจ ืืงืกืงืืืืื ืขืก ืคืื ืื ืืขืืฉืื ืคืื ืงืึทืืืขืจืืืืฉ. ืืึธ, ืึทืืฅ ืืื ืจืืืืืง, ืึธืืขืจ ืขืก ืืื ืืขืืืขื ืืืืฃ ืืขืจ ืืืจืื ืขืก ืืื, ืึธืืขืจ ืืขืจ ืกืงืึทื ืขืจ ืื ืืขืงืกื ืขืก, ืึทืืื ืขืก ืขื ืืืงื ืืื ืืื ืืืื ืืฉืืื ืืช.
ืืื ืก ืคืึทืจืจืืืื ืืขื:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...
ืืื ืืืึธืื ืืื ืฆื ืืึทืื ืึท ืงืืขืจืึทืคืึทืงืืืฉืึทื: ืืื ืึทืืืฉืึทื ืฆื ืื ืคืึธืืืขืจืก ืืืึธืก ืืขื ืขื ืกืคึผืขืกืืคืืขื ืืื ืืขื ืคึผืึทืจืึทืืขืืขืจ, ืึทืืข ืคืึธืืืขืจืก ืืืกืืขื ืืื ืืขื ืคึผืึทืจืึทืืขืืขืจ ืืขื ืขื ืืืื ืฆืืืขืืขืื sonar.test.inclusions.
ื ืึธื ืืึธื ืืฉืื ื ืื ืกืงืึทื ื ืขืจ, ืืืจ ืืขื ืื ืจืืืืืง ืืื ืคึฟืึธืจืืึทืฆืืข:
ืืึธืืืจ ืงืืงื ืืืืฃ ืืขืจ ืืืืึทืืขืจ ืคืื ื - ืงืืืึทืืืืขื ืคึผืจืึธืืคืืืื. ืืื ืืขืจืขืื ืืืืื ืืืขืื ืฉืืืฆื ืกืึธื ืึทืจืคืื ืขืืืขืืข ืฉืคึผืจืึทืื ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื. ืืึธืก ืืื ืคึผืื ืงื ืืืึธืก ืืืจ ืืขื. ืึธืืขืจ ืืืจ ืืืืกื ืึทื ืืื ืืืขืจ ืคึผืจืืืขืงื ืืื ืืขืฉืจืืื ืืื TS, ืึทืืื ืืืึธืก ืฉืคึผืึทื ืื ื ืื ืกืงืึทื ื ืขืจ ืืื ืืื ืืืืืง ืืึทื ืืคึผืืึทืืืืฉืึทื ื ืืื ืืฉืขืงืก. ืืืจ ืืืขืื ืฉืืขืื ืื ืฉืคึผืจืึทื ืคึฟืึทืจ ืึทื ืึทืืืกืืก ืืืจื ืึทืืื ื ื ืึธื ืึท ืคึผืึทืจืึทืืขืืขืจ ืฆื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืข ืกืึธื ืึทืจ'ื:
sonar-project.properties:
...
sonar.language=ts
...
ืืึธืืืจ ืืืืคื ืื ืกืงืึทื ืขืจ ืืืืืขืจ ืืื ืืขื ืื ืจืขืืืืืึทื:
ืื ืืขืงืื ื ืืื ืืึธืจ ื ืืืึธ.
ืืืื ืืืจ ืงืืงื ืืื ืื ืกืงืึทื ืขืจ ืงืืึธืฅ, ืืืจ ืงืขื ืขื ืืขื ืื ืคืืืืขื ืืข ืฉืืจื:
ืึทื ืืื, ืืื ืืืขืจ ืคึผืจืืืขืงื ืืขืงืขืก ืคืฉืื ืืขื ืขื ื ืืฉื ืื ืืขืงืกื.
ืื ืกืืืืึทืฆืืข ืืื ืืื ืืืื: ืึทืคืืฉืึทืื ืืขืฉืืืฆื VueJs ืืื ืืื ืื ืคึผืืืืื SonarJSืืืขืจ ืืื ืคืึทืจืึทื ืืืืึธืจืืืขื ืคึฟืึทืจ ืืืฉืึทืืืึทืกืงืจืืคึผื.
ืืืขืจ ืืขื ืฉืืืฆื ืืื ื ืืฉื ืืื ืื ืคึผืืืืื SonarTS ืคืึทืจ TS, ืืืขืื ืืืึธืก ืึท ืืึทืึทืืืขืจ ืืืืขื ืืื ืืขืขืคื ื ืืขืืืืจื ืืื ืื ืืฉืืง ืืจืึทืงืขืจ ืกืึธื ืึทืจ'ื:
ืืึธ ืืขื ืขื ืขืืืขืืข ืขื ืืคึฟืขืจืก ืคืื ืืืื ืขืจ ืคืื ืื ืคืืจืฉืืืืขืจืก ืคืื ืื SonarQube ืืขืืืขืืึธืคึผืขืจืก ืืืึธืก ืืึทืฉืืขืืืงื ืืขื ืคืึทืงื.
ืืืขืจ ืึทืืฅ ืืขืืจืืขื ืคึฟืึทืจ ืืื ืื, ืืืจ ืึธืืืขืงืืืื. ืืึธ ืขืก ืืื, ืืึธืื ืืื ืื ืคึผืจืืืืจื ืขืก ืึท ืืืกื "ืืึทืง".
ืืืื ืขืก ืืื ืฉืืืฆื .vue- ืืขืงืขืก ืกืึธื ืึทืจ'ืึธื, ืืึธืืืจ ืคึผืจืืืืจื ืฆื ืืึธืื ืืื ืฆื ืืึทืืจืึทืืื ืืื ืืื ืืืคึผืขืกืงืจืืคึผื.
ืืึธืืืจ ืืืืื ืึท ืคึผืึทืจืึทืืขืืขืจ:
sonar-project.properties:
...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...
ืืื ืก ืงืึทืืขืจ ืื ืกืงืึทื ื ืขืจ:
ืืื, ืืืืืึทืืึท, ืึทืืฅ ืืื ืฆืืจืืง ืฆื ื ืึธืจืืึทื, ืืื ืืื ืืืื ืคึผืจืึธืคืื ืืืืื ืคึฟืึทืจ ืืืคึผืขืกืงืจืืคึผื. ืึทื ืืื, ืืืจ ืืขืจืืื ืฆื ืกืึธืืืืข ืื ืคึผืจืึธืืืขื ืืื ืฉืืืฆื VueJs+TS ืคืึทืจ SonarQube.
ืืื ืก ืคึผืจืืืืจื ืฆื ืืืื ืืืืึทืืขืจ ืืื ืคึฟืึทืจืืขืกืขืจื ืื ืงืึทืืืขืจืืืืฉ ืืื ืคึฟืึธืจืืึทืฆืืข ืึท ืืืกื.
ืืืึธืก ืืืจ ืืึธืื ืืขืืื ืืื ืืืฆื:
- ืฆืืืขืืขืื ืฆื ืื ืคึผืจืืืขืงื ืกืึธื ืึทืจ-ืกืงืึทื ืขืจ;
- ืฉืืขื ืืืืฃ ืขืก ืืื ืฆื ืืืฉืขื ืขืจืืื ืงืึทืืืขืจืืืืฉ ืืื ืคึฟืึธืจืืึทืฆืืข;
- ืงืึทื ืคืืืืขืจื ืกืึธื ืึทืจ-ืกืงืึทื ืขืจ;
- ืกืึทืืืื ืื ืฉืืืฆื ืคึผืจืึธืืืขื .vue-ืคืืืขืก + ืืืคึผืขืกืงืจืืคึผื.
ืืื ืึทืืืฉืึทื ืฆื ืคึผืจืึธืืข ืงืึทืืืขืจืืืืฉ, ืขืก ืืขื ืขื ืื ืืขืจืข ืืฉืืงืึทืืืข ื ืืฆืืง ืงืจืืืืืจืืึท ืคึฟืึทืจ ืงืึธื ืงืืืึทืืืืขื, ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืงืึธื ืืืคึผืืืงืืืฉืึทื ืืื ืื ื ืืืขืจ ืคืื ืฉืืจืืช (ืื ืืืึทืืืื ืืื ืื ืืขืืฉืื ืคืื ืงืึธืืึทืคืืฉืึทื ืฅ ืฉืืึทืืืช ืฆื ืงืึธื ืงืึทืืคึผืืขืงืกืืื) ืคืื ืื ืคึผืจืืืขืงื.
ืืื ืืขื ืงืจืึทื ื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืื ืคึผืืืืื ืคึฟืึทืจ ืืจืืขืื ืืื TS (SonarTS) ืืืขื ื ืืฉื ืึทืจืืขืื CPD (Copy Paste Detector) ืืื ืงืึทืื ืืื ื ืฉืืจืืช ืคืื ืงืึธื .vue- ืืขืงืขืก.
ืฆื ืฉืึทืคึฟื ืึท ืกืื ืืขืืืฉ ืกืืืืึทืฆืืข ืคืื โโโโืงืึธื ืืืคึผืืืงืืืฉืึทื, ืคืฉืื ืืืคึผืืืงืึทื ืื ืงืึธืืคึผืึธื ืขื ื ืืขืงืข ืืื ืึท ืึทื ืืขืจืฉ ื ืึธืืขื ืืื ืืืื ืืืืื ืขืก ืฆื ืื ืงืึธื ืืืืคึผื.ืฆ ืึท ืืึธืง ืคึฟืื ืงืฆืืข ืืื ืืืคึผืืืงืึทื ืขืก ืืื ืึท ืึทื ืืขืจืฉ ื ืึธืืขื. ืฆื ืงืึธื ืืจืึธืืืจื ืคึฟืึทืจ ืืืคึผืืืงืึทืืืึธื ืืื ืืื .vue, ืืื ืืื .ืฆ - ืืขืงืขืก.
main.ts:
...
function name(params:string): void {
console.log(params);
}
...
ืฆื ืืึธื ืืึธืก, ืืืจ ืืึทืจืคึฟื ืฆื ืืขืืคึผืขืจืขืจืึทืื ืืึทืืขืจืงื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืฉืืจื:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...
ืืึธืืืจ ืจืืกืืึทืจื ืื ืกืงืึทื ื ืขืจ ืฆืืืืืขื ืืื ืืขืกืืื ื:
yarn test && yarn run sonar
ืคืื ืงืืจืก, ืืื ืืืขืจ ืงืึทืืืขืจืืืืฉ ืืืขื ืคืึทืื, ืึธืืขืจ ืืืฆื ืืืจ ืืขื ืขื ื ืืฉื ืืื ืืขืจืขืกืืจื ืืื ืืืึธืก.
ืืื ืืขืจืืื ืขื ืคืื ืืืคึผืืืงืึทื ืฉืืจืืช ืคืื ืงืึธื, ืืืจ ืืืขืื ืืขื:
ืฆื ืงืึธื ืืจืึธืืืจื ืืืจ ืืืขืื ื ืืฆื ืงืคึผืโ ื ืืฆื โ jscpd:
npx jscpd src
ืคึฟืึทืจ ืฉืืจืืช ืคืื ืงืึธื:
ืืึธืืขืจ ืืึธืก ืืืขื ืืืื ืจืืืึทืืืื ืืื ืฆืืงืื ืคึฟื ืคึผืืืืื ืืืขืจืกืืขืก SonarJS(TS). ืืื ืืืึธืื ืืื ืฆื ืืึธื ืึทื ืืื ืืขื ืขื ืืืกืืขืืืืืึทื ืกืืึทืจืืื ื ืฆื ืฆืื ืืืคืืืกื ืื ืฆืืืื ืคึผืืืืื ืก ืืื ืืืื SonarJS, ืืืืก ืืื ืืืื ืื ืืื ืจืืืืื.
ืืืฆื ืืื ืืขืืืืื ืฆื ืืึทืืจืึทืืื ืื ืึธืคึผืฆืืข ืคืื โโืืืคึผืจืืืืื ื ืงืึทืืืขืจืืืืฉ ืืื ืคึฟืึธืจืืึทืฆืืข.
ืืื ืืืฆื ืืืจ ืงืขื ืขื ืืขื ืคึผืจืึธืืข ืงืึทืืืขืจืืืืฉ ืืื ืคึผืจืึธืฆืขื ื ืืขืจืืื ืขื ืคึฟืึทืจ ืื ืืื ืฆืข ืคึผืจืืืขืงื, ืืื ืคึฟืึทืจ ืืขืงืขืก ืืื ืืึทืืื ืืขืจ. ืืืขืจ ืขืก ืืื ืืขืืืขื ืฆื ืืงืกืคึผืึทื ื ืืขื ืืจืืื ืืื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืื ืงืืืึทื ืืืื ืึทืคึผืึทืจืึทื- ืืขืกืฅ ืคึฟืึทืจ ืื ืคึผืจืืืขืงื, ืืื ืืขืืื ื ืืื ืืื ืืขื ืงืึธื ืืขืงืกื ืคืื ืืขืงืขืก.
ืขืก ืืื ืึท ืืืืืืึธืืขืง ืืืึธืก ืงืขื ืขื ืขืก ืืื-ืืขืจ ืื ืืึทืจืืื ืืื ืคึฟืึธืจืืึทื ืคึฟืึทืจ ืกืึธื ืึทืจ'ื:
ืืืฉืึทื ืขืจืืง ืคึผืจืืืืจื ืืึทืื -
ืืึธืืืจ ืื ืกืืึทืืืจื ืื ืืืืืืึธืืขืง ืืื ืืื ืืืขืจ ืคึผืจืืืขืงื:
yarn add jest-sonar-reporter
ืืื ืืืื ืขืก ืฆื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืขืก ืืื:
package.json:
โฆ
"testResultsProcessor": "jest-sonar-reporter"
โฆ
ืืืฆื ืืึธืื ืืื ืื ืืืืคื ืื ืคึผืจืึธืืข:
yarn test
ื ืึธื ืืืึธืก ืึท ืืขืงืข ืืืขื ืืืื ืืืฉืืคื ืืื ืืขืจ ืืืึธืจืฆื ืคืื ืื ืคึผืจืืืขืงื test-report.xml.
ืืื ืก ื ืืฆื ืขืก ืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืกืึธื ืึทืจ'ื:
sonar-project.properties:
โฆ
sonar.testExecutionReportPaths=test-report.xml
โฆ
ืืื ืจืืกืืึทืจื ืื ืกืงืึทื ื ืขืจ:
yarn run sonar
ืืื ืก ืืขื ืืืึธืก ืืื ืืขืืืื ืืื ืื ืฆืืืื ื ืกืึธื ืึทืจ'ื:
ืืื ืืึธืจื ืืฉื ืืื ืืขืืืื. ืืขืจ ืคืึทืงื ืืื ืึทื Sonar ืืื ื ืืฉื ืืึทืืจืึทืืื ืื ืืขืงืขืก ืืืกืงืจืืืื ืืื ืื ืืืฉืขืกื ืืึทืจืืื ืืื ืืขืงืขืก ืึทืคึผืึทืจืึทื-ืืขืกืื. ืืื ืกืืจ ืฆื ืคืึทืจืจืืืื ืืขื ืกืืืืึทืฆืืข, ืืืจ ื ืืฆื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึผืึทืจืึทืืขืืขืจ ืกืึธื ืึทืจ sonar.tests, ืืื ืืืึธืก ืืืจ ืืืขืื ืืคืืจืืฉ ืึธื ืืืืึทืื ืื ืคืึธืืืขืจืก ืืื ืืขืกืฅ (ืืืจ ืืึธืื ืืืืื ืืืื ืคึฟืึทืจ ืืืฆื):
sonar-project.properties:
โฆ
sonar.tests=src/components/__tests__
โฆ
ืืึธืืืจ ืจืืกืืึทืจื ืื ืกืงืึทื ื ืขืจ:
yarn run sonar
ืืึธืืืจ ืืขื ืืืึธืก ืืื ืืขืืืื ืืื ืื ืฆืืืื ื:
ืืืฆื ืืืจ ืืึธืื ืืขืืขื ืื ื ืืืขืจ ืคืื ืืื ืืืขืจ ืึทืคึผืึทืจืึทื-ืืขืกืืก ืืื, ืืืืื ื ืื ืึทื ืืขืจืฉ ืืืจื ืงืืืงืื ื ืื, ืืืจ ืงืขื ืขื ืืขื ืื ืคืึทืจืฉืคึผืจืืืืื ื ืคืื ืืขื ื ืืืขืจ ืฆืืืืฉื ืื ืคึผืจืืืขืงื ืืขืงืขืก:
ืกืึธืฃ
ืึทืืื, ืืืจ ืืขืงืืงื ืืืืฃ ืึท ืืขืฆืืึทื ืคึฟืึทืจ ืงืขืกืืืืขืจืืืง ืึทื ืึทืืืกืืก SonarQube. ืืืจ ืืฆืืื ืื ืึทืืจืืืืื ืืื ืขืก ืึท ืคึผืจืืืขืงื ืืขืฉืจืืื ืืื VueJs+TS. ืคืึทืจืคืขืกืืืงื ืขืืืขืืข ืงืึทืืคึผืึทืืึทืืืืึทืื ืืฉืื. ืืืจ ืืขืืืืงืกื ืื ืืื ืคึฟืึธืจืืึทืฆืืข ืืื ืืึทืื ืคืื ืื ืคึผืจืึธืืข ืงืึทืืืขืจืืืืฉ ืืจืืื. ืืื ืืขื ืึทืจืืืงื ืืืจ ืืืืึทืืึทื ื ืืืืื ืืืื ืขืจ ืคืื ืื ืงืึธื ืงืืืึทืืืืขื ืงืจืืืืืจืืึท (ืืึธืืขืจ ืืืื ืขืจ ืคืื ืื ืืืืคึผื ืึธื ืขืก), ืึธืืขืจ SonarQube ืฉืืืฆื ืื ืืขืจืข ืงืืืึทืืืืขื ืงืจืืืืืจืืึท, ืึทืจืืึทื ืืขืจืขืื ื ืืืืขืจืงืืึทื ืืขืกืืื ื. ืึธืืขืจ ื ืื ืึทืืข ืคืื โโืื ืคึฟืขืึดืงืืืื ืืขื ืขื ืืึธืจ ืื ืืืฆื ืืื ืืืืข-ืืืขืจืกืืขืก. ืืืื ืขืจ ืคืื ืื ืืฉืืงืึทืืืข ืืื ื ืืฆืืง ืคึฟืขืึดืงืืืื ืืื ืื ืึทืืจืืืฉืึทื SonarQube ืืื ืคืึทืจืฉืืื ืงืึธื ืจืืคึผืึทืืึทืืึธืจื ืคืึทืจืืืึทืืืื ื ืกืืกืืขืืขื, ืึทืืึท ืืื GitLab ืืื BitBucket. ืฆื ืคืึทืจืืืึทืื ืฆืื ืืืคืืืกื ืฆืืขื (ืืขืจืืืฉ) ืืขืื'ืึท ืฆื ืื ืืืืคึผื ืฆืืืืึทื ืคืื ืื ืจืืคึผืึทืืึทืืึธืจื ืืืขื ืื ืงืึทืืืขืจืืืืฉ ืืื ืืืืจืืืืื. ืืืขืจ ืืึธืก ืืื ืึท ืืขืฉืืืืข ืคึฟืึทืจ ืึท ืืึธืจ ืึทื ืืขืจืฉ ืึทืจืืืงื.
ืคึผืก: ืึทืืฅ ืืืกืงืจืืืื ืืื ืืขื ืึทืจืืืงื ืืื ืื ืคืึธืจืขื ืคืื ืงืึธื ืืื ืื ืืืฆื ืืื
ืืืืื ืจืขืืืกืืจืืจื ื ืืฆืขืจืก ืงืขื ืขื ืึธื ืืืื ื ืขืืขื ืืื ืื ืืืขืจืืืืง.
ืฆื ืืืจ ื ืืฆื ืื SonarQube ืคึผืืึทืืคืึธืจืืข:
-
ืงืกื ืืืงืก%ืืึธ5
-
ืงืกื ืืืงืก%No3
-
ืงืกื ืืืงืก%ืืื ืืขืืขืจื ืืืขืื ืืขื ืคึผืืึทืืคืึธืจืืข ืืื ืืื ืืืืื ืฆื ื ืืฆื 3
-
ืงืกื ืืืงืก%ืืื ืืึธื ืืขืืขืจื ืืืขืื ืืขื ืคึผืืึทืืคืึธืจืืข ืืื ืืึธื ื ืืฉื ืืืขืื ืฆื ื ืืฆื 2
-
ืงืกื ืืืงืก%ืืื ื ืืฆื ืึท ืึทื ืืขืจืฉ ืคึผืืึทืืคืึธืจืืข 0
-
ืงืกื ืืืงืก%ืขืจืฉืืขืจ ืืึธื ืืื ืืืข ืืขืืขืจื ืืืขืื ืืืจ 6
19 ืืื ืืฆืขืจ ืืืื ืืขืฉืืืื. 3 ืืื ืืฆืขืจ ืืืื ืืื ืืคืืขืืืืื.
ืืงืืจ: www.habr.com