2015-02-25 9 views
12

Cosa sto facendo? Attualmente sto lavorando alla creazione di una linea continua di integrazione/consegna per applicazioni front-end. Stiamo pianificando di utilizzare SonarQube come strumento di qualità del codice e di voler importare i risultati del test junit/la copertura del codice in SONAR per ulteriori analisi.l'importazione di test junit javascript xml su SONAR utilizzando jstestdriver non riesce

Sono stato in grado di importare correttamente il report di copertura del codice javascript su SONAR. Usiamo Gulp/Karma/PhantomJS/Jasmine ecc. E usiamo la copertura Karma/giornalisti Junit per generare risultati di test. Il nome del file di test Junit è TEST-xunit.xml.

Dove sono bloccato? Ho bisogno del tuo aiuto/guida esperta sull'importazione dei risultati dei test Javascript su SONAR. Ho provato diverse cose ma in qualche modo non sono riuscito a importare le sorgenti/i risultati delle prove unitarie su SONAR.

Che cosa ho provato? In precedenza stavamo usando SONAR Runner 2.3, SONAR Qube 4.5/Javascript plugin 2.2 e in grado di importare statistiche di alto livello di Junit come test passati/falliti ecc. Tuttavia, non siamo stati in grado di navigare verso i singoli test per vedere quale test superato/fallito .

Sulla ricerca ulteriore, ha notato che il plugin di Javascript 2.3 ha aggiunto più messaggistica per lo scenario se non trova fonti di test. Inoltre, ci sono state altre dipendenze per cui SONAR aggiornato a 5.0. Testato con SONAR runner 2.4 e osservato i seguenti messaggi. Attualmente, anche le statistiche di alto livello non vengono importate.

JSTestDriverSensor.java codice è da plug-in SONAR Javascript su GitHub)

LOG.warn("Test result will not be saved for test class \"{}\", because SonarQube associated resource has not been found using file name: \"{}\"", 
    getUnitTestClassName(classKey), getUnitTestFileName(classKey)); 

sonar-runner.properties generati dal plug-in SONAR gulp (utilizza SONAR Runner 2,3)

sonar.projectBaseDir=C:/xxxxx/homepage2 
sonar.host.url=http://xxxxx:9000/sonarqube/ 
sonar.jdbc.url=jdbc:mysql:// xxxxx:3306/sonar 
sonar.jdbc.username= xxxxx 
sonar.jdbc.password= xxxxx 
sonar.projectKey=homepage:0.0.0 
sonar.projectName=homepage 
sonar.projectVersion=0.0.0 
sonar.sources=src/app,src/components 
sonar.exclusions=src/**/*spec.js 
sonar.tests=test 
sonar.language=js 
sonar.sourceEncoding=UTF-8 
sonar.javascript.lcov.reportPath=reports/coverage/lcov.info 
sonar.javascript.jstestdriver.reportsPath=reports/unit 

Ho anche provato l'installazione separata di SONAR runner 2.4 ma continuo a ricevere gli stessi messaggi di errore.

Domanda? 1. Deve esserci qualcosa che sto trascurando e che in qualche modo non è in grado di determinare cosa potrebbe causare questo. Penso che sto impostando il percorso della directory di test in modo errato o che JSTestDriverSensor interpreti erroneamente il file di directory di test. Suggerimenti? 2. Per iniziare, voglio solo importare un file xml di esempio junit per vedere se viene importato con successo. Dopo di ciò, posso modificare l'output del generatore di karma junit in modo che corrisponda all'ingresso junit xml. Hai bisogno di alcuni esempi di riferimento qui.

Allegare alcuni registri. Ho modificato junit xml per impostare diversi nomi di classi per vedere se JsTestDriverSensor lo trova. Ma non lo è!

[23:31:24] 23:31:24.122 DEBUG - Language of file 'src/app/main/textOverride.controller.js' is detected to be 'js' 
23:31:24.122 DEBUG - Language of file 'src/app/main/main.routes.js' is detected to be 'js' 
23:31:24.123 DEBUG - Language of file 'test/app/main/testSpec.js' is detected to be 'js' 

[23:31:24] 23:31:24.138 DEBUG - Language of file 'src/components/navbar/navbar.controller.js' is detected to be 'js' 

[23:31:24] 23:31:24.169 INFO - 7 files indexed 

[23:31:26] 23:31:26.632 INFO - Quality profile for js: Sonar way 

[23:31:26] 23:31:26.670 DEBUG - Sensors : QProfileSensor -> JavaScriptSquidSensor -> JsTestDriverSensor -> CoverageSensor -> InitialOpenIssuesSensor -> ProjectLinksSensor -> VersionEventsSensor -> FileHashSensor -> SCM Sensor (wrapped) -> CPD Sensor (wrapped) 
23:31:26.671 INFO - Sensor QProfileSensor... 

[23:31:26] 23:31:26.680 INFO - Sensor QProfileSensor done: 9 ms 
23:31:26.680 INFO - Sensor JavaScriptSquidSensor... 

[23:31:26] 23:31:26.950 INFO - 6 source files to be analyzed 

[23:31:27] 23:31:27.081 INFO - 6/6 source files analyzed 

[23:31:27] 23:31:27.113 INFO - Sensor JavaScriptSquidSensor done: 433 ms 

[23:31:27] 23:31:27.114 INFO - Sensor JsTestDriverSensor... 
23:31:27.114 INFO - Parsing Unit Test run results in Surefire format from folder C:\xxxxx\homepage2\reports\unit 

[23:31:27] 23:31:27.176 WARN - Test result will not be saved for test class "app.main.testSpec", because SonarQube associated resource has not been found using file name: "app/main/testSpec.js" 

[23:31:27] 23:31:27.177 WARN - Test result will not be saved for test class "src.app.main.testSpec", because SonarQube associated resource has not been found using file name: "src/app/main/testSpec.js" 
+0

Dove si trovano i file di test? Sono presenti questi luoghi in cui il sonar è alla ricerca, app/main/testSpec.js? –

+0

sì, è presente in app/main/testSpec.js ... – Sunil

+0

Sto riscontrando un problema simile e ho scoperto che il plug-in non sembra individuare correttamente le risorse di test quando non si trovano nella root di una posizione di test e l'analisi è eseguita su Windows. Stai correndo anche su Windows? – ioscode

risposta

2

Per chiunque la lettura di questo e l'utilizzo di Grunt (invece di Gulp) v'è un plugin per grunt and karma per convertire i risultati dei test unità nel formato appropriato per importare in SonarQube. Installa il plugin e imposta la configurazione di Grunt. Ad esempio:

 my_target: { 
      project: { 
       key: 'projectKey', 
       name: 'projectName', 
       version: package.version 
      }, 
      paths: [{ 
       cwd: '.', 
       src: './src', // source being tested 
       test: './tests/unit', // tests for the source 
       reports: { 
        // karma output for unit test results 
        unit: './tests/reports/dev/completion/unit.xml', 
        // karma output for unit test coverage 
        coverage: './tests/reports/dev/coverage/lcov/lcov.info' 
       } 
      }] 
     } 

Per impostazione predefinita questo richiederà i file creati e convertiti in karma./ Tmp/Sonar/risultati

Poi nelle proprietà del sonar aggiungere qualcosa di simile

sonar.tests=./tests/unit 
sonar.sources=./src 
sonar.javascript.jstestdriver.reportsPath=.tmp/sonar/results/ 
sonar.javascript.lcov.reportPath=.tmp/sonar/results/coverage_report.lcov 

Nota: Una cosa che mi ha morso in un primo momento è stato che i test di nome come test.spec.js otterrà convertito test_spec quando viene eseguito il sonar, quindi quando esegue il mapping dei risultati ai file, cerca ancora test_spec.js anziché test.spec.js. L'ho risolto cambiando solo i nomi dei miei test con il carattere di sottolineatura.

Un'altra nota: Quando si utilizza questo approccio con Jenkins, l'ho usato solo per la conversione dei risultati del test, non per altro. Per questo motivo, il task Grunt per karmaSonar fallirebbe (poiché non c'era alcuna istanza di SonarQube configurata o trovata sulla scatola), quindi se non si desidera che l'intera build fallisca, assicurarsi di usare il flag --force con Grunt . Ho scoperto che i file sono stati convertiti correttamente anche se l'attività non è riuscita. Quindi ho utilizzato il comando Invoke Standalone SonarQube Analysis nel mio lavoro per eseguire l'analisi del codice statico e raccogliere i risultati del test.

Spero che questo aiuti!