npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@postman/wdio-junit-reporter

v0.0.3

Published

A WebdriverIO reporter that creates Jenkins compatible XML based JUnit reports

Downloads

134,079

Maintainers

brekk.bockrathbrekk.bockrathdylanglennpostmandylanglennpostmanakarshts007akarshts007ankiteshankiteshpost-abhigyanpost-abhigyanaravindrajraravindrajrarpitsuman601arpitsuman601nelly_ghazaryannelly_ghazaryaneeroreerorgopikrishna.sgopikrishna.syashasvi13yashasvi13dylansddylansdvivek.nigamvivek.nigamkundan.kumar09kundan.kumar09soumya.agarwal.postmansoumya.agarwal.postmandashrath.yadavdashrath.yadavayush.shrivastavayush.shrivastavsouris.ashsouris.ashprateek.postmanprateek.postmanamaldinesh7amaldinesh7tree6789tree6789saifali_postmansaifali_postmanandrusyshynandrusyshynadarsh.agrawaladarsh.agrawalekam.waliaekam.waliaabhishekpostmanabhishekpostmannabeel.nnabeel.nvasudha.madugulavasudha.madugulajj.liujj.liusaksham-postmansaksham-postmanmmocarskimmocarskipostman-maddiepostman-maddieyashkumarkyashkumarkigor-fesenko-postmanigor-fesenko-postmankhudadad.nomanikhudadad.nomaniaris.villarealaris.villarealpraveen.thirumuruganpraveen.thirumuruganamit-gpamit-gpchowwinstonpostmanchowwinstonpostmanharsh.poddarharsh.poddarmatthew.pinskermatthew.pinskeranimesh.jajooanimesh.jajoonimish.agrawalnimish.agrawalkaran-chawla1karan-chawla1yash.gupta007yash.gupta007josh-postmanjosh-postmanchoowon.sirchoowon.sirchristianareas-postmanchristianareas-postmantch-postmantch-postmanvaibhaw.kumarvaibhaw.kumarabhishek_postmanabhishek_postmansoumadeep.acharyasoumadeep.acharyaaquibjr-postmanaquibjr-postmankrishna-postmankrishna-postmanalex.mortonalex.mortonsalilgupta_postmansalilgupta_postmansteeve.betesteeve.betezubair.lawrencezubair.lawrencemxdavismxdavismxdavis-postmanmxdavis-postmanshy.alter.postmanshy.alter.postmaneric-postmaneric-postmandmytro.markovdmytro.markovabhishek.pawarabhishek.pawarabhishek.raj87abhishek.raj87eddie.davieseddie.daviesshubham.shukla-postmanshubham.shukla-postmanbasile.barrinciobasile.barrinciohoanguyennhoanguyennshreyansh.goyalshreyansh.goyalharikrishna.postmanharikrishna.postmansajal001sajal001dima-postmandima-postmanihor.mariichynihor.mariichynandrii.lymychandrii.lymychmichael.browningmichael.browningyevhenii.stepanovyevhenii.stepanovakshat-nemaakshat-nemapostman-web-platform-functional-accountpostman-web-platform-functional-accountian.cundiffian.cundiffrebecca.krosnickrebecca.krosnicksoriatsoriatmeetsuraj2meetsuraj2nitish-postmannitish-postmanshub_postmanshub_postmanjoshnedelkapostmanjoshnedelkapostmankevin.corbettkevin.corbettcarlos.garcia.postmancarlos.garcia.postmananirudh.msanirudh.msakira28akira28cecilytorocecilytorosumedha.kulkarnisumedha.kulkarnisuman.dassuman.dasyashishduayashishduarljohnsnrljohnsnsalomekbg_postmansalomekbg_postmanvtysonvtysonindraneel_postmanindraneel_postmangrantkingpostmangrantkingpostmanshivangibajpai12shivangibajpai12abhilash-postmanabhilash-postmanraghavendra-postmanraghavendra-postmanravi-postmanravi-postmanjedliu-postmanjedliu-postmanamaan.khan.postmanamaan.khan.postmandiwakarshukla_postmandiwakarshukla_postmanimran.munirimran.munirmarkgritterpmmarkgritterpmshruthiveeshruthiveerajaswarajaswaaki-kusanagiaki-kusanagiyokawasayokawasaankit834ankit834saurabh.agarwalsaurabh.agarwalitsaamirpostmanitsaamirpostmanpostmanautpostmanautnoah.schwartznoah.schwartzdkrapedkrapesaurabh.vartaksaurabh.vartakwheatspaghettiwheatspaghettihimanshu.ng056himanshu.ng056honeynairhoneynairtonyzebastiantonyzebastiankasey.seokasey.seoparthvermaparthvermaneha.kauraneha.kaurajosephpsjosephpsparthpvermaparthpvermamuskaan06muskaan06akshay_postmanakshay_postmanjeroenvdpolljeroenvdpollharsuyashharsuyashayush.chowdhuryayush.chowdhuryplgahplgahsobtiankitsobtiankitsmoyasmoyamcturcomcturcoskatikiaskatikiadhinesh.sridhardhinesh.sridharaman-pmaman-pmalexgul4enkoalexgul4enkopamzanipamzanifran.mendezfran.mendezguru.pochineniguru.pochineninavneetbholenavneetbholepiyush.dagapiyush.dagahimanshu.vishwakarmahimanshu.vishwakarmashraddha-arora-postmanshraddha-arora-postmananshitbansalanshitbansalprathameshhprathameshhnitishpostmannitishpostmanyashja.inyashja.invarshini59varshini59aviralpostmanaviralpostmantheerthasenantheerthasenanshikharpostmanshikharpostmanamanpostmanamanpostmangreenblade29greenblade29anuragmewaranuragmewarchris_pmchris_pmjk-postmanjk-postmantphippstphippsakshay.kulkarniakshay.kulkarnivedkribhuvedkribhusamarth.gulatisamarth.gulatirazvi07razvi07cleveromcleveromplanetabhiplanetabhitiara.johnsontiara.johnsonjoe.fuscojoe.fuscojonathanhavivjonathanhavivmudit.joshimudit.joshipiyush.rpiyush.ranjali2022anjali2022gkorosc-postmangkorosc-postmanraisintenraisintenitsaamiritsaamirvinayak.parasharvinayak.parasharrafaeltfrafaeltfapoorv.gupta.postmanapoorv.gupta.postmanadrian.santanaadrian.santanakylerrenn94kylerrenn94jelle.vandeveldejelle.vandeveldeatanas.aatanas.asamithjaganathsamithjaganathpranavj2000pranavj2000pwitcherpwitcheranandh619anandh619diegog24diegog24kevinswiber-postmankevinswiber-postmansanketpathsanketpathopi-danihelkaopi-danihelkaarvind.khadriarvind.khadricboornaziancboornazianirena-postmanirena-postmanrohan.groverrohan.grovervincentbarthvincentbarthaniketbewalaniketbewalromulo-nascimentoromulo-nascimentoruben.barautruben.barautarsh_13arsh_13rtlockwoodrtlockwoodharshit.kocharharshit.kocharauddypostmanauddypostmanpatricksevatpatricksevatakinard-pmakinard-pmlaszlogreczilaszlogreczibhoomikaduapostmanbhoomikaduapostmanroy-himanshuroy-himanshunidhi_goyalnidhi_goyalalexander-rubiaalexander-rubiaarjun.golabhanviarjun.golabhanvianil.jnanojianil.jnanojigbadebo.bellogbadebo.bellojatin-postmanjatin-postmanbharadwajpoduri7bharadwajpoduri7liteshpatil17liteshpatil17tilak-patel-postmantilak-patel-postmanhasnain.rajanhasnain.rajanelizabeth.fungelizabeth.fungpreetham.mpreetham.mdhuhindhan.ilangodhuhindhan.ilangonishat.sayyednishat.sayyedrubencasasrubencasassterling.chin-postmansterling.chin-postmananubhav-vatsanubhav-vatstimhalltimhallasutosh.sahooasutosh.sahooprasant.patelprasant.patelbot_marketing_engineeringbot_marketing_engineeringshreyansh_postshreyansh_postvaishnavichallavaishnavichallalorenzo.ambrosilorenzo.ambrosiarnaudlauret_postmanarnaudlauret_postmanchristina.hastenrathplus1christina.hastenrathplus1postman-dakshraj.sharmapostman-dakshraj.sharmaekansh-01ekansh-01devsharmadevsharmaayushman9454ayushman9454tonygotonygopostmanianpostmaniandavidtran33davidtran33akkeshavanakkeshavanrishabh.shuklarishabh.shuklariyasainiriyasainiyash-postmanyash-postmankarnsharmakarnsharmapriyambadamadalapriyambadamadalasuhas_gaikwadsuhas_gaikwaddarshan.sendarshan.senyatin1997yatin1997kartikjkartikjsaswatdssaswatdssujayvenaiksujayvenaikkratigyakratigyashubham.ranjanshubham.ranjandavidespidavidespinumaanashrafnumaanashrafshamasisshamasisabhijitkaneabhijitkanehg07hg07kamalaknnkamalaknnnikithaachhininikithaachhinishreyas.pandurangashreyas.pandurangapratiksolimpratiksolimsivcansinghsivcansinghbhargavkaranam96bhargavkaranam96ronak.npmronak.npmcodenirvanacodenirvanatristandenyertristandenyersabih.siddiquisabih.siddiquishashwat.dixitshashwat.dixitkriss1897kriss1897gunjan4542gunjan4542meetdevelopermeetdeveloperpawanbanapawanbanashreyshahshreyshahvshingalavshingalabarshan23barshan23coditvacoditvaskrplskrpljibinmathews7jibinmathews7diudadiudapostbot-bitbucketpostbot-bitbucketpostbot-buildkitepostbot-buildkitedannydaintondannydaintonbrandonmcastillobrandonmcastillomichaelclausmichaelclausdevansh21devansh21arshad.ayubarshad.ayubsharma.nikhil1997sharma.nikhil1997smitshah173smitshah173atishay-postmanatishay-postmansaket_ranjansaket_ranjandhawan29dhawan29arlemi.postmanarlemi.postmanpankajk0791pankajk0791mdamankhmdamankhapoorvajain08apoorvajain08arvind-kalraarvind-kalradiptaragdiptaragdip_postmandip_postmanakshay24akshay24chetan.waingankarchetan.waingankarbalakrishna.avulapatibalakrishna.avulapatiharsha.dixitharsha.dixitsaialekhya.yerraguntasaialekhya.yerraguntapranav.singhalpranav.singhalamrindersandhuamrindersandhudeepanshuranadeepanshuranamudit1804mudit1804prashant-raghuprashant-raghuwaseem.siddiquiwaseem.siddiquihemendra.kumarhemendra.kumarbswisherbswisherhimanshu0809himanshu0809avinashchoudharyavinashchoudharygouthamajgouthamajdev-pawankumardev-pawankumartim.beauchamptim.beauchampamrit_vyasamrit_vyasayush.rajayush.rajbrent.cromartybrent.cromartysandeep.singhsandeep.singhabhijeetboroleabhijeetborolemehul.agrawalmehul.agrawalsonymathewsonymathewhardik286hardik286appurvamurawatappurvamurawatphani-postmanphani-postmanchinmayj195chinmayj195harsh_bansalharsh_bansalsrinivas.kinisrinivas.kinijony.cheung.postmanjony.cheung.postmanrrc083rrc083diya.ninandiya.ninanshruti_paranjapeshruti_paranjapeutsav.kapoor1994utsav.kapoor1994abhishek_sabhishek_ssubhash.yadavsubhash.yadavpankajkumar05pankajkumar05prithvi.tharunprithvi.tharunashish.gupta1ashish.gupta1bot.npm.cf.starshipbot.npm.cf.starshipmeenakshi.dhananimeenakshi.dhanani

Readme

WebdriverIO XML Reporter

A WebdriverIO reporter that creates Jenkins compatible XML based JUnit reports

Installation

The easiest way is to keep @wdio/junit-reporter as a devDependency in your package.json.

{
  "devDependencies": {
    "@wdio/junit-reporter": "^6.3.6"
  }
}

You can simple do it by:

npm install @wdio/junit-reporter --save-dev

Instructions on how to install WebdriverIO can be found here.

Output

This reporter will output a report for each runner, so in turn you will receive an xml report for each spec file. Below are examples of XML output given different scenarios in the spec file.

Single describe block

describe('a test suite', () => {
    it('a test case', function () {
      // do something
      // assert something
    });
});

becomes

<testsuites>
    <testsuite name="a test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
        <properties>
          <property name="specId" value="0"/>
          <property name="suiteName" value="a test suite"/>
          <property name="capabilities" value="chrome"/>
          <property name="file" value=".\test\specs\asuite.spec.js"/>
        </properties>
        <testcase classname="chrome.a_test_case" name="a_test_suite_a_test_case" time="11.706"/>
    </testsuite>
</testsuites>

Nested describe block

describe('a test suite', () => {
    describe('a nested test suite', function() {
        it('a test case', function () {
          // do something
          // assert something
        });
    });
});

becomes

<testsuites>
    <testsuite name="a test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
    <properties>
      <property name="specId" value="0"/>
      <property name="suiteName" value="a test suite"/>
      <property name="capabilities" value="chrome"/>
      <property name="file" value=".\test\specs\asuite.spec.js"/>
    </properties>
  </testsuite>
  <testsuite name="a nested test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
    <properties>
      <property name="specId" value="0"/>
      <property name="suiteName" value="a nested test suite"/>
      <property name="capabilities" value="chrome"/>
      <property name="file" value=".\test\specs\asuite.spec.js"/>
    </properties>
    <testcase classname="chrome.a_test_case" name="a_nested_test_suite_a_test_case" time="11.706"/>
  </testsuite>
</testsuites>

Multiple describe block

describe('a test suite', () => {
    it('a test case', function () {
      // do something
      // assert something
    });
});
describe('a second test suite', () => {
    it('a second test case', function () {
      // do something
      // assert something
    });
});

becomes

<testsuites>
    <testsuite name="a test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
    <properties>
      <property name="specId" value="0"/>
      <property name="suiteName" value="a test suite"/>
      <property name="capabilities" value="chrome"/>
      <property name="file" value=".\test\specs\asuite.spec.js"/>
      <testcase classname="chrome.a_test_case" name="a_nested_test_suite_a_test_case" time="11.706"/>
    </properties>
  </testsuite>
  <testsuite name="a second test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
    <properties>
      <property name="specId" value="0"/>
      <property name="suiteName" value="a second test suite"/>
      <property name="capabilities" value="chrome"/>
      <property name="file" value=".\test\specs\asuite.spec.js"/>
    </properties>
    <testcase classname="chrome.a_second_test_case" name="a_second_test_suite_a_second_test_case" time="11.706"/>
  </testsuite>
</testsuites>

Failures and Errors

All test case failures are mapped as JUnit test case errors. A failed test case due to assertion failure or error will look like:

<testcase classname="chrome.a_test_case" name="a_test_suite_a_test_case" time="0.372">
  <error message="Error: some error"/>
    <system-err>
        <![CDATA[
Error: some assertion failure
    at UserContext.<anonymous> (C:\repo\webdriver-example\test\specs/a_test_suite.spec.js:22:17)
]]>
  </system-err>
</testcase>

Configuration

Following code shows the default wdio test runner configuration. Just add 'junit' as reporter to the array. To get some output during the test you can run the WDIO Dot Reporter and the WDIO JUnit Reporter at the same time:

// wdio.conf.js
module.exports = {
    // ...
    reporters: [
        'dot',
        ['junit', {
            outputDir: './',
            outputFileFormat: function(options) { // optional
                return `results-${options.cid}.${options.capabilities}.xml`
            }
        }]
    ],
    // ...
};

The following options are supported:

outputDir

Define a directory where your xml files should get stored.

Type: String Required

outputFileFormat

Define the xml files created after the test execution.

Type: Object Default: function (opts) { return `wdio-${this.cid}-${name}-reporter.log` }

outputFileFormat: function (options) {
    return 'mycustomfilename.xml';
}

Note: options.capabilities is your capabilities object for that runner, so specifying ${options.capabilities} in your string will return [Object object]. You must specify which properties of capabilities you want in your filename.

suiteNameFormat

Gives the ability to provide custom regex for formatting test suite name (e.g. in output xml ).

Type: Regex, Default: /[^a-z0-9]+/

addFileAttribute

Adds a file attribute to each testcase. This config is primarily for CircleCI. This setting provides richer details but may break on other CI platforms.

Type: Boolean, Default: false

packageName

You can break out packages by an additional level by setting 'packageName'. For example, if you wanted to iterate over a test suite with different environment variable set:

Type: String Example:

// wdio.conf.js
module.exports = {
    // ...
    reporters: [
        'dot',
        ['junit', {
            outputDir: './',
            packageName: process.env.USER_ROLE // chrome.41 - administrator
        }]
    ]
    // ...
};

errorOptions

Allows to set various combinations of error notifications inside xml. Given a Jasmine test like expect(true).toBe(false, 'my custom message') you will get this test error:

{
    matcherName: 'toBe',
    message: 'Expected true to be false, \'my custom message\'.',
    stack: 'Error: Expected true to be false, \'my custom message\'.\n    at UserContext.it (/home/mcelotti/Workspace/WebstormProjects/forcebeatwio/test/marco/prova1.spec.js:3:22)',
    passed: false,
    expected: [ false, 'my custom message' ],
    actual: true
}

Therefore you can choose which key will be used where, see the example below.

Type: Object, Default: errorOptions: { error: "message" } Example:

// wdio.conf.js
module.exports = {
    // ...
    reporters: [
        'dot',
        ['junit', {
            outputDir: './',
            errorOptions: {
                error: 'message',
                failure: 'message',
                stacktrace: 'stack'
            }
        }]
    ],
    // ...
};

Jenkins Setup

Last but not least you need to tell your CI job (e.g. Jenkins) where it can find the xml file. To do that, add a post-build action to your job that gets executed after the test has run and point Jenkins (or your desired CI system) to your XML test results:

Point Jenkins to XML files

If there is no such post-build step in your CI system there is probably a plugin for that somewhere on the internet.


For more information on WebdriverIO see the homepage.