From 24be5c288124563c88553d997ccc7a71a0bc9335 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Thu, 16 Feb 2023 07:59:05 -0800 Subject: [PATCH] cherry-pick(#20927): chore(junit): render project as an agent name / hostname --- .../playwright-test/src/reporters/junit.ts | 20 ++++++++++--------- tests/playwright-test/reporter-junit.spec.ts | 8 +++++--- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/playwright-test/src/reporters/junit.ts b/packages/playwright-test/src/reporters/junit.ts index 4dc1076276..2594f666f8 100644 --- a/packages/playwright-test/src/reporters/junit.ts +++ b/packages/playwright-test/src/reporters/junit.ts @@ -18,7 +18,7 @@ import fs from 'fs'; import path from 'path'; import type { FullConfig, FullResult, Reporter, Suite, TestCase } from '../../types/testReporter'; import { monotonicTime } from 'playwright-core/lib/utils'; -import { formatFailure, formatTestTitle, stripAnsiEscapes } from './base'; +import { formatFailure, stripAnsiEscapes } from './base'; import { assert } from 'playwright-core/lib/utils'; class JUnitReporter implements Reporter { @@ -60,7 +60,7 @@ class JUnitReporter implements Reporter { const children: XMLEntry[] = []; for (const projectSuite of this.suite.suites) { for (const fileSuite of projectSuite.suites) - children.push(this._buildTestSuite(fileSuite)); + children.push(this._buildTestSuite(projectSuite.title, fileSuite)); } const tokens: string[] = []; @@ -91,7 +91,7 @@ class JUnitReporter implements Reporter { } } - private _buildTestSuite(suite: Suite): XMLEntry { + private _buildTestSuite(projectName: string, suite: Suite): XMLEntry { let tests = 0; let skipped = 0; let failures = 0; @@ -106,7 +106,7 @@ class JUnitReporter implements Reporter { ++failures; for (const result of test.results) duration += result.duration; - this._addTestCase(test, children); + this._addTestCase(suite.title, test, children); }); this.totalTests += tests; this.totalSkipped += skipped; @@ -115,9 +115,9 @@ class JUnitReporter implements Reporter { const entry: XMLEntry = { name: 'testsuite', attributes: { - name: suite.location ? path.relative(this.config.rootDir, suite.location.file) : '', + name: suite.title, timestamp: this.timestamp, - hostname: '', + hostname: projectName, tests, failures, skipped, @@ -130,14 +130,16 @@ class JUnitReporter implements Reporter { return entry; } - private _addTestCase(test: TestCase, entries: XMLEntry[]) { + private _addTestCase(suiteName: string, test: TestCase, entries: XMLEntry[]) { const entry = { name: 'testcase', attributes: { // Skip root, project, file - name: test.titlePath().slice(3).join(' '), - classname: formatTestTitle(this.config, test, undefined, true), + name: test.titlePath().slice(3).join(' › '), + // filename + classname: suiteName, time: (test.results.reduce((acc, value) => acc + value.duration, 0)) / 1000 + }, children: [] as XMLEntry[] }; diff --git a/tests/playwright-test/reporter-junit.spec.ts b/tests/playwright-test/reporter-junit.spec.ts index 13e1261e70..479a2bfd64 100644 --- a/tests/playwright-test/reporter-junit.spec.ts +++ b/tests/playwright-test/reporter-junit.spec.ts @@ -237,7 +237,7 @@ test('should not render projects if they dont exist', async ({ runInlineTest }) expect(xml['testsuites']['testsuite'][0]['$']['failures']).toBe('0'); expect(xml['testsuites']['testsuite'][0]['$']['skipped']).toBe('0'); expect(xml['testsuites']['testsuite'][0]['testcase'][0]['$']['name']).toBe('one'); - expect(xml['testsuites']['testsuite'][0]['testcase'][0]['$']['classname']).toContain('a.test.js › one'); + expect(xml['testsuites']['testsuite'][0]['testcase'][0]['$']['classname']).toBe('a.test.js'); expect(result.exitCode).toBe(0); }); @@ -259,18 +259,20 @@ test('should render projects', async ({ runInlineTest }) => { expect(xml['testsuites']['testsuite'].length).toBe(2); expect(xml['testsuites']['testsuite'][0]['$']['name']).toBe('a.test.js'); + expect(xml['testsuites']['testsuite'][0]['$']['hostname']).toBe('project1'); expect(xml['testsuites']['testsuite'][0]['$']['tests']).toBe('1'); expect(xml['testsuites']['testsuite'][0]['$']['failures']).toBe('0'); expect(xml['testsuites']['testsuite'][0]['$']['skipped']).toBe('0'); expect(xml['testsuites']['testsuite'][0]['testcase'][0]['$']['name']).toBe('one'); - expect(xml['testsuites']['testsuite'][0]['testcase'][0]['$']['classname']).toContain('[project1] › a.test.js › one'); + expect(xml['testsuites']['testsuite'][0]['testcase'][0]['$']['classname']).toBe('a.test.js'); expect(xml['testsuites']['testsuite'][1]['$']['name']).toBe('a.test.js'); + expect(xml['testsuites']['testsuite'][1]['$']['hostname']).toBe('project2'); expect(xml['testsuites']['testsuite'][1]['$']['tests']).toBe('1'); expect(xml['testsuites']['testsuite'][1]['$']['failures']).toBe('0'); expect(xml['testsuites']['testsuite'][1]['$']['skipped']).toBe('0'); expect(xml['testsuites']['testsuite'][1]['testcase'][0]['$']['name']).toBe('one'); - expect(xml['testsuites']['testsuite'][1]['testcase'][0]['$']['classname']).toContain('[project2] › a.test.js › one'); + expect(xml['testsuites']['testsuite'][1]['testcase'][0]['$']['classname']).toBe('a.test.js'); expect(result.exitCode).toBe(0); });