From e4f7ebdcfd72748df09be04eef344555dd9bc36e 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 This allows it to be usable in sonar. --- 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) {