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 🙏

© 2026 – Pkg Stats / Ryan Hefner

xray-pw-reporter

v0.5.1

Published

A module to integrate Playwright test execution result with Xray

Readme

Usage/Examples


reporter: [

["xray-pw-reporter", {

  

// Setting output dir for json file. Default: "/xray-pw-reporter"

// reportOutDir: "<path here>",

  

// Importing type (Mandatory)

importType:  "REST" | "MANUAL",

  

// Jira Project ID (Mandatory)

project:  "<PROJECT ID>",

  

// Override test details on Jira

overrideTestDetail:  false,

  

// Saving video evidence on jira

saveVideoEvidence:  false,

  

// Saving trace evidence on jira

saveTraceEvidence:  false,

  

// The jira issue execution where to import the results (if jira issue does not exist, a new execution will be created)

// (used only for "REST" Import)

// this field takes precedence over testPlanKey. This means that even if the testPlanKey field is defined,

// the reporter will try to import the execution under the key defined here

testExecutionKey:  "JKEY-100",

  

// The test plan where the new jira issue execution will be created

// (used only for "REST" Import)

// The testExecutionKey has pirority over this field. This means that even if this field is defined,

// the reporter will try to import the execution into the key defined on testExecutionKey

testPlanKey:  "JKEY-100",

  

// The user ID representing who executed the test run.

// This is a global setting, meaning every test in the run will be marked as executed by this user.

executedBy:  "712040:aa4a7b1c-ce1b-4114-a079-e7e2bf90afec",

  

// This object describes how the new Execution Issue will be created (unlike testExecutionKey, this field allows you to describe all the fields of the new execution)

// The new execution will be imported and linked to the plan defined in testPlanKey,

// if testPlanKey is not defined, it will only be imported as a new execution and will not be linked

newExecution: {

"assignee": {

"id":  "712040:aa4a7b1c-ce1b-4114-a079-e7e2bf90afec"

},

"reporter": {

"id":  "712040:aa4a7b1c-ce1b-4114-a079-e7e2bf90afec"

},

"issuetype": {

"name":  "Test Execution"

},

"summary":  `Brand new Execution`,

"requiredFields": [

{

"components": [

{

"name":  "COMPONENT1"

}

],

"description":  "this is the execution description"

}

]

},

  

// Xray client_id

// (Mandatory only for "REST" Import)

xrayClientID:  "<CLIENT_ID HERE>",

  

// Xray secret

// (Mandatory only for "REST" Import)

xraySecret:  "<SECRET HERE>"

}]

]

If some fields are required, you can add them like:


reporter: [

["xray-pw-reporter", {

// ...

newExecution: {

"assignee": {

"id":  "712040:aa4a7b1c-ce1b-4114-a079-e7e2bf90afec"

},

"issuetype": {

"name":  "Test Execution"

},

"summary":  `Brand new Execution`,

// Required Fields

"requiredFields": [

{

"components": [

{

"name":  "COMPONENT1"

}

],

"description":  "this is the execution description"

}

]

},

// ...

  

}]

]

Normal Tests

For a normal test, you just have to indicate the JiraIssue as a comment above the test:


/**

* @JiraIssue JKEY-10

*/

test('Test that passes', async ({ page }) => {

// Steps here

})

If JiraIssue is not defined, test will be marked as ⚡ Excluded.⚡

if test.step have also been defined, the results of the latter will also be included:


/**

* @JiraIssue JKEY-10

*/

test('Test that passes', async ({ page }) => {

await  test.step('Step 1', async () => {

// Implementation of step 1

})

})

⚠️Only steps wrapped into test.step will be included⚠️

Data driven Tests

For data driven tests (which correspond to tests with xray datasets), the matter is a little more complex:

  • A file name: ".dataset.json" have to be created under /data/datasets/

  • Dataset must follow the syntax below:


{

"dataset": [

{

"parameters": [

{

"name": "username",

"value": ""

},

{

"name": "password",

"value": "hello"

},

{

"name": "error",

"value": "enter username"

}

]

},

{

"parameters": [

{

"name": "username",

"value": "[email protected]"

},

{

"name": "password",

"value": ""

},

{

"name": "error",

"value": "enter password"

}

]

}

]

}
  • @DDTannotation must be specified above the test:

  • ⚠️Test title must follow the syntax: TEST_NAME -> Iteration X⚠️

  • ⚠️the dataset file name must be the same as the @DDT tag⚠️


import { test, expect } from  '@playwright/test';

import { dataset  as  ds110 } from  "../data/datasets/jkey-110.dataset.json"

  

ds110.forEach((item, index) => {

/**

* @DDT JKEY-110

*/

test(`Data-driven test with one step -> Iteration ${index + 1}`, async ({ page }) => {

await  test.step('Step1', async () => {

})

})

})

Override Test Details

With option overrideTestDetail set to true, title and steps defined on PW test, will replace title and steps on Xray Issue. So, be carefull on using it :)

Integration with Microsoft Teams

If you're using Microsoft Power Automate flows and have a teams webhook, you can use it to retrieve execution data and handle it as needed. To enable this feature, use the useTeamsWebhook option in your reporter configuration:

useTeamsWebhook = true

Utilizza successivamente teamsWebhook per indicare il tuo webhook:

teamsWebhook = "https://your-teams-webhook-url-here".

The JSON sent via POST contains the following structure:

{
  "jiraIssue": {
    "executionSummary": "",
    "link": ""
  },
  "results": {
    "executed": "",
    "passed": "",
    "failed": "",
    "skipped": "",
    "runtime": ""
  }
}

The payload adheres to the following schema:

{
  "type": "object",
  "properties": {
    "jiraIssue": {
      "type": "object",
      "properties": {
        "executionSummary": {
          "type": "string"
        },
        "link": {
          "type": "string"
        }
      }
    },
    "results": {
      "type": "object",
      "properties": {
        "executed": {
          "type": "string"
        },
        "passed": {
          "type": "string"
        },
        "failed": {
          "type": "string"
        },
        "skipped": {
          "type": "string"
        },
        "runtime": {
          "type": "string"
        }
      }
    }
  }
}

General Use Case

useTeamsWebhook and teamsWebhook settings can be used generically to send execution data via POST to any webhook URL. This makes the solution flexible for various reporting and notification systems beyond Teams.