(@wdio/browser-runner): allow services and other hooks to register custom matcher (#12184)

* (@wdio/browser-runner): allow services and other hooks to register custom matcher

* fix unit tests
This commit is contained in:
Christian Bromann 2024-02-05 19:27:15 -08:00 committed by GitHub
parent 319144dee9
commit 9cd5f364ed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 161 additions and 73 deletions

View file

@ -2,4 +2,5 @@ import { vi } from 'vitest'
process.env.WDIO_ASSERTION_LIB_ACTIVATED = '1'
const setOptions = vi.fn()
const expect = vi.fn()
export { setOptions, expect }
const matchers = new Map()
export { setOptions, expect, matchers }

View file

@ -81,7 +81,7 @@ describe('Lit Component testing', () => {
const elem = $('simple-greeting')
await expect(elem).toMatchSnapshot()
await expect(elem).toMatchInlineSnapshot(`"<simple-greeting name="WebdriverIO"></simple-greeting>"`)
await expect(elem).toMatchInlineSnapshot('"<simple-greeting name="WebdriverIO"></simple-greeting>"')
await expect(elem.getCSSProperty('background-color')).toMatchSnapshot()
await expect(elem.getCSSProperty('background-color')).toMatchInlineSnapshot(`
{
@ -318,6 +318,19 @@ describe('Lit Component testing', () => {
expect(await browser.someCustomCommand()).toBe('Hello World')
})
it('supports custom matchers added by services', async () => {
await expect('foo').toBeFoo()
let error
try {
await expect('bar').toBeFoo()
} catch (err) {
error = err
}
expect(error.message).toBe('expected bar to be foo')
})
describe('a11y selectors', () => {
it('aria label is received from element content', async () => {
// https://www.w3.org/TR/accname-1.1/#step2B

View file

@ -2,6 +2,7 @@ import os from 'node:os'
import url from 'node:url'
import path from 'node:path'
import { loadEnv } from 'vite'
import { expect } from '@wdio/globals'
const isMac = os.platform() === 'darwin' && process.env.CI
const isWindows = os.platform() === 'win32'
@ -65,6 +66,28 @@ export const config = {
require: ['./__fixtures__/setup.js']
},
/**
* in order to test custom matchers added by services, we push a service instance
* to the service list
*/
services: [[{
before() {
expect.extend({
toBeFoo(received) {
return received === 'foo'
? {
message: () => `expected ${received} not to be foo`,
pass: true
}
: {
message: () => `expected ${received} to be foo`,
pass: false
}
}
})
}
}, {}]],
before: () => {
/**
* only run this test in lit

View file

@ -17,7 +17,7 @@
"@testing-library/vue": "^8.0.1",
"@types/mocha": "^10.0.6",
"@vitejs/plugin-vue": "^5.0.3",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"mocha": "^10.2.0",
"typescript": "^5.3.3",
"vite": "^5.0.12",

28
package-lock.json generated
View file

@ -13896,9 +13896,9 @@
}
},
"node_modules/expect-webdriverio": {
"version": "4.9.4",
"resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.9.4.tgz",
"integrity": "sha512-uYhTCCCtNcCTB7zWBb7WkGx0vcJ/VHthIvT0zBW73FUA1UB6Lbntodv4INcWFW73sWJkbKmza/zMdGD/ts0fWA==",
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.10.1.tgz",
"integrity": "sha512-62O5H+io//4vgVsC/m//ept0LyFuyKLVnSJQWByWZ1vdkBv9DQAWouILfis867WMUj9sxrZP6pXyLgp285XIkg==",
"dependencies": {
"@vitest/snapshot": "^1.2.2",
"expect": "^29.7.0",
@ -30005,7 +30005,7 @@
"@wdio/utils": "8.29.3",
"deepmerge-ts": "^5.0.0",
"expect": "^29.7.0",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"get-port": "^7.0.0",
"import-meta-resolve": "^4.0.0",
"istanbul-lib-coverage": "^3.2.0",
@ -30575,7 +30575,7 @@
"node": "^16.13 || >=18"
},
"optionalDependencies": {
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"webdriverio": "8.29.7"
}
},
@ -30589,7 +30589,7 @@
"@wdio/logger": "8.28.0",
"@wdio/types": "8.29.1",
"@wdio/utils": "8.29.3",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"jasmine": "^5.0.0"
},
"devDependencies": {
@ -30763,7 +30763,7 @@
"@wdio/types": "8.29.1",
"@wdio/utils": "8.29.3",
"deepmerge-ts": "^5.0.0",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"gaze": "^1.1.2",
"webdriver": "8.29.7",
"webdriverio": "8.29.7"
@ -37061,7 +37061,7 @@
"@wdio/utils": "8.29.3",
"deepmerge-ts": "^5.0.0",
"expect": "^29.7.0",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"get-port": "^7.0.0",
"import-meta-resolve": "^4.0.0",
"istanbul-lib-coverage": "^3.2.0",
@ -37423,7 +37423,7 @@
"@wdio/globals": {
"version": "file:packages/wdio-globals",
"requires": {
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"webdriverio": "8.29.7"
}
},
@ -37436,7 +37436,7 @@
"@wdio/logger": "8.28.0",
"@wdio/types": "8.29.1",
"@wdio/utils": "8.29.3",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"jasmine": "^5.0.0"
}
},
@ -37548,7 +37548,7 @@
"@wdio/types": "8.29.1",
"@wdio/utils": "8.29.3",
"deepmerge-ts": "^5.0.0",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"gaze": "^1.1.2",
"webdriver": "8.29.7",
"webdriverio": "8.29.7"
@ -42323,9 +42323,9 @@
}
},
"expect-webdriverio": {
"version": "4.9.4",
"resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.9.4.tgz",
"integrity": "sha512-uYhTCCCtNcCTB7zWBb7WkGx0vcJ/VHthIvT0zBW73FUA1UB6Lbntodv4INcWFW73sWJkbKmza/zMdGD/ts0fWA==",
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.10.1.tgz",
"integrity": "sha512-62O5H+io//4vgVsC/m//ept0LyFuyKLVnSJQWByWZ1vdkBv9DQAWouILfis867WMUj9sxrZP6pXyLgp285XIkg==",
"requires": {
"@vitest/snapshot": "^1.2.2",
"@wdio/globals": "^8.29.3",

View file

@ -47,7 +47,7 @@
"@wdio/utils": "8.29.3",
"deepmerge-ts": "^5.0.0",
"expect": "^29.7.0",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"get-port": "^7.0.0",
"import-meta-resolve": "^4.0.0",
"istanbul-lib-coverage": "^3.2.0",

View file

@ -1,6 +1,5 @@
import { expect, type MatcherContext, type ExpectationResult, type SyncExpectationResult } from 'expect'
import { MESSAGE_TYPES, type Workers } from '@wdio/types'
import { matchers } from 'virtual:wdio'
import { $ } from '@wdio/globals'
import type { ChainablePromiseElement } from 'webdriverio'
@ -26,14 +25,13 @@ const matcherRequests = new Map<number, MatcherPayload>()
const COMMAND_TIMEOUT = 30 * 1000 // 30s
/**
* Set up expect-webdriverio matchers for the browser environment.
* Every assertion is send to the testrunner via a websocket connection
* and is executed in the Node.js environment. This allows us to enable
* matchers that require Node.js specific modules like `fs` or `child_process`,
* for visual regression or snapshot testing for example.
* Matcher factory enables to run all matchers within the browser by sending all necessary information
* to the worker process and execute the actual assertion in the Node.js environment.
* @param matcherName name of the matcher
* @returns a matcher result computed in the Node.js environment
*/
expect.extend(matchers.reduce((acc, matcherName) => {
acc[matcherName] = async function (context: WebdriverIO.Browser | WebdriverIO.Element | ChainablePromiseElement<WebdriverIO.Element> | ChainablePromiseArray, ...args: any[]) {
function createMatcher (matcherName: string) {
return async function (this: MatcherContext, context: WebdriverIO.Browser | WebdriverIO.Element | ChainablePromiseElement<WebdriverIO.Element> | ChainablePromiseArray, ...args: any[]) {
const cid = getCID()
if (!import.meta.hot || !cid) {
return {
@ -58,26 +56,28 @@ expect.extend(matchers.reduce((acc, matcherName) => {
args: args
}
const isContextObject = typeof context === 'object'
/**
* Check if context is an WebdriverIO.Element
*/
if ('elementId' in context && typeof context.elementId === 'string') {
if (isContextObject && 'elementId' in context && typeof context.elementId === 'string') {
expectRequest.element = context
}
/**
* Check if context is ChainablePromiseElement
*/
if ('then' in context && typeof (context as any).selector === 'object') {
if (isContextObject && 'then' in context && typeof (context as any).selector === 'object') {
expectRequest.element = await context
}
/**
* Check if context is a `Element` and transtform it into a WebdriverIO.Element
* Check if context is a `Element` and transform it into a WebdriverIO.Element
*/
if (context instanceof Element) {
expectRequest.element = await $(context as any as HTMLElement)
} else if (typeof context === 'object' && !('sessionId' in context)) {
} else if (isContextObject && !('sessionId' in context)) {
/**
* check if context is an object or promise and resolve it
* but not pass through the browser object
@ -86,6 +86,11 @@ expect.extend(matchers.reduce((acc, matcherName) => {
if ('then' in context) {
expectRequest.context = await context
}
} else if (!isContextObject) {
/**
* if context is not an object or promise, pass it through
*/
expectRequest.context = context
}
/**
@ -119,7 +124,11 @@ expect.extend(matchers.reduce((acc, matcherName) => {
}
import.meta.hot.send(WDIO_EVENT_NAME, { type: MESSAGE_TYPES.expectRequestMessage, value: expectRequest })
const contextString = 'elementId' in context ? 'WebdriverIO.Element' : 'WebdriverIO.Browser'
const contextString = isContextObject
? 'elementId' in context
? 'WebdriverIO.Element'
: 'WebdriverIO.Browser'
: context
return new Promise<SyncExpectationResult>((resolve, reject) => {
const commandTimeout = setTimeout(
@ -130,16 +139,39 @@ expect.extend(matchers.reduce((acc, matcherName) => {
matcherRequests.set(expectRequest.id, { resolve, commandTimeout })
})
}
return acc
}, {} as Record<string, RawMatcherFn<MatcherContext>>))
}
/**
* request all available matchers from the testrunner
*/
import.meta.hot?.send(WDIO_EVENT_NAME, { type: MESSAGE_TYPES.expectMatchersRequest })
/**
* listen on assertion results from testrunner
*/
import.meta.hot?.on(WDIO_EVENT_NAME, (message: Workers.SocketMessage) => {
/**
* Set up `expect-webdriverio` matchers for the browser environment.
* Every assertion is send to the testrunner via a websocket connection
* and is executed in the Node.js environment. This allows us to enable
* matchers that require Node.js specific modules like `fs` or `child_process`,
* for visual regression or snapshot testing for example.
*
* The testrunner will send a list of available matchers to the browser
* since there might services or other hooks that add custom matchers.
*/
if (message.type === MESSAGE_TYPES.expectMatchersResponse) {
const matchers = message.value.matchers.reduce((acc, matcherName) => {
acc[matcherName] = createMatcher(matcherName)
return acc
}, {} as Record<string, RawMatcherFn<MatcherContext>>)
expect.extend(matchers)
}
if (message.type !== MESSAGE_TYPES.expectResponseMessage) {
return
}
const payload = matcherRequests.get(message.value.id)
if (!payload) {
return console.warn(`Couldn't find payload for assertion result with id ${message.value.id}`)

View file

@ -3,7 +3,6 @@ import path from 'node:path'
import { builtinModules } from 'node:module'
import logger from '@wdio/logger'
import { matchers } from 'expect-webdriverio'
import { polyfillPath } from 'modern-node-polyfills'
import { deepmerge } from 'deepmerge-ts'
import { resolve } from 'import-meta-resolve'
@ -116,7 +115,6 @@ export function testrunner(options: WebdriverIO.BrowserRunnerOptions): Plugin[]
import { fn } from '@wdio/browser-runner'
export const commands = ${JSON.stringify(protocolCommandList)}
export const automationProtocolPath = ${JSON.stringify(automationProtocolPath)}
export const matchers = ${JSON.stringify(Object.keys(matchers))}
export const wrappedFn = (...args) => fn()(...args)
`
}

View file

@ -1,5 +1,6 @@
import path from 'node:path'
import { describe, it, expect, vi } from 'vitest'
import { MESSAGE_TYPES } from '@wdio/types'
import { ServerWorkerCommunicator } from '../../src/communicator.js'
import { SESSIONS } from '../../src/constants.js'
@ -29,7 +30,7 @@ describe('ServerWorkerCommunicator', () => {
await onWorkerMessage({ name: 'sessionEnded', cid: '0-0' }, {}, {})
expect(SESSIONS.size).toBe(0)
expect(communicator.coverageMaps).toHaveLength(0)
await onWorkerMessage({ name: 'workerEvent', args: { type: 7 } }, {}, {})
await onWorkerMessage({ name: 'workerEvent', args: { type: MESSAGE_TYPES.coverageMap } }, {}, {})
expect(communicator.coverageMaps).toHaveLength(1)
const onBrowserEvent = server.onBrowserEvent.mock.calls[0][0]

View file

@ -42,7 +42,7 @@
"access": "public"
},
"optionalDependencies": {
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"webdriverio": "8.29.7"
}
}

View file

@ -37,7 +37,7 @@
"@wdio/logger": "8.28.0",
"@wdio/types": "8.29.1",
"@wdio/utils": "8.29.3",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"jasmine": "^5.0.0"
},
"devDependencies": {

View file

@ -436,7 +436,7 @@ class JasmineAdapter {
// @ts-expect-error not exported in jasmine
const syncMatchers: jasmine.CustomAsyncMatcherFactories = this.#transformMatchers(jasmine.matchers)
const wdioMatchers: jasmine.CustomAsyncMatcherFactories = Object.entries(matchers as Record<string, any>).reduce((prev, [name, fn]) => {
const wdioMatchers: jasmine.CustomAsyncMatcherFactories = [...matchers.entries()].reduce((prev, [name, fn]) => {
prev[name] = () => ({
async compare (...args: unknown[]) {
const context = getConfig()

View file

@ -10,7 +10,7 @@ const buildJasmineFromJestResult = (result: JestExpectationResult, isNot: boolea
}
}
export const jestResultToJasmine = (result: JestExpectationResult, isNot: boolean) => {
export const jestResultToJasmine = (result: JestExpectationResult | Promise<JestExpectationResult>, isNot: boolean) => {
if (result instanceof Promise) {
return result.then(jestStyleResult => buildJasmineFromJestResult(jestStyleResult, isNot))
}

View file

@ -10,9 +10,7 @@ import JasmineAdapterFactory, { JasmineAdapter } from '../src/index.js'
vi.mock('jasmine')
vi.mock('expect-webdriverio', () => ({
expect: {},
matchers: {
toHaveTitle: vi.fn()
},
matchers: new Map([['toHaveTitle', vi.fn()]]),
getConfig: vi.fn()
}))
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
@ -28,7 +26,7 @@ const AFTER_HOOK_IDX = 3
globalThis.jasmine = {
addMatchers: 'addMatchers',
addAsyncMatchers: 'addAsyncMatchers'
}
} as any
const wdioReporter: EventEmitter = {
write: vi.fn(),

View file

@ -10,61 +10,61 @@ exports[`wdio-junit-reporter > can format output 4`] = `"{"a":"@@@@@@@@@@@@@@@@@
exports[`wdio-junit-reporter > can format output 5`] = `"{"a":["@","@","@","@","@","@","@","@","@","@","(90 more items)"]}"`;
exports[`wdio-junit-reporter > ensures that capabilities passed to buildJunitXml are not null/undefined 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="9A261FFAZ006DH.android.10_0"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-googlepixel4.10_0.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > ensures that capabilities passed to buildJunitXml are not null/undefined 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="9A261FFAZ006DH.android.10_0"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-googlepixel4.10_0.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output (Cucumber-style) (with packageName) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-wdio-unit-tests.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output (Cucumber-style) (with packageName) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-wdio-unit-tests.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"><failure/><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="3"failures="1"errors="1"skipped="1"><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"><failure/><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when error options are set (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.755"><failuremessage="expectedtruetoequalfalse"><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></failure><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when error options are set (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.755"><failuremessage="expectedtruetoequalfalse"><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></failure><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when error options are set 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"><failuremessage="uupsi"><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></failure><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when error options are set 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="3"failures="1"errors="1"skipped="1"><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"><failuremessage="uupsi"><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></failure><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having classNameFormat override with cucumber 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="foo-CucumberJUnitReport-iphone.ios.12_1-Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having classNameFormat override with cucumber 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="foo-CucumberJUnitReport-iphone.ios.12_1-Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having classNameFormat override with mocha 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="foo-chrome.65_0_3325_181.macosx-Myawesomefeature"name="shouldcandosomething"time="0.727"><failure/><errormessage="Received:&quot;5&quot;"/><system-err><![CDATA[Received:"5"atContext.<anonymous>(/some/file.js:10:15)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having classNameFormat override with mocha 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="foo-chrome.65_0_3325_181.macosx-Myawesomefeature"name="shouldcandosomething"time="0.727"><failure/><errormessage="Received:&quot;5&quot;"/><system-err><![CDATA[Received:"5"atContext.<anonymous>(/some/file.js:10:15)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having nested array of suites 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="MyLoginapplication"timestamp="2023-08-22T02:27:55.370Z"time="6.141"tests="1"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="MyLoginapplication"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync_0.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_Login_application"name="shouldloginwithvalidcredentials"time="6.14"/></testsuite><testsuitename="MyLoginapplication"timestamp="2023-08-22T02:28:01.511Z"time="0.852"tests="1"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="MyLoginapplication"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync_1.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_Login_application"name="shouldloginwithvalidcredentials"time="0.852"/></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having nested array of suites 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="2"failures="0"errors="0"skipped="0"><testsuitename="MyLoginapplication"timestamp="2023-08-22T02:27:55.370Z"time="6.141"tests="1"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="MyLoginapplication"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync_0.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_Login_application"name="shouldloginwithvalidcredentials"time="6.14"/></testsuite><testsuitename="MyLoginapplication"timestamp="2023-08-22T02:28:01.511Z"time="0.852"tests="1"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="MyLoginapplication"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync_1.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_Login_application"name="shouldloginwithvalidcredentials"time="0.852"/></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having nested suites 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Parent"timestamp="2021-08-29T18:23:27.540Z"time="0.01"tests="0"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Parent"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties></testsuite><testsuitename="Child1"timestamp="2021-08-29T18:23:27.541Z"time="0.006"tests="0"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Child1"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties></testsuite><testsuitename="Subchild1"timestamp="2021-08-29T18:23:27.541Z"time="0.005"tests="1"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Subchild1"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.Parent.Child_1.Sub_child_1"name="test1"time="0.004"/></testsuite><testsuitename="Child2"timestamp="2021-08-29T18:23:27.547Z"time="0.003"tests="1"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Child2"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.Parent.Child_2"name="test2"time="0.002"><system-out><![CDATA[COMMAND:deleteSession-{}RESULT:undefined]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having nested suites 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="2"failures="0"errors="0"skipped="0"><testsuitename="Parent"timestamp="2021-08-29T18:23:27.540Z"time="0.01"tests="0"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Parent"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties></testsuite><testsuitename="Child1"timestamp="2021-08-29T18:23:27.541Z"time="0.006"tests="0"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Child1"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties></testsuite><testsuitename="Subchild1"timestamp="2021-08-29T18:23:27.541Z"time="0.005"tests="1"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Subchild1"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.Parent.Child_1.Sub_child_1"name="test1"time="0.004"/></testsuite><testsuitename="Child2"timestamp="2021-08-29T18:23:27.547Z"time="0.003"tests="1"failures="0"errors="0"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Child2"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.Parent.Child_2"name="test2"time="0.002"><system-out><![CDATA[COMMAND:deleteSession-{}RESULT:undefined]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having testSuiteNameFormat override with cucumber 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="foo-suiteNameFormat-Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.foo-suiteNameFormat-Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having testSuiteNameFormat override with cucumber 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="foo-suiteNameFormat-Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.foo-suiteNameFormat-Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having testSuiteNameFormat override with mocha 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="foosuiteNameFormatMyawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><failure/><errormessage="Received:&quot;5&quot;"/><system-err><![CDATA[Received:"5"atContext.<anonymous>(/some/file.js:10:15)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when having testSuiteNameFormat override with mocha 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="foosuiteNameFormatMyawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><failure/><errormessage="Received:&quot;5&quot;"/><system-err><![CDATA[Received:"5"atContext.<anonymous>(/some/file.js:10:15)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when the addFileAttribute option is set (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.755"file="file:///features/sample_feature.feature"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when the addFileAttribute option is set (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.755"file="file:///features/sample_feature.feature"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when the addFileAttribute option is set 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"file="/path/to/project/test/specs/sync.spec.js"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"file="/path/to/project/test/specs/sync.spec.js"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"file="/path/to/project/test/specs/sync.spec.js"><failure/><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output correctly when the addFileAttribute option is set 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="3"failures="1"errors="1"skipped="1"><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"file="/path/to/project/test/specs/sync.spec.js"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"file="/path/to/project/test/specs/sync.spec.js"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"file="/path/to/project/test/specs/sync.spec.js"><failure/><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output for multiple describe blocks 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"><failure/><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite><testsuitename="Myawesomefeature3"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature3"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature3"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature3"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature3"name="shouldfailatest"time="0.014"><failure/><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output for multiple describe blocks 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="6"failures="2"errors="2"skipped="2"><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"><failure/><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite><testsuitename="Myawesomefeature3"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature3"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature3"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature3"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature3"name="shouldfailatest"time="0.014"><failure/><errormessage="uupsi"/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out><system-err><![CDATA[Error:uupsiatContext.it(/path/to/project/test/specs/sync.spec.js:18:15)at/path/to/project/packages/wdio-sync/src/index.js:28:28atPromise(<anonymous>)atF(/path/to/project/node_modules/core-js/library/modules/_export.js:35:28)atContext.executeSync(/path/to/project/packages/wdio-sync/src/index.js:26:12)at/path/to/project/packages/wdio-sync/src/index.js:161:33]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output if after each hook failed 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2019-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="aftereachhookfortestname"time="0.000002"><failure/><errormessage="aftereach"/><system-err><![CDATA[Error:aftereachstacktrace]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output if after each hook failed 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Myawesomefeature"timestamp="2019-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="aftereachhookfortestname"time="0.000002"><failure/><errormessage="aftereach"/><system-err><![CDATA[Error:aftereachstacktrace]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output if before all hook failed 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2019-04-17T09:10:10.255Z"time="0.745"tests="2"failures="2"errors="2"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="beforeallhook"time="0.000002"><failure/><errormessage="beforeall"/><system-err><![CDATA[Error:beforeallstacktrace]]></system-err></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="afterallhook"time="0.000001"><failure/><errormessage="afterall"/><system-err><![CDATA[Error:afterallstacktrace]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output if before all hook failed 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="2"failures="2"errors="2"skipped="0"><testsuitename="Myawesomefeature"timestamp="2019-04-17T09:10:10.255Z"time="0.745"tests="2"failures="2"errors="2"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="beforeallhook"time="0.000002"><failure/><errormessage="beforeall"/><system-err><![CDATA[Error:beforeallstacktrace]]></system-err></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="afterallhook"time="0.000001"><failure/><errormessage="afterall"/><system-err><![CDATA[Error:afterallstacktrace]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output if before each hook failed 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2019-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="beforeeachhookfortestname"time="0.000002"><failure/><errormessage="beforeeach"/><system-err><![CDATA[Error:beforeeachstacktrace]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output if before each hook failed 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Myawesomefeature"timestamp="2019-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="beforeeachhookfortestname"time="0.000002"><failure/><errormessage="beforeeach"/><system-err><![CDATA[Error:beforeeachstacktrace]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output when test is marked as skipped 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="testsuite"timestamp="2021-07-19T12:19:01.029Z"time="0.014"tests="2"failures="0"errors="0"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="testsuite"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.testsuite"name="test"time="0.01"><skipped/><system-err><![CDATA[Stacktrace]]></system-err></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.testsuite"name="test"time="0.002"/></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output when test is marked as skipped 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="2"failures="0"errors="0"skipped="1"><testsuitename="testsuite"timestamp="2021-07-19T12:19:01.029Z"time="0.014"tests="2"failures="0"errors="0"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="testsuite"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.testsuite"name="test"time="0.01"><skipped/><system-err><![CDATA[Stacktrace]]></system-err></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.testsuite"name="test"time="0.002"/></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output with correct information when test is ran against Browserstack for Android apps 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="9A261FFAZ006DH.android.10_0"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-googlepixel4.android.10_0.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output with correct information when test is ran against Browserstack for Android apps 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="9A261FFAZ006DH.android.10_0"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-googlepixel4.android.10_0.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output with correct information when test is ran against Browserstack for iOS apps 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.13.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output with correct information when test is ran against Browserstack for iOS apps 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:10:04.659Z"time="15.907"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.13.Samplefeature"name="Samplescenario"time="1.755"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output without ansi 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><failure/><errormessage="Received:&quot;5&quot;"/><system-err><![CDATA[Received:"5"atContext.<anonymous>(/some/file.js:10:15)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > generates xml output without ansi 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><failure/><errormessage="Received:&quot;5&quot;"/><system-err><![CDATA[Received:"5"atContext.<anonymous>(/some/file.js:10:15)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > has a suiteNameFormat option for setting names manually 1`] = `"Skipped_ _test"`;
exports[`wdio-junit-reporter > scenario will be marked failed if a single scenario step fails (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:37:06.927Z"time="17.098"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.983"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed❗Whenstephasfailed⚠️Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > scenario will be marked failed if a single scenario step fails (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T19:37:06.927Z"time="17.098"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.983"><failure/><errormessage="expectedtruetoequalfalse"/><system-out><![CDATA[✅Givenstephaspassed❗Whenstephasfailed⚠️Thenstephasfailed]]></system-out><system-err><![CDATA[AssertionError:expectedtruetoequalfalseatWorld.<anonymous>(./step_definitions/steps.js:642:21)]]></system-err></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > scenario will be marked failed if a single scenario step throws an error but there is no error object in JSON (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T20:05:44.955Z"time="14.862"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.182"><failure/><error/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstepiscausingerror]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > scenario will be marked failed if a single scenario step throws an error but there is no error object in JSON (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T20:05:44.955Z"time="14.862"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.182"><failure/><error/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstepiscausingerror]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > scenario will be marked failed if a single scenario step throws an error but there is no error object in JSON 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"><failure/><error/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > scenario will be marked failed if a single scenario step throws an error but there is no error object in JSON 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="3"failures="1"errors="1"skipped="1"><testsuitename="Myawesomefeature"timestamp="2018-04-17T09:10:10.255Z"time="0.745"tests="3"failures="1"errors="1"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="suiteName"value="Myawesomefeature"/><propertyname="capabilities"value="chrome.65_0_3325_181.macosx"/><propertyname="file"value="/path/to/project/test/specs/sync.spec.js"/></properties><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldcandosomething"time="0.727"><system-out><![CDATA[COMMAND:POST/session/4875944f97c944d80e944a399b682656/url-{"url":"http://google.com/"}RESULT:{"url":"http://google.com/"}COMMAND:GET/session/4875944f97c944d80e944a399b682656/title-{}RESULT:{}]]></system-out></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldskipatest"time="0"><skipped/></testcase><testcaseclassname="chrome.65_0_3325_181.macosx.My_awesome_feature"name="shouldfailatest"time="0.014"><failure/><error/><system-out><![CDATA[COMMAND:GET/session/4875944f97c944d80e944a399b682656/log/types-{}RESULT:{}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"browser"}COMMAND:POST/session/4875944f97c944d80e944a399b682656/log-{"type":"driver"}RESULT:{"type":"driver"}RESULT:{"type":"browser"}COMMAND:DELETE/session/4875944f97c944d80e944a399b682656-{}RESULT:{}]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > scenario will be marked skipped if a single scenario step is pending (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T19:59:54.847Z"time="15.237"tests="1"failures="0"errors="0"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="0.867"><skipped/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed⚠️Thenstepispending]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > scenario will be marked skipped if a single scenario step is pending (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="0"errors="0"skipped="1"><testsuitename="Samplefeature"timestamp="2019-12-13T19:59:54.847Z"time="15.237"tests="1"failures="0"errors="0"skipped="1"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="0.867"><skipped/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed⚠️Thenstepispending]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > should build the xml if feature and scenario are unordered in JSON (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuites><testsuitename="Samplefeature"timestamp="2019-12-13T20:05:44.955Z"time="14.862"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.182"><failure/><error/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstepiscausingerror]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > should build the xml if feature and scenario are unordered in JSON (Cucumber-style) 1`] = `"<?xmlversion="1.0"encoding="UTF-8"?><testsuitestests="1"failures="1"errors="1"skipped="0"><testsuitename="Samplefeature"timestamp="2019-12-13T20:05:44.955Z"time="14.862"tests="1"failures="1"errors="1"skipped="0"><properties><propertyname="specId"value="0"/><propertyname="featureName"value="Samplefeature"/><propertyname="capabilities"value="iphone.ios.12_1"/><propertyname="featureFile"value="file:///features/sample_feature.feature"/></properties><testcaseclassname="CucumberJUnitReport-iphone.ios.12_1.Samplefeature"name="Samplescenario"time="1.182"><failure/><error/><system-out><![CDATA[✅Givenstephaspassed✅Whenstephaspassed❗Thenstepiscausingerror]]></system-out></testcase></testsuite></testsuites>"`;
exports[`wdio-junit-reporter > should prepare name 1`] = `"Skipped test"`;

View file

@ -36,7 +36,7 @@
"@wdio/types": "8.29.1",
"@wdio/utils": "8.29.3",
"deepmerge-ts": "^5.0.0",
"expect-webdriverio": "^4.9.3",
"expect-webdriverio": "^4.10.1",
"gaze": "^1.1.2",
"webdriver": "8.29.7",
"webdriverio": "8.29.7"

View file

@ -231,6 +231,13 @@ export default class BrowserFramework implements Omit<TestFramework, 'init'> {
if (message.type === MESSAGE_TYPES.browserTestResult) {
return this.#handleTestFinish(message.value)
}
if (message.type === MESSAGE_TYPES.expectMatchersRequest) {
return this.#sendWorkerResponse(
id,
this.#expectMatcherResponse({ matchers: Array.from(matchers.keys()) })
)
}
}
async #handleHook (id: number, payload: Workers.HookTriggerEvent) {
@ -247,6 +254,13 @@ export default class BrowserFramework implements Omit<TestFramework, 'init'> {
return this.#sendWorkerResponse(id, this.#hookResponse({ id: payload.id, error }))
}
#expectMatcherResponse (value: Workers.ExpectMatchersResponse): Workers.SocketMessage {
return {
type: MESSAGE_TYPES.expectMatchersResponse,
value
}
}
#hookResponse (value: Workers.HookResultEvent): Workers.SocketMessage {
return {
type: MESSAGE_TYPES.hookResultMessage,
@ -335,7 +349,7 @@ export default class BrowserFramework implements Omit<TestFramework, 'init'> {
/**
* find matcher, e.g. `toBeDisplayed` or `toHaveTitle`
*/
const matcher = matchers[payload.matcherName as keyof typeof matchers]
const matcher = matchers.get(payload.matcherName)
if (!matcher) {
const message = `Couldn't find matcher with name "${payload.matcherName}"`
return this.#sendWorkerResponse(id, this.#expectResponse({ id: payload.id, pass: false, message }))

View file

@ -85,6 +85,8 @@ export enum MESSAGE_TYPES {
hookResultMessage,
expectRequestMessage,
expectResponseMessage,
expectMatchersRequest,
expectMatchersResponse,
coverageMap,
customCommand,
initiateBrowserStateRequest,
@ -109,6 +111,8 @@ export type SocketMessageValue = {
[MESSAGE_TYPES.hookResultMessage]: HookResultEvent
[MESSAGE_TYPES.expectRequestMessage]: ExpectRequestEvent
[MESSAGE_TYPES.expectResponseMessage]: ExpectResponseEvent
[MESSAGE_TYPES.expectMatchersRequest]: never
[MESSAGE_TYPES.expectMatchersResponse]: ExpectMatchersResponse
[MESSAGE_TYPES.coverageMap]: any
[MESSAGE_TYPES.customCommand]: CustomCommandEvent
[MESSAGE_TYPES.initiateBrowserStateRequest]: BrowserStateRequest
@ -129,6 +133,10 @@ export interface ConsoleEvent {
cid: string
}
export interface ExpectMatchersResponse {
matchers: string[]
}
export interface BrowserTestResults {
failures: number
events: any[]