feat: Include pre-request and post-response tests in JUnit reports (#6284)

* enhance: JUnit output to include preRequest and postResponse test results

* fix: lint
This commit is contained in:
Sanjai Kumar
2025-12-05 12:04:32 +05:30
committed by GitHub
parent b18d582004
commit 80b017f224
2 changed files with 104 additions and 1 deletions

View File

@@ -11,8 +11,10 @@ const makeJUnitOutput = async (results, outputPath) => {
results.forEach((result) => {
const assertionTestCount = result.assertionResults ? result.assertionResults.length : 0;
const preRequestTestCount = result.preRequestTestResults ? result.preRequestTestResults.length : 0;
const testCount = result.testResults ? result.testResults.length : 0;
const totalTests = assertionTestCount + testCount;
const postResponseTestCount = result.postResponseTestResults ? result.postResponseTestResults.length : 0;
const totalTests = assertionTestCount + preRequestTestCount + testCount + postResponseTestCount;
const suite = {
'@name': result.name,
@@ -44,6 +46,24 @@ const makeJUnitOutput = async (results, outputPath) => {
suite.testcase.push(testcase);
});
result.preRequestTestResults
&& result.preRequestTestResults.forEach((test) => {
const testcase = {
'@name': test.description,
'@status': test.status,
'@classname': result.request.url,
'@time': (result.runtime / totalTests).toFixed(3)
};
if (test.status === 'fail') {
suite['@failures']++;
testcase.failure = [{ '@type': 'failure', '@message': test.error }];
}
suite.testcase.push(testcase);
});
result.testResults
&& result.testResults.forEach((test) => {
const testcase = {
@@ -62,6 +82,24 @@ const makeJUnitOutput = async (results, outputPath) => {
suite.testcase.push(testcase);
});
result.postResponseTestResults
&& result.postResponseTestResults.forEach((test) => {
const testcase = {
'@name': test.description,
'@status': test.status,
'@classname': result.request.url,
'@time': (result.runtime / totalTests).toFixed(3)
};
if (test.status === 'fail') {
suite['@failures']++;
testcase.failure = [{ '@type': 'failure', '@message': test.error }];
}
suite.testcase.push(testcase);
});
if (result?.skipped) {
suite['@skipped'] = 1;
} else if (result.error) {

View File

@@ -132,4 +132,69 @@ describe('makeJUnitOutput', () => {
expect(failcase.error[0]['@type']).toBe('error');
expect(failcase.error[0]['@message']).toBe('timeout of 2000ms exceeded');
});
it('should include preRequestTestResults and postResponseTestResults in the junit output', () => {
const results = [
{
name: 'Tests/Suite A',
request: {
method: 'GET',
url: 'https://ima.test'
},
preRequestTestResults: [
{
description: 'A test from Pre Request Script',
status: 'pass'
}
],
testResults: [
{
description: 'A test from Tests tab',
status: 'pass'
}
],
postResponseTestResults: [
{
description: 'A test from Post Response Script',
status: 'pass'
},
{
description: 'A failing test from Post Response Script',
status: 'fail',
error: 'expected 200 to equal 404'
}
],
runtime: 1.2345678
}
];
makeJUnitOutput(results, '/tmp/testfile.xml');
expect(createStub).toBeCalled;
const junit = xmlbuilder.create.mock.calls[0][0];
expect(junit.testsuites).toBeDefined;
expect(junit.testsuites.testsuite.length).toBe(1);
expect(junit.testsuites.testsuite[0].testcase.length).toBe(4);
expect(junit.testsuites.testsuite[0]['@tests']).toBe(4);
const testcase1 = junit.testsuites.testsuite[0].testcase[0];
expect(testcase1['@name']).toBe('A test from Pre Request Script');
expect(testcase1['@status']).toBe('pass');
const testcase2 = junit.testsuites.testsuite[0].testcase[1];
expect(testcase2['@name']).toBe('A test from Tests tab');
expect(testcase2['@status']).toBe('pass');
const testcase3 = junit.testsuites.testsuite[0].testcase[2];
expect(testcase3['@name']).toBe('A test from Post Response Script');
expect(testcase3['@status']).toBe('pass');
const failcase = junit.testsuites.testsuite[0].testcase[3];
expect(failcase['@name']).toBe('A failing test from Post Response Script');
expect(failcase['@status']).toBe('fail');
expect(failcase.failure).toBeDefined;
expect(failcase.failure[0]['@type']).toBe('failure');
expect(failcase.failure[0]['@message']).toBe('expected 200 to equal 404');
});
});