junit.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /**
  2. * https://svn.jenkins-ci.org/trunk/hudson/dtkit/dtkit-format/dtkit-junit-model/src/main/resources/com/thalesgroup/dtkit/junit/model/xsd/junit-4.xsd
  3. * @type {exports}
  4. */
  5. var fs = require('fs');
  6. var mkpath = require('mkpath');
  7. var path = require('path');
  8. var ejs = require('ejs');
  9. var util = require('util');
  10. var Utils = require('../../util/utils.js');
  11. module.exports = new (function() {
  12. var tmpl = __dirname + '/junit.xml.ejs';
  13. var tmplData;
  14. var globalResults;
  15. function loadTemplate(cb) {
  16. if (tmplData) {
  17. cb(tmplData);
  18. return;
  19. }
  20. fs.readFile(tmpl, function (err, data) {
  21. if (err) {
  22. throw err;
  23. }
  24. tmplData = data.toString();
  25. cb(tmplData);
  26. });
  27. }
  28. function adaptAssertions(module) {
  29. Object.keys(module.completed).forEach(function(item) {
  30. var testcase = module.completed[item];
  31. var assertions = testcase.assertions;
  32. for (var i = 0; i < assertions.length; i++) {
  33. if (assertions[i].stackTrace) {
  34. assertions[i].stackTrace = Utils.stackTraceFilter(assertions[i].stackTrace.split('\n'));
  35. }
  36. }
  37. if (testcase.failed > 0 && testcase.stackTrace) {
  38. var stackParts = testcase.stackTrace.split('\n');
  39. var errorMessage = stackParts.shift();
  40. testcase.stackTrace = Utils.stackTraceFilter(stackParts);
  41. testcase.message = errorMessage;
  42. }
  43. });
  44. }
  45. function writeReport(moduleKey, data, opts, callback) {
  46. var module = globalResults.modules[moduleKey];
  47. var pathParts = moduleKey.split(path.sep);
  48. var moduleName = pathParts.pop();
  49. var className = moduleName;
  50. var output_folder = opts.output_folder;
  51. adaptAssertions(module);
  52. if (pathParts.length) {
  53. output_folder = path.join(output_folder, pathParts.join(path.sep));
  54. mkpath.sync(output_folder);
  55. className = pathParts.join('.') + '.' + moduleName;
  56. }
  57. var filename = path.join(output_folder, opts.filename_prefix + moduleName + '.xml');
  58. var rendered = ejs.render(data, {
  59. module: module,
  60. moduleName: moduleName,
  61. className: className,
  62. systemerr: globalResults.errmessages.join('\n')
  63. });
  64. fs.writeFile(filename, rendered, function(err) {
  65. callback(err);
  66. });
  67. }
  68. this.write = function(results, options, callback) {
  69. globalResults = results;
  70. var keys = Object.keys(results.modules);
  71. loadTemplate(function createReport(data) {
  72. var moduleKey = keys.shift();
  73. writeReport(moduleKey, data, options, function(err) {
  74. if (err || (keys.length === 0)) {
  75. callback(err);
  76. } else {
  77. createReport(data);
  78. }
  79. });
  80. });
  81. };
  82. })();