-
Notifications
You must be signed in to change notification settings - Fork 0
/
allure_worker.js
166 lines (144 loc) · 6.01 KB
/
allure_worker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
const fs = require("fs");
const convert = require("xml-js");
class AllureWorker {
async generateSuitesFromAllureXml(resultsDir) {
this.resultsDir = resultsDir;
let testSuites = [];
const fileNames = fs.readdirSync(this.resultsDir);
for (const fileName of fileNames) {
if (fileName.includes('.xml')) {
let xmlTestCases;
let result;
try {
let stringXml = fs.readFileSync(`${this.resultsDir}/${fileName}`).toString()
.replaceAll('ns2:test-suite', 'testSuite')
.replaceAll('_attributes', 'atr')
.replaceAll('test-cases', 'testCases')
.replaceAll('stack-trace', 'stackTrace')
.replaceAll('test-case', 'testCase');
let options = {compact: true, ignoreComment: true, spaces: 4};
result = convert.xml2js(stringXml, options);
xmlTestCases = result.testSuite.testCases.testCase;
} catch (e) {
throw new AllureWorkerError('Error when converting xml to js object');
}
let jsonTestCases = await this.extractTestCases(xmlTestCases);
let testSuite = {
start: result.testSuite._attributes.start,
stop: result.testSuite._attributes.stop,
name: result.testSuite.name._text,
title: result.testSuite.title._text,
testCases: jsonTestCases,
};
testSuites.push(testSuite);
}
}
return testSuites;
}
async extractTestCases(xmlTestCases) {
let jsonTestCases = [];
if(Array.isArray(xmlTestCases)) {
for (const xmlTestCase of xmlTestCases) {
let jsonTestCase = await this.extractTestCase(xmlTestCase)
jsonTestCases.push(jsonTestCase);
}
} else if(xmlTestCases._attributes !== undefined) {
let jsonTestCase = await this.extractTestCase(xmlTestCases)
jsonTestCases.push(jsonTestCase);
}
return jsonTestCases;
}
async extractTestCase(xmlTestCase) {
let jsonSteps = await this.extractSteps(xmlTestCase.steps.step);
try {
let failure = (xmlTestCase.failure !== undefined ) ? {
message: xmlTestCase.failure.message._text,
stackTrace: xmlTestCase.failure.stackTrace._text,
} : {};
let testId;
if(xmlTestCase.labels.label.find(l => l._attributes.name === 'testId') !== undefined) {
let testIdArray = xmlTestCase.labels.label.find(l => l._attributes.name === 'testId')._attributes.value.split('/');
testId = testIdArray[testIdArray.length - 1];
} else {
testId = '';
}
let issueId;
if(xmlTestCase.labels.label.find(l => l._attributes.name === 'issue') !== undefined) {
let issueArray = xmlTestCase.labels.label.find(l => l._attributes.name === 'issue')._attributes.value.split('/');
issueId = issueArray[issueArray.length-1];
} else {
issueId = '';
}
let browser;
if (Array.isArray(xmlTestCase.parameters.parameter)) {
browser = xmlTestCase.parameters.parameter.find(x => x._attributes.name === 'browser')._attributes.value;
} else {
browser = '';
}
let jsonTestCase = {
start: xmlTestCase._attributes.start,
stop: xmlTestCase._attributes.stop,
status: xmlTestCase._attributes.status,
testId: testId,
issueId: issueId,
browser:browser,
name: xmlTestCase.name._text,
title: xmlTestCase.title._text,
failure: failure,
steps: jsonSteps,
};
return jsonTestCase;
} catch (e) {
throw new AllureWorkerError('Error when extracting test case');
}
}
async extractSteps(xmlTestSteps) {
let jsonTestSteps = [];
if(Array.isArray(xmlTestSteps)) {
for (const xmlTestStep of xmlTestSteps) {
jsonTestSteps.push(...(await this.extractStep(xmlTestStep)));
}
} else if(xmlTestSteps !== undefined && xmlTestSteps._attributes !== undefined) {
jsonTestSteps.push(...(await this.extractStep(xmlTestSteps)));
}
return jsonTestSteps;
}
async extractStep(step) {
try {
let jsonSteps = []; ;
let attachment;
if (step.attachments.attachment !== undefined ) {
attachment = {
data: fs.readFileSync( `${this.resultsDir}/${step.attachments.attachment._attributes.source}`).toString('base64'),
filename: step.attachments.attachment._attributes.source,
contentType: step.attachments.attachment._attributes.type
}
} else {
attachment = {};
}
let jsonTestStep = {
start: step._attributes.start,
stop: step._attributes.stop,
status: step._attributes.status,
name: step.name,
title: step.title,
attachment: attachment,
};
jsonSteps.push(jsonTestStep);
jsonSteps.push(...(await this.extractSteps(step.steps)))
return jsonSteps;
} catch (e) {
throw new AllureWorkerError('Error when extracting steps');
}
}
}
class AllureWorkerError extends Error {
constructor(message) {
super(message);
if (Error.captureStackTrace) {
Error.captureStackTrace(this, AllureWorkerError);
}
this.name = 'AllureWorkerError';
}
}
module.exports = {AllureWorker};