From ac7beca0c0258439fa765aad809ebba0f6f456d5 Mon Sep 17 00:00:00 2001 From: "mon.asuncion" Date: Mon, 3 Aug 2015 21:31:41 +0800 Subject: [PATCH] Fix: Change how classname is generated to be usable in sonar Modified how classname is generated to be usable in sonar Updated Readme.md Modified README.md Fix: Change how classname is generated to be usable in sonar Modified how classname is generated to be usable in sonar Updated Readme.md Modified README.md Removed extra semicolons and spaces Fix for additional test errors regarding semi colons --- README.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ index.js | 55 ++++++++++++---------------------------------- 2 files changed, 80 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 28a5a41..68944a6 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,72 @@ You can pass list of reporters as a CLI argument too: karma start --reporters junit,dots ``` +## Produce test result with schema acceptable in sonar + +To make this possible, it's required to make the classnames of each tests to match its file name. + +For Example: +```js +describe('analytics.AnalyticsModule_test', function(){ + + var analytics; + beforeEach(module('ECApp')); + beforeEach(module('angularytics')); + beforeEach(module('AnalyticsModule')); +... +``` + +should have a file name AnalyticsModule_test.js + +This will produce test result with schema acceptable in sonar. + +Grunt file reporters property example: +```js +reporters: ['junit', 'coverage', 'progress'], +junitReporter: { + outputDir: $junitResults, + suite: 'models' +}, +coverageReporter: { + type: 'lcov', + dir: $coverageOutputDir, + subdir: '.' +}, +preprocessors: { + 'src/main/webapp/public/js/ec3.3/**/*.js': 'coverage', + 'src/main/webapp/public/js/ec3/**/*.js': 'coverage' +}, +plugins: [ + 'karma-jasmine', + 'karma-phantomjs-launcher', + 'ec-karma-junit-reporter23', + 'karma-coverage' +] +``` + +Sonar property example: +```js +sonar.projectName=js +sonar.sources=site-main-php/src/main/webapp/public/js +sonar.projectBaseDir=. +sonar.exclusions=site-main-php/src/main/webapp/public/js/lib/*.js,site-main-php/src/main/webapp/public/js/tests/**/*.php,site-main-php/src/main/webapp/public/js/tests/**/*.js,site-main-php/src/main/webapp/public/js/ec3.3/vendor/** +sonar.javascript.lcov.reportPath=site-main-php/target/coverage/lcov.info +sonar.javascript.jstestdriver.reportsPath=site-main-php/target/surefire-reports/ +sonar.tests=site-main-php/src/main/webapp/public/js/tests +``` + +Example junit xml report: +```xml + + + + + + + + +... +``` ---- For more information on Karma see the [homepage]. diff --git a/index.js b/index.js index 874f390..d4df8b7 100644 --- a/index.js +++ b/index.js @@ -7,7 +7,6 @@ var JUnitReporter = function (baseReporterDecorator, config, logger, helper, for var log = logger.create('reporter.junit') var reporterConfig = config.junitReporter || {} var pkgName = reporterConfig.suite || '' - var outputFileName = reporterConfig.outputFile if (!reporterConfig.outputDir) { throw new Error('You must set an output directory for JUnitReporter via the outputDir config property') @@ -29,25 +28,17 @@ var JUnitReporter = function (baseReporterDecorator, config, logger, helper, for var timestamp = (new Date()).toISOString().substr(0, 19) var suite = suites[browser.id] = builder.create('testsuite') suite.att('name', browser.name) - .att('package', pkgName) - .att('timestamp', timestamp) - .att('id', 0) - .att('hostname', os.hostname()) + .att('package', pkgName) + .att('timestamp', timestamp) + .att('id', 0) + .att('hostname', os.hostname()) suite.ele('properties') - .ele('property', {name: 'browser.fullName', value: browser.fullName}) + .ele('property', {name: 'browser.fullName', value: browser.fullName}) } var writeXmlForBrowser = function (browser) { - var outputBrowserPath = path.join(outputDir, browser.name.replace(/ /g, '_')) + var outputFile = outputDir + 'TESTS-' + browser.name.replace(/ /g, '_') + '.xml' var xmlToOutput = suites[browser.id] - var outputFile - - if (outputFileName) { - outputDir = outputBrowserPath - outputFile = path.join(outputBrowserPath, outputFileName) - } else { - outputFile = outputBrowserPath + '.xml' - } pendingFileWritings++ helper.mkdirIfNotExists(outputDir, function () { @@ -78,33 +69,15 @@ var JUnitReporter = function (baseReporterDecorator, config, logger, helper, for this.onBrowserComplete = function (browser) { var suite = suites[browser.id] + var result = browser.lastResult - if (!suite) { - // This browser did not signal `onBrowserStart`. That happens - // if the browser timed out during the start phase or javascript - // exception has occured. - initliazeXmlForBrowser(browser) - if (browser.lastResult.error) { - suite = suites[browser.id] - suite.ele('error').dat(allMessages.join() + '\n') - allMessages = [] - } - } else { - var result = browser.lastResult + suite.att('tests', result.total) + suite.att('errors', result.disconnected || result.error ? 1 : 0) + suite.att('failures', result.failed) + suite.att('time', (result.netTime || 0) / 1000) - suite.att('tests', result.total) - suite.att('errors', result.disconnected || result.error ? 1 : 0) - suite.att('failures', result.failed) - suite.att('time', (result.netTime || 0) / 1000) - - if (result.disconnected) { - suite.ele('error').att('message', 'Browser disconnected') - } - - suite.ele('system-out').dat(allMessages.join() + '\n') - allMessages = [] - suite.ele('system-err') - } + suite.ele('system-out').dat(allMessages.join() + '\n') + suite.ele('system-err') writeXmlForBrowser(browser) } @@ -117,7 +90,7 @@ var JUnitReporter = function (baseReporterDecorator, config, logger, helper, for this.specSuccess = this.specSkipped = this.specFailure = function (browser, result) { var spec = suites[browser.id].ele('testcase', { name: result.description, time: ((result.time || 0) / 1000), - classname: (pkgName ? pkgName + ' ' : '') + result.suite.join(' ').replace(/\./g, '_') + classname: browser.name.replace(/ /g, '_').replace(/\./g, '_') + '.' + (pkgName ? pkgName + '.' : '') + result.suite[0] }) if (result.skipped) {