From 8e9d28c886f1d94c9362df0251bd49b9bd2f0912 Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Fri, 16 Jun 2023 10:37:38 +0200 Subject: [PATCH 01/12] report skipped hermione tests (fixes #653, via #697) --- packages/allure-hermione/docs/development.md | 8 +- packages/allure-hermione/src/index.ts | 103 ++++++++--- .../allure-hermione/test/.hermione.conf.js | 7 +- .../allure-hermione/test/fixtures/allureId.js | 3 - .../test/fixtures/attachments.js | 2 +- .../allure-hermione/test/fixtures/epic.js | 3 - .../test/fixtures/failedSteps.js | 9 - .../allure-hermione/test/fixtures/feature.js | 3 - .../allure-hermione/test/fixtures/issue.js | 3 - .../allure-hermione/test/fixtures/label.js | 3 - .../allure-hermione/test/fixtures/labels.js | 43 +++++ .../allure-hermione/test/fixtures/link.js | 3 - .../allure-hermione/test/fixtures/links.js | 11 ++ .../allure-hermione/test/fixtures/owner.js | 3 - .../fixtures/{parameter.js => parameters.js} | 2 +- .../test/fixtures/parentSuite.js | 3 - .../test/fixtures/passedSteps.js | 9 - .../allure-hermione/test/fixtures/severity.js | 3 - .../allure-hermione/test/fixtures/skipped.js | 10 + .../allure-hermione/test/fixtures/steps.js | 19 ++ .../allure-hermione/test/fixtures/story.js | 3 - .../allure-hermione/test/fixtures/subSuite.js | 3 - .../allure-hermione/test/fixtures/suite.js | 3 - packages/allure-hermione/test/fixtures/tag.js | 3 - packages/allure-hermione/test/fixtures/tms.js | 3 - packages/allure-hermione/test/runner.ts | 5 + .../test/spec/attachments.test.ts | 18 +- .../allure-hermione/test/spec/labels.test.ts | 171 ++++++------------ .../allure-hermione/test/spec/links.test.ts | 65 +++---- .../test/spec/parameters.test.ts | 20 +- .../allure-hermione/test/spec/skipped.test.ts | 39 ++++ .../allure-hermione/test/spec/steps.test.ts | 34 ++-- 32 files changed, 328 insertions(+), 289 deletions(-) delete mode 100644 packages/allure-hermione/test/fixtures/allureId.js delete mode 100644 packages/allure-hermione/test/fixtures/epic.js delete mode 100644 packages/allure-hermione/test/fixtures/failedSteps.js delete mode 100644 packages/allure-hermione/test/fixtures/feature.js delete mode 100644 packages/allure-hermione/test/fixtures/issue.js delete mode 100644 packages/allure-hermione/test/fixtures/label.js create mode 100644 packages/allure-hermione/test/fixtures/labels.js delete mode 100644 packages/allure-hermione/test/fixtures/link.js create mode 100644 packages/allure-hermione/test/fixtures/links.js delete mode 100644 packages/allure-hermione/test/fixtures/owner.js rename packages/allure-hermione/test/fixtures/{parameter.js => parameters.js} (65%) delete mode 100644 packages/allure-hermione/test/fixtures/parentSuite.js delete mode 100644 packages/allure-hermione/test/fixtures/passedSteps.js delete mode 100644 packages/allure-hermione/test/fixtures/severity.js create mode 100644 packages/allure-hermione/test/fixtures/skipped.js create mode 100644 packages/allure-hermione/test/fixtures/steps.js delete mode 100644 packages/allure-hermione/test/fixtures/story.js delete mode 100644 packages/allure-hermione/test/fixtures/subSuite.js delete mode 100644 packages/allure-hermione/test/fixtures/suite.js delete mode 100644 packages/allure-hermione/test/fixtures/tag.js delete mode 100644 packages/allure-hermione/test/fixtures/tms.js create mode 100644 packages/allure-hermione/test/spec/skipped.test.ts diff --git a/packages/allure-hermione/docs/development.md b/packages/allure-hermione/docs/development.md index e203ef3da..e4a65f887 100644 --- a/packages/allure-hermione/docs/development.md +++ b/packages/allure-hermione/docs/development.md @@ -2,7 +2,8 @@ ## Running hermione tests locally -The easiest way to run Hermione tests locally is [Selenium standalone grid](https://www.npmjs.com/package/selenium-standalone). +The easiest way to run Hermione tests locally +is [Selenium standalone grid](https://www.npmjs.com/package/selenium-standalone). ```shell npm i -g selenium-standalone # install the package globally @@ -20,7 +21,10 @@ module.exports = { }; ``` -Tests in the package already runs the grid before themselves, so you don't need to start it manually. +Tests in the package already runs the grid before themselves, so you don't need to start it +manually. + +**Don't forget to compile the reporter before running tests**! ## Using repeater diff --git a/packages/allure-hermione/src/index.ts b/packages/allure-hermione/src/index.ts index cb15f8178..501af7824 100644 --- a/packages/allure-hermione/src/index.ts +++ b/packages/allure-hermione/src/index.ts @@ -42,6 +42,8 @@ export type TestIDFactory = (testId?: string) => string; const hostname = os.hostname(); const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) => { + const { ALLURE_REPORTER_DEV_MODE } = process.env; + const loadedTests: Map = new Map(); const runningTests: Map = new Map(); const runtime = new AllureRuntime({ resultsDir: "allure-results", @@ -60,6 +62,47 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = return () => `${context.browserId}:${context.id()}`; }; + /** + * Create Allure test from Hermione test object with all the possible initial labels + * + * @param test Hermione test object + * @returns Allure test + */ + const createAllureTest = (test: Hermione.Test): AllureTest => { + const { ALLURE_HOST_NAME, ALLURE_THREAD_NAME } = process.env; + const thread = ALLURE_THREAD_NAME || test.sessionId; + const hostnameLabel = ALLURE_HOST_NAME || hostname; + const currentTest = new AllureTest(runtime, Date.now()); + const [parentSuite, suite, ...subSuites] = getSuitePath(test); + + currentTest.name = test.title; + currentTest.fullName = test.fullTitle(); + currentTest.historyId = md5(test.fullTitle()); + currentTest.stage = Stage.RUNNING; + + currentTest.addLabel(LabelName.HOST, hostnameLabel); + currentTest.addLabel(LabelName.LANGUAGE, "javascript"); + currentTest.addLabel(LabelName.FRAMEWORK, "hermione"); + currentTest.addParameter("browser", test.browserId); + + if (thread) { + currentTest.addLabel(LabelName.THREAD, thread); + } + + if (parentSuite) { + currentTest.addLabel(LabelName.PARENT_SUITE, parentSuite); + } + + if (suite) { + currentTest.addLabel(LabelName.SUITE, suite); + } + + if (subSuites.length > 0) { + currentTest.addLabel(LabelName.SUB_SUITE, subSuites.join(" > ")); + } + + return currentTest; + }; const handleTestError = (test: Hermione.Test, error: Hermione.TestError) => { const testId = getTestId(test); const currentTest = runningTests.get(testId())!; @@ -227,40 +270,22 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = } }); }); + hermione.on(hermione.events.AFTER_TESTS_READ, (collection) => { + // cache all the tests to handle skipped tests in future + collection.eachTest((test) => { + const testId = getTestId(test); + + loadedTests.set(testId(), test); + }); + }); hermione.on(hermione.events.TEST_BEGIN, (test) => { + // test hasn't been actually started if (!test.sessionId) { - throw new Error("Test session hasn't been started correctly! Check the driver availability."); + return; } const testId = getTestId(test); - const { ALLURE_HOST_NAME, ALLURE_THREAD_NAME } = process.env; - const thread = ALLURE_THREAD_NAME || test.sessionId; - const hostnameLabel = ALLURE_HOST_NAME || hostname; - const currentTest = new AllureTest(runtime, Date.now()); - const [parentSuite, suite, ...subSuites] = getSuitePath(test); - - currentTest.name = test.title; - currentTest.fullName = test.fullTitle(); - currentTest.historyId = md5(test.fullTitle()); - currentTest.stage = Stage.RUNNING; - - currentTest.addLabel(LabelName.HOST, hostnameLabel); - currentTest.addLabel(LabelName.LANGUAGE, "javascript"); - currentTest.addLabel(LabelName.FRAMEWORK, "hermione"); - currentTest.addLabel(LabelName.THREAD, thread); - currentTest.addParameter("browser", test.browserId); - - if (parentSuite) { - currentTest.addLabel(LabelName.PARENT_SUITE, parentSuite); - } - - if (suite) { - currentTest.addLabel(LabelName.SUITE, suite); - } - - if (subSuites.length > 0) { - currentTest.addLabel(LabelName.SUB_SUITE, subSuites.join(" > ")); - } + const currentTest = createAllureTest(test); runningTests.set(testId(), currentTest); }); @@ -282,6 +307,11 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = currentTest.status = Status.FAILED; }); hermione.on(hermione.events.TEST_END, (test) => { + // test hasn't been started + if (!test.startTime) { + return; + } + const testId = getTestId(test); const currentTest = runningTests.get(testId())!; @@ -291,8 +321,23 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = currentTest.stage = Stage.FINISHED; currentTest.endTest(Date.now()); + loadedTests.delete(testId()); runningTests.delete(testId()); }); + hermione.on(hermione.events.END, () => { + // all tests have been finished + if (loadedTests.size === 0) { + return; + } + + loadedTests.forEach((test) => { + const currentTest = createAllureTest(test); + + currentTest.status = Status.SKIPPED; + currentTest.stage = Stage.FINISHED; + currentTest.endTest(); + }); + }); // it needs for tests because we need to read runtime writer data redefined in hermione config // eslint-disable-next-line diff --git a/packages/allure-hermione/test/.hermione.conf.js b/packages/allure-hermione/test/.hermione.conf.js index 919876cfe..2a9d36e3e 100644 --- a/packages/allure-hermione/test/.hermione.conf.js +++ b/packages/allure-hermione/test/.hermione.conf.js @@ -1,5 +1,7 @@ module.exports = { gridUrl: "http://localhost:4444/wd/hub", + httpTimeout: 50000, + sessionQuitTimeout: 50000, sets: { desktop: { browsers: ["headless"], @@ -8,9 +10,10 @@ module.exports = { }, browsers: { headless: { + automationProtocol: "webdriver", desiredCapabilities: { - browserName: "chrome", - "goog:chromeOptions": { + browserName: "firefox", + "moz:firefoxOptions": { args: ["--headless"], }, }, diff --git a/packages/allure-hermione/test/fixtures/allureId.js b/packages/allure-hermione/test/fixtures/allureId.js deleted file mode 100644 index 70359b49a..000000000 --- a/packages/allure-hermione/test/fixtures/allureId.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds allure id", async ({ browser, currentTest }) => { - await browser.id(currentTest.id(), "42"); -}); diff --git a/packages/allure-hermione/test/fixtures/attachments.js b/packages/allure-hermione/test/fixtures/attachments.js index b91294d30..7de0ac9e5 100644 --- a/packages/allure-hermione/test/fixtures/attachments.js +++ b/packages/allure-hermione/test/fixtures/attachments.js @@ -1,3 +1,3 @@ -it("adds json attachment", async ({ browser, currentTest }) => { +it("json", async ({ browser, currentTest }) => { await browser.attach(currentTest.id(), JSON.stringify({ foo: "bar" }), "application/json"); }); diff --git a/packages/allure-hermione/test/fixtures/epic.js b/packages/allure-hermione/test/fixtures/epic.js deleted file mode 100644 index 533a08aca..000000000 --- a/packages/allure-hermione/test/fixtures/epic.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds epic", async ({ browser, currentTest }) => { - await browser.epic(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/failedSteps.js b/packages/allure-hermione/test/fixtures/failedSteps.js deleted file mode 100644 index 08d0fa450..000000000 --- a/packages/allure-hermione/test/fixtures/failedSteps.js +++ /dev/null @@ -1,9 +0,0 @@ -it("adds custom steps", async ({ browser, currentTest }) => { - await browser.step(currentTest.id(), "first step name", async (s1) => { - await s1.step("second step name", async (s2) => { - await s2.step("third step name", (s3) => { - throw new Error("foo"); - }); - }); - }); -}); diff --git a/packages/allure-hermione/test/fixtures/feature.js b/packages/allure-hermione/test/fixtures/feature.js deleted file mode 100644 index d0c3201dc..000000000 --- a/packages/allure-hermione/test/fixtures/feature.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds feature", async ({ browser, currentTest }) => { - await browser.feature(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/issue.js b/packages/allure-hermione/test/fixtures/issue.js deleted file mode 100644 index eb2b5e38b..000000000 --- a/packages/allure-hermione/test/fixtures/issue.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds issue link", async ({ browser, currentTest }) => { - await browser.issue(currentTest.id(), "foo", "http://example.org"); -}); diff --git a/packages/allure-hermione/test/fixtures/label.js b/packages/allure-hermione/test/fixtures/label.js deleted file mode 100644 index c7a22de3d..000000000 --- a/packages/allure-hermione/test/fixtures/label.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds label", async ({ browser, currentTest }) => { - await browser.label(currentTest.id(), "foo", "bar"); -}); diff --git a/packages/allure-hermione/test/fixtures/labels.js b/packages/allure-hermione/test/fixtures/labels.js new file mode 100644 index 000000000..2927e9e5a --- /dev/null +++ b/packages/allure-hermione/test/fixtures/labels.js @@ -0,0 +1,43 @@ +it("custom", async ({ browser, currentTest }) => { + await browser.label(currentTest.id(), "foo", "bar"); +}); + +it("allureId", async ({ browser, currentTest }) => { + await browser.id(currentTest.id(), "42"); +}); + +it("epic", async ({ browser, currentTest }) => { + await browser.epic(currentTest.id(), "foo"); +}); + +it("owner", async ({ browser, currentTest }) => { + await browser.owner(currentTest.id(), "foo"); +}); + +it("parentSuite", async ({ browser, currentTest }) => { + await browser.parentSuite(currentTest.id(), "foo"); +}); + +it("subSuite", async ({ browser, currentTest }) => { + await browser.subSuite(currentTest.id(), "foo"); +}); + +it("severity", async ({ browser, currentTest }) => { + await browser.severity(currentTest.id(), "foo"); +}); + +it("story", async ({ browser, currentTest }) => { + await browser.story(currentTest.id(), "foo"); +}); + +it("suite", async ({ browser, currentTest }) => { + await browser.suite(currentTest.id(), "foo"); +}); + +it("tag", async ({ browser, currentTest }) => { + await browser.tag(currentTest.id(), "foo"); +}); + +it("feature", async ({ browser, currentTest }) => { + await browser.feature(currentTest.id(), "foo"); +}); diff --git a/packages/allure-hermione/test/fixtures/link.js b/packages/allure-hermione/test/fixtures/link.js deleted file mode 100644 index baf16d844..000000000 --- a/packages/allure-hermione/test/fixtures/link.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds link", async ({ browser, currentTest }) => { - await browser.link(currentTest.id(), "http://example.org", "bar", "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/links.js b/packages/allure-hermione/test/fixtures/links.js new file mode 100644 index 000000000..22733c842 --- /dev/null +++ b/packages/allure-hermione/test/fixtures/links.js @@ -0,0 +1,11 @@ +it("custom", async ({ browser, currentTest }) => { + await browser.link(currentTest.id(), "http://example.org", "bar", "foo"); +}); + +it("tms", async ({ browser, currentTest }) => { + await browser.tms(currentTest.id(), "foo", "http://example.org"); +}); + +it("issue", async ({ browser, currentTest }) => { + await browser.issue(currentTest.id(), "foo", "http://example.org"); +}); diff --git a/packages/allure-hermione/test/fixtures/owner.js b/packages/allure-hermione/test/fixtures/owner.js deleted file mode 100644 index 53675e5fa..000000000 --- a/packages/allure-hermione/test/fixtures/owner.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds owner", async ({ browser, currentTest }) => { - await browser.owner(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/parameter.js b/packages/allure-hermione/test/fixtures/parameters.js similarity index 65% rename from packages/allure-hermione/test/fixtures/parameter.js rename to packages/allure-hermione/test/fixtures/parameters.js index 7e9220cba..441122b1f 100644 --- a/packages/allure-hermione/test/fixtures/parameter.js +++ b/packages/allure-hermione/test/fixtures/parameters.js @@ -1,4 +1,4 @@ -it("adds parameter", async ({ browser, currentTest }) => { +it("custom", async ({ browser, currentTest }) => { await browser.parameter(currentTest.id(), "foo", "bar", { excluded: false, mode: "hidden", diff --git a/packages/allure-hermione/test/fixtures/parentSuite.js b/packages/allure-hermione/test/fixtures/parentSuite.js deleted file mode 100644 index 369d5bf78..000000000 --- a/packages/allure-hermione/test/fixtures/parentSuite.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds parent suite", async ({ browser, currentTest }) => { - await browser.parentSuite(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/passedSteps.js b/packages/allure-hermione/test/fixtures/passedSteps.js deleted file mode 100644 index 61b6fd14f..000000000 --- a/packages/allure-hermione/test/fixtures/passedSteps.js +++ /dev/null @@ -1,9 +0,0 @@ -it("adds custom steps", async ({ browser, currentTest }) => { - await browser.step(currentTest.id(), "first step name", async (s1) => { - await s1.step("second step name", async (s2) => { - await s2.step("third step name", (s3) => { - s3.label("foo", "bar"); - }); - }); - }); -}); diff --git a/packages/allure-hermione/test/fixtures/severity.js b/packages/allure-hermione/test/fixtures/severity.js deleted file mode 100644 index a2c7886bd..000000000 --- a/packages/allure-hermione/test/fixtures/severity.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds severity", async ({ browser, currentTest }) => { - await browser.severity(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/skipped.js b/packages/allure-hermione/test/fixtures/skipped.js new file mode 100644 index 000000000..c66301b8f --- /dev/null +++ b/packages/allure-hermione/test/fixtures/skipped.js @@ -0,0 +1,10 @@ +it.skip("native", () => {}); + +describe("", () => { + it.skip("suite", () => {}); +}); + +describe("", () => { + hermione.skip.in("headless"); + it("browser", () => {}); +}); diff --git a/packages/allure-hermione/test/fixtures/steps.js b/packages/allure-hermione/test/fixtures/steps.js new file mode 100644 index 000000000..e05ec7591 --- /dev/null +++ b/packages/allure-hermione/test/fixtures/steps.js @@ -0,0 +1,19 @@ +it("passed", async ({ browser, currentTest }) => { + await browser.step(currentTest.id(), "first step name", async (s1) => { + await s1.step("second step name", async (s2) => { + await s2.step("third step name", (s3) => { + s3.label("foo", "bar"); + }); + }); + }); +}); + +it("failed", async ({ browser, currentTest }) => { + await browser.step(currentTest.id(), "first step name", async (s1) => { + await s1.step("second step name", async (s2) => { + await s2.step("third step name", (s3) => { + throw new Error("foo"); + }); + }); + }); +}); diff --git a/packages/allure-hermione/test/fixtures/story.js b/packages/allure-hermione/test/fixtures/story.js deleted file mode 100644 index 2edae0768..000000000 --- a/packages/allure-hermione/test/fixtures/story.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds story", async ({ browser, currentTest }) => { - await browser.story(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/subSuite.js b/packages/allure-hermione/test/fixtures/subSuite.js deleted file mode 100644 index 40801ac7c..000000000 --- a/packages/allure-hermione/test/fixtures/subSuite.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds sub suite", async ({ browser, currentTest }) => { - await browser.subSuite(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/suite.js b/packages/allure-hermione/test/fixtures/suite.js deleted file mode 100644 index 629703737..000000000 --- a/packages/allure-hermione/test/fixtures/suite.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds suite", async ({ browser, currentTest }) => { - await browser.suite(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/tag.js b/packages/allure-hermione/test/fixtures/tag.js deleted file mode 100644 index fa8fd11f8..000000000 --- a/packages/allure-hermione/test/fixtures/tag.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds tag", async ({ browser, currentTest }) => { - await browser.tag(currentTest.id(), "foo"); -}); diff --git a/packages/allure-hermione/test/fixtures/tms.js b/packages/allure-hermione/test/fixtures/tms.js deleted file mode 100644 index 8d1dc95a1..000000000 --- a/packages/allure-hermione/test/fixtures/tms.js +++ /dev/null @@ -1,3 +0,0 @@ -it("adds tms link", async ({ browser, currentTest }) => { - await browser.tms(currentTest.id(), "foo", "http://example.org"); -}); diff --git a/packages/allure-hermione/test/runner.ts b/packages/allure-hermione/test/runner.ts index 86362845c..cda89f0b0 100644 --- a/packages/allure-hermione/test/runner.ts +++ b/packages/allure-hermione/test/runner.ts @@ -5,11 +5,16 @@ import glob from "glob"; import Mocha from "mocha"; import selenium from "selenium-standalone"; import "source-map-support/register"; +import { TestResult } from "allure-js-commons"; + +export const getTestResultByName = (results: TestResult[], name: string) => + results.find((result) => result.name === name)!; (async () => { await selenium.install(); const seleniumProcess = await selenium.start(); + const mocha = new Mocha({ timeout: 30000, reporter: "mocha-multi-reporters", diff --git a/packages/allure-hermione/test/spec/attachments.test.ts b/packages/allure-hermione/test/spec/attachments.test.ts index 2310d949d..a3833c3a3 100644 --- a/packages/allure-hermione/test/spec/attachments.test.ts +++ b/packages/allure-hermione/test/spec/attachments.test.ts @@ -1,27 +1,29 @@ import * as AllureCommons from "allure-js-commons"; import { expect } from "chai"; -import Hermione from "hermione"; -import { beforeEach, describe, it } from "mocha"; import Sinon from "sinon"; +import { beforeEach, describe, it } from "mocha"; +import { getTestResultByName } from "../runner"; import { HermioneAllure } from "../types"; +import Hermione from "hermione"; describe("attachments", () => { - let hermione: HermioneAllure; let writeAttachmentStub: Sinon.SinonStub; - beforeEach(async () => { + beforeEach(() => { Sinon.restore(); writeAttachmentStub = Sinon.stub(AllureCommons.AllureRuntime.prototype, "writeAttachment"); - hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; + }); + + it("adds json attachment", async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; await hermione.run(["./test/fixtures/attachments.js"], {}); - }); - it("adds json attachment", () => { + const { results } = hermione.allure.writer; const { attachments: [attachment], - } = hermione.allure.writer.results[0]; + } = getTestResultByName(results, "json"); expect(attachment.name).eq("Attachment"); expect(attachment.type).eq("application/json"); diff --git a/packages/allure-hermione/test/spec/labels.test.ts b/packages/allure-hermione/test/spec/labels.test.ts index d618526a8..a4e52cf1e 100644 --- a/packages/allure-hermione/test/spec/labels.test.ts +++ b/packages/allure-hermione/test/spec/labels.test.ts @@ -1,157 +1,96 @@ -import { Label, LabelName } from "allure-js-commons"; +import { Label, LabelName, TestResult } from "allure-js-commons"; import { expect } from "chai"; +import { beforeEach, before, describe, it } from "mocha"; import Hermione from "hermione"; -import { beforeEach, describe, it } from "mocha"; import { HermioneAllure } from "../types"; +import { getTestResultByName } from "../runner"; describe("labels", () => { - let hermione: HermioneAllure; + let results: TestResult[]; - beforeEach(() => { - hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; - }); - - describe("label", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/label.js"], {}); - }); + before(async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; - it("adds `foo` label", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === "foo") as Label; + await hermione.run(["./test/fixtures/labels.js"], {}); - expect(label.name).eq("foo"); - expect(label.value).eq("bar"); - }); + results = hermione.allure.writer.results; }); - describe("allure id", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/allureId.js"], {}); - }); + it("adds `foo` custom label", async () => { + const { labels } = getTestResultByName(results, "custom"); + const label = labels.find(({ name }) => name === "foo") as Label; - it("adds `42` allure id", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.ALLURE_ID) as Label; - - expect(label.value).eq("42"); - }); + expect(label.name).eq("foo"); + expect(label.value).eq("bar"); }); - describe("epic", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/epic.js"], {}); - }); - - it("adds `foo` epic", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.EPIC) as Label; + it("adds `42` allureId label", async () => { + const { labels } = getTestResultByName(results, "allureId"); + const label = labels.find(({ name }) => name === LabelName.ALLURE_ID) as Label; - expect(label.value).eq("foo"); - }); + expect(label.value).eq("42"); }); - describe("feature", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/feature.js"], {}); - }); + it("adds `foo` epic label", async () => { + const { labels } = getTestResultByName(results, "epic"); + const label = labels.find(({ name }) => name === LabelName.EPIC) as Label; - it("adds `foo` feature", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.FEATURE) as Label; - - expect(label.value).eq("foo"); - }); + expect(label.value).eq("foo"); }); - describe("story", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/story.js"], {}); - }); - - it("adds `foo` story", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.STORY) as Label; + it("adds `foo` feature label", async () => { + const { labels } = getTestResultByName(results, "feature"); + const label = labels.find(({ name }) => name === LabelName.FEATURE) as Label; - expect(label.value).eq("foo"); - }); + expect(label.value).eq("foo"); }); - describe("suite", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/suite.js"], {}); - }); - - it("adds `foo` suite", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.SUITE) as Label; + it("adds `foo` story label", async () => { + const { labels } = getTestResultByName(results, "story"); + const label = labels.find(({ name }) => name === LabelName.STORY) as Label; - expect(label.value).eq("foo"); - }); + expect(label.value).eq("foo"); }); - describe("parentSuite", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/parentSuite.js"], {}); - }); + it("adds `foo` suite label", async () => { + const { labels } = getTestResultByName(results, "suite"); + const label = labels.find(({ name }) => name === LabelName.SUITE) as Label; - it("adds `foo` parentSuite", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.PARENT_SUITE) as Label; - - expect(label.value).eq("foo"); - }); + expect(label.value).eq("foo"); }); - describe("subSuite", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/subSuite.js"], {}); - }); - - it("adds `foo` subSuite", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.SUB_SUITE) as Label; + it("adds `foo` parentSuite label", async () => { + const { labels } = getTestResultByName(results, "parentSuite"); + const label = labels.find(({ name }) => name === LabelName.PARENT_SUITE) as Label; - expect(label.value).eq("foo"); - }); + expect(label.value).eq("foo"); }); - describe("owner", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/owner.js"], {}); - }); - - it("adds `foo` owner", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.OWNER) as Label; + it("adds `foo` subSuite label", async () => { + const { labels } = getTestResultByName(results, "subSuite"); + const label = labels.find(({ name }) => name === LabelName.SUB_SUITE) as Label; - expect(label.value).eq("foo"); - }); + expect(label.value).eq("foo"); }); - describe("severity", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/severity.js"], {}); - }); + it("adds `foo` owner label", async () => { + const { labels } = getTestResultByName(results, "owner"); + const label = labels.find(({ name }) => name === LabelName.OWNER) as Label; - it("adds `foo` severity", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.SEVERITY) as Label; - - expect(label.value).eq("foo"); - }); + expect(label.value).eq("foo"); }); - describe("tag", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/tag.js"], {}); - }); + it("adds `foo` severity label", async () => { + const { labels } = getTestResultByName(results, "severity"); + const label = labels.find(({ name }) => name === LabelName.SEVERITY) as Label; + + expect(label.value).eq("foo"); + }); - it("adds `foo` tag", () => { - const { labels } = hermione.allure.writer.results[0]; - const label = labels.find(({ name }) => name === LabelName.TAG) as Label; + it("adds `foo` tag label", async () => { + const { labels } = getTestResultByName(results, "tag"); + const label = labels.find(({ name }) => name === LabelName.TAG) as Label; - expect(label.value).eq("foo"); - }); + expect(label.value).eq("foo"); }); }); diff --git a/packages/allure-hermione/test/spec/links.test.ts b/packages/allure-hermione/test/spec/links.test.ts index f24941d80..2536f6cbc 100644 --- a/packages/allure-hermione/test/spec/links.test.ts +++ b/packages/allure-hermione/test/spec/links.test.ts @@ -1,55 +1,42 @@ -import { Link, LinkType } from "allure-js-commons"; +import { Link, LinkType, TestResult } from "allure-js-commons"; import { expect } from "chai"; -import Hermione from "hermione"; -import { beforeEach, describe, it } from "mocha"; +import { before, describe, it } from "mocha"; +import { getTestResultByName } from "../runner"; import { HermioneAllure } from "../types"; +import Hermione from "hermione"; describe("links", () => { - let hermione: HermioneAllure; - - beforeEach(() => { - hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; - }); + let results: TestResult[]; - describe("link", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/link.js"], {}); - }); + before(async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; - it("adds `foo` label", () => { - const { links } = hermione.allure.writer.results[0]; - const link = links.find(({ type }) => type === "foo") as Link; + await hermione.run(["./test/fixtures/links.js"], {}); - expect(link.name).eq("bar"); - expect(link.url).eq("http://example.org"); - }); + results = hermione.allure.writer.results; }); - describe("tms", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/tms.js"], {}); - }); + it("adds `bar` custom link", async () => { + const { links } = getTestResultByName(results, "custom"); + const link = links.find(({ type }) => type === "foo") as Link; - it("adds `foo` tms link", () => { - const { links } = hermione.allure.writer.results[0]; - const link = links.find(({ type }) => type === LinkType.TMS) as Link; - - expect(link.name).eq("foo"); - expect(link.url).eq("http://example.org"); - }); + expect(link.name).eq("bar"); + expect(link.url).eq("http://example.org"); }); - describe("issue", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/issue.js"], {}); - }); + it("adds `foo` tms link", async () => { + const { links } = getTestResultByName(results, "tms"); + const link = links.find(({ type }) => type === LinkType.TMS) as Link; + + expect(link.name).eq("foo"); + expect(link.url).eq("http://example.org"); + }); - it("adds `foo` issue link", () => { - const { links } = hermione.allure.writer.results[0]; - const link = links.find(({ type }) => type === LinkType.ISSUE) as Link; + it("adds `foo` issue link", async () => { + const { links } = getTestResultByName(results, "issue"); + const link = links.find(({ type }) => type === LinkType.ISSUE) as Link; - expect(link.name).eq("foo"); - expect(link.url).eq("http://example.org"); - }); + expect(link.name).eq("foo"); + expect(link.url).eq("http://example.org"); }); }); diff --git a/packages/allure-hermione/test/spec/parameters.test.ts b/packages/allure-hermione/test/spec/parameters.test.ts index 3521744b2..07ee9e367 100644 --- a/packages/allure-hermione/test/spec/parameters.test.ts +++ b/packages/allure-hermione/test/spec/parameters.test.ts @@ -1,20 +1,18 @@ -import { Parameter } from "allure-js-commons"; +import { Parameter, TestResult } from "allure-js-commons"; import { expect } from "chai"; -import Hermione from "hermione"; -import { beforeEach, describe, it } from "mocha"; +import { before, describe, it } from "mocha"; +import { getTestResultByName } from "../runner"; import { HermioneAllure } from "../types"; +import Hermione from "hermione"; describe("parameters", () => { - let hermione: HermioneAllure; + it("adds `foo` custom parameter", async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; - beforeEach(async () => { - hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; - - await hermione.run(["./test/fixtures/parameter.js"], {}); - }); + await hermione.run(["./test/fixtures/parameters.js"], {}); - it("adds `foo` parameter", () => { - const { parameters } = hermione.allure.writer.results[0]; + const { results } = hermione.allure.writer; + const { parameters } = getTestResultByName(results, "custom"); const parameter = parameters.find(({ name }) => name === "foo") as Parameter; expect(parameter.name).eq("foo"); diff --git a/packages/allure-hermione/test/spec/skipped.test.ts b/packages/allure-hermione/test/spec/skipped.test.ts new file mode 100644 index 000000000..72fe7e020 --- /dev/null +++ b/packages/allure-hermione/test/spec/skipped.test.ts @@ -0,0 +1,39 @@ +import { Stage, Status, TestResult } from "allure-js-commons"; +import { expect } from "chai"; +import { before, describe, it } from "mocha"; +import { getTestResultByName } from "../runner"; +import { HermioneAllure } from "../types"; +import Hermione from "hermione"; + +describe("skipped", () => { + let results: TestResult[]; + + before(async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; + + await hermione.run(["./test/fixtures/skipped.js"], {}); + + results = hermione.allure.writer.results; + }); + + it("handles natively skipped tests", () => { + const { status, stage } = getTestResultByName(results, "native"); + + expect(status).eq(Status.SKIPPED); + expect(stage).eq(Stage.FINISHED); + }); + + it("handles natively skipped tests inside suites", () => { + const { status, stage } = getTestResultByName(results, "suite"); + + expect(status).eq(Status.SKIPPED); + expect(stage).eq(Stage.FINISHED); + }); + + it("handles tests skipped by hermione for specific browsers", () => { + const { status, stage } = getTestResultByName(results, "browser"); + + expect(status).eq(Status.SKIPPED); + expect(stage).eq(Stage.FINISHED); + }); +}); diff --git a/packages/allure-hermione/test/spec/steps.test.ts b/packages/allure-hermione/test/spec/steps.test.ts index 2f92177b2..6529ede01 100644 --- a/packages/allure-hermione/test/spec/steps.test.ts +++ b/packages/allure-hermione/test/spec/steps.test.ts @@ -1,26 +1,24 @@ +import { Status, TestResult } from "allure-js-commons"; import { expect } from "chai"; -import Hermione from "hermione"; -import { beforeEach, describe, it } from "mocha"; -import Sinon from "sinon"; +import { before, beforeEach, describe, it } from "mocha"; import { HermioneAllure } from "../types"; -import { Status } from "allure-js-commons"; +import { getTestResultByName } from "../runner"; +import Hermione from "hermione"; describe("steps", () => { - let hermione: HermioneAllure; + let results: TestResult[]; - beforeEach(() => { - Sinon.restore(); + before(async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; - hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; + await hermione.run(["./test/fixtures/steps.js"], {}); + + results = hermione.allure.writer.results; }); describe("passed steps", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/passedSteps.js"], {}); - }); - - it("adds nested steps", () => { - const { steps, labels } = hermione.allure.writer.results[0]; + it("adds nested steps", async () => { + const { steps, labels } = getTestResultByName(results, "passed"); const customLabel = labels.find(({ name }) => name === "foo"); expect(customLabel!.value).eq("bar"); @@ -34,12 +32,8 @@ describe("steps", () => { }); describe("failed steps", () => { - beforeEach(async () => { - await hermione.run(["./test/fixtures/failedSteps.js"], {}); - }); - - it("fails the test with original step error", () => { - const { status, statusDetails, steps } = hermione.allure.writer.results[0]; + it("fails the test with original step error", async () => { + const { status, statusDetails, steps, labels } = getTestResultByName(results, "failed"); expect(status).eq(Status.FAILED); expect(statusDetails.message).eq("foo"); From f24d5f6912f5578d8f6d697c34553e9c321e65d2 Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Fri, 16 Jun 2023 11:59:59 +0200 Subject: [PATCH 02/12] separate lint workflow (via #696) --- .github/workflows/build.yml | 7 +------ .github/workflows/lint.yml | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eef2c61cc..22420b4a4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,12 +43,7 @@ jobs: - name: yarn build run: | yarn run build - - name: prettier:check - run: | - yarn prettier:check - - name: yarn lint - run: | - yarn run lint + - name: yarn test run: | yarn run test diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..4a3a39cfc --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,36 @@ +name: Lint + +on: + workflow_dispatch: + pull_request: + branches: + - "*" + push: + branches: + - "master" + - "hotfix-*" + +jobs: + build: + name: "Lint" + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node-version: [16.x] + steps: + - uses: actions/checkout@v3.3.0 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: "yarn" + - name: yarn install + run: | + yarn install + - name: prettier:check + run: | + yarn prettier:check + - name: yarn lint + run: | + yarn run lint From 78d05dc0d630f9f7f781305bbafea9293e262119 Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Fri, 16 Jun 2023 12:05:35 +0200 Subject: [PATCH 03/12] add test for hermione browser commands inside hooks (fixes #644, via #698) --- .../allure-hermione/test/fixtures/hooks.js | 15 ++++++++++++ .../allure-hermione/test/spec/hooks.test.ts | 23 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 packages/allure-hermione/test/fixtures/hooks.js create mode 100644 packages/allure-hermione/test/spec/hooks.test.ts diff --git a/packages/allure-hermione/test/fixtures/hooks.js b/packages/allure-hermione/test/fixtures/hooks.js new file mode 100644 index 000000000..de73e3e70 --- /dev/null +++ b/packages/allure-hermione/test/fixtures/hooks.js @@ -0,0 +1,15 @@ +describe("hooks", () => { + beforeEach(async ({ browser, currentTest }) => { + await browser.label(currentTest.id(), "hook", "before"); + }); + + afterEach(async ({ browser, currentTest }) => { + await browser.label(currentTest.id(), "hook", "after"); + }); + + it("first test", () => {}); + + it("second test", () => {}); + + it("third test", () => {}); +}); diff --git a/packages/allure-hermione/test/spec/hooks.test.ts b/packages/allure-hermione/test/spec/hooks.test.ts new file mode 100644 index 000000000..143d7dbd2 --- /dev/null +++ b/packages/allure-hermione/test/spec/hooks.test.ts @@ -0,0 +1,23 @@ +import { TestResult } from "allure-js-commons"; +import { expect } from "chai"; +import Hermione from "hermione"; +import { beforeEach, describe, it } from "mocha"; +import { HermioneAllure } from "../types"; + +describe("hooks", () => { + it("applies commands from `beforeEach` and `afterEach` for each test", async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; + + await hermione.run(["./test/fixtures/hooks.js"], {}); + + const hasHookLabel = (result: TestResult, hook: string) => { + return !!result.labels.find(({ name, value }) => name === "hook" && value === hook); + }; + + expect( + hermione.allure.writer.results.every( + (result) => hasHookLabel(result, "before") && hasHookLabel(result, "after"), + ), + ).eq(true); + }); +}); From f039be1ecb9412e6dfec7313d1791bc4345827c5 Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Fri, 16 Jun 2023 12:41:55 +0200 Subject: [PATCH 04/12] suites labels utility (via #695) --- package.json | 2 +- packages/allure-cucumberjs/package.json | 4 +- packages/allure-decorators/package.json | 4 +- packages/allure-hermione/package.json | 4 +- packages/allure-hermione/src/index.ts | 17 +- .../src/JasmineAllureReporter.ts | 19 +- packages/allure-jasmine/test/label.test.ts | 18 +- packages/allure-jasmine/test/suites.test.ts | 62 +++ packages/allure-js-commons/index.ts | 3 +- packages/allure-js-commons/package.json | 4 +- packages/allure-js-commons/src/utils.ts | 35 +- .../test/specs/utils.spec.ts | 64 ++- packages/allure-mocha/package.json | 6 +- packages/allure-mocha/src/AllureReporter.ts | 17 +- packages/allure-mocha/test/specs/reporter.ts | 8 +- yarn.lock | 418 +++++++++++++----- 16 files changed, 503 insertions(+), 182 deletions(-) create mode 100644 packages/allure-jasmine/test/suites.test.ts diff --git a/package.json b/package.json index 466ca86b5..b87f84eed 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "prettier": "^2.3.2", "replace-in-file": "^6.2.0", "rimraf": "^3.0.2", - "ts-node": "^10.2.1", + "tsx": "^3.12.7", "typescript": "^4.4.2" }, "packageManager": "yarn@3.5.0" diff --git a/packages/allure-cucumberjs/package.json b/packages/allure-cucumberjs/package.json index 163339b7c..b32112be9 100644 --- a/packages/allure-cucumberjs/package.json +++ b/packages/allure-cucumberjs/package.json @@ -21,7 +21,7 @@ "lint:fix": "eslint --fix ./src ./index.ts --ext .ts", "compile": "tsc", "generate-report": "allure generate ./out/allure-results -o ./out/allure-report --clean", - "test": "nyc ts-node --project test/tsconfig.json test/runner.ts" + "test": "nyc tsx --tsconfig test/tsconfig.json test/runner.ts" }, "devDependencies": { "@types/chai": "^4.2.21", @@ -37,7 +37,7 @@ "nyc": "^15.1.0", "rimraf": "^3.0.2", "sinon": "^14.0.0", - "ts-node": "^10.2.1", + "tsx": "^3.12.7", "typescript": "^4.4.2" }, "dependencies": { diff --git a/packages/allure-decorators/package.json b/packages/allure-decorators/package.json index bd8a45a84..d5c192b17 100644 --- a/packages/allure-decorators/package.json +++ b/packages/allure-decorators/package.json @@ -25,7 +25,7 @@ "compile": "tsc", "generate-report": "allure generate ./out/allure-results -o ./out/allure-report --clean", "allure-report": "allure serve ./out/allure-results", - "test": "nyc ts-node --project test/tsconfig.json test/runner.ts", + "test": "nyc tsx --tsconfig test/tsconfig.json test/runner.ts", "coverage": "codecov", "lint": "eslint ./src --ext .ts", "lint:fix": "eslint ./src --ext .ts --fix" @@ -51,7 +51,7 @@ "nyc": "^15.0.1", "rimraf": "^3.0.2", "source-map-support": "^0.5.19", - "ts-node": "^10.2.1", + "tsx": "^3.12.7", "typescript": "^4.4.2" }, "nyc": { diff --git a/packages/allure-hermione/package.json b/packages/allure-hermione/package.json index 2262d2f90..e00bba8c8 100644 --- a/packages/allure-hermione/package.json +++ b/packages/allure-hermione/package.json @@ -23,7 +23,7 @@ "scripts": { "clean": "rimraf ./dist ./out", "compile": "tsc", - "test": "nyc ts-node --project ./tsconfig.json ./test/runner.ts", + "test": "nyc tsx --tsconfig ./tsconfig.json ./test/runner.ts", "coverage": "codecov", "lint": "eslint ./src --ext .ts", "lint:fix": "eslint ./src --ext .ts --fix" @@ -46,7 +46,7 @@ "rimraf": "^3.0.2", "selenium-standalone": "^8.3.0", "source-map-support": "^0.5.19", - "ts-node": "^10.2.1", + "tsx": "^3.12.7", "typescript": "^4.4.2" }, "dependencies": { diff --git a/packages/allure-hermione/src/index.ts b/packages/allure-hermione/src/index.ts index 501af7824..0f179f3c9 100644 --- a/packages/allure-hermione/src/index.ts +++ b/packages/allure-hermione/src/index.ts @@ -8,6 +8,7 @@ import { AllureRuntime, AllureTest, ContentType, + getSuitesLabels, LabelName, LinkType, md5, @@ -73,7 +74,7 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = const thread = ALLURE_THREAD_NAME || test.sessionId; const hostnameLabel = ALLURE_HOST_NAME || hostname; const currentTest = new AllureTest(runtime, Date.now()); - const [parentSuite, suite, ...subSuites] = getSuitePath(test); + const suites = getSuitePath(test); currentTest.name = test.title; currentTest.fullName = test.fullTitle(); @@ -89,17 +90,9 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = currentTest.addLabel(LabelName.THREAD, thread); } - if (parentSuite) { - currentTest.addLabel(LabelName.PARENT_SUITE, parentSuite); - } - - if (suite) { - currentTest.addLabel(LabelName.SUITE, suite); - } - - if (subSuites.length > 0) { - currentTest.addLabel(LabelName.SUB_SUITE, subSuites.join(" > ")); - } + getSuitesLabels(suites).forEach((label) => { + currentTest.addLabel(label.name, label.value); + }); return currentTest; }; diff --git a/packages/allure-jasmine/src/JasmineAllureReporter.ts b/packages/allure-jasmine/src/JasmineAllureReporter.ts index eeaf2824f..3536adc2c 100644 --- a/packages/allure-jasmine/src/JasmineAllureReporter.ts +++ b/packages/allure-jasmine/src/JasmineAllureReporter.ts @@ -8,9 +8,9 @@ import { AttachmentOptions, ContentType, ExecutableItemWrapper, + getSuitesLabels, isPromise, Label, - LabelName, Stage, Status, StepInterface, @@ -95,12 +95,14 @@ export class JasmineAllureReporter implements jasmine.CustomReporter { suiteStarted(suite: jasmine.CustomReporterResult): void { const name = suite.description; const group = (this.getCurrentGroup() || this.runtime).startGroup(name); + this.groupStack.push(group); this.labelStack.push([]); } specStarted(spec: jasmine.CustomReporterResult): void { let currentGroup = this.getCurrentGroup(); + if (currentGroup === null) { throw new Error("No active suite"); } @@ -110,6 +112,7 @@ export class JasmineAllureReporter implements jasmine.CustomReporter { const name = spec.description; const allureTest = currentGroup.startTest(name); + if (this.runningTest != null) { throw new Error("Test is starting before other ended!"); } @@ -119,17 +122,9 @@ export class JasmineAllureReporter implements jasmine.CustomReporter { allureTest.historyId = spec.fullName; allureTest.stage = Stage.RUNNING; - // ignore wrapper, index + 1 - if (this.groupStack.length > 1) { - allureTest.addLabel(LabelName.PARENT_SUITE, this.groupStack[0].name); - } - if (this.groupStack.length > 2) { - allureTest.addLabel(LabelName.SUITE, this.groupStack[1].name); - } - if (this.groupStack.length > 3) { - allureTest.addLabel(LabelName.SUB_SUITE, this.groupStack[2].name); - } - // TODO: if more depth add something to test name + getSuitesLabels(this.groupStack.map(({ name }) => name)).forEach((label) => { + allureTest.addLabel(label.name, label.value); + }); for (const labels of this.labelStack) { for (const label of labels) { diff --git a/packages/allure-jasmine/test/label.test.ts b/packages/allure-jasmine/test/label.test.ts index 02332507d..30f8014c7 100644 --- a/packages/allure-jasmine/test/label.test.ts +++ b/packages/allure-jasmine/test/label.test.ts @@ -6,13 +6,13 @@ describe("Allure Result", () => { beforeAll(() => jasmine.addMatchers(matchers)); describe("for test with bdd labels in 'it'", function () { - const example = (tetEnv: JasmineTestEnv, testAllure: Allure) => { - tetEnv.describe("Jasmine example", () => { - tetEnv.it("passed test", () => { + const example = (testEnv: JasmineTestEnv, testAllure: Allure) => { + testEnv.describe("Jasmine example", () => { + testEnv.it("passed test", () => { testAllure.epic("epic from it"); testAllure.feature("feature from it"); testAllure.story("story from it"); - tetEnv.expect(true).toBeTruthy(); + testEnv.expect(true).toBeTruthy(); }); }); }; @@ -30,16 +30,16 @@ describe("Allure Result", () => { }); describe("for test with bdd labels in 'describe'", function () { - const example = (tetEnv: any, testAllure: Allure) => { - tetEnv.describe("Jasmine example", () => { - tetEnv.beforeAll(() => { + const example = (testEnv: any, testAllure: Allure) => { + testEnv.describe("Jasmine example", () => { + testEnv.beforeAll(() => { testAllure.epic("epic from describe"); testAllure.feature("feature from describe"); testAllure.story("story from describe"); }); - tetEnv.it("passed test", () => { - tetEnv.expect(true).toBeTruthy(); + testEnv.it("passed test", () => { + testEnv.expect(true).toBeTruthy(); }); }); }; diff --git a/packages/allure-jasmine/test/suites.test.ts b/packages/allure-jasmine/test/suites.test.ts new file mode 100644 index 000000000..a700e6c2c --- /dev/null +++ b/packages/allure-jasmine/test/suites.test.ts @@ -0,0 +1,62 @@ +import { Allure, LabelName } from "allure-js-commons"; +import { JasmineTestEnv, runTest } from "./helpers"; +import { matchers } from "./matchers"; +import { AllureWriter } from "allure-js-commons/dist/src/writers"; + +describe("Allure Result", () => { + beforeAll(() => jasmine.addMatchers(matchers)); + + describe("test with multiple nested describe blocks", function () { + const example = (testEnv: JasmineTestEnv, testAllure: Allure) => { + testEnv.describe("first suite", () => { + testEnv.describe("second suite", () => { + testEnv.describe("third suite", () => { + testEnv.describe("fourth suite", () => { + testEnv.it("passed test", () => { + testEnv.expect(true).toBe(true); + }); + }); + }); + }); + }); + }; + let result: AllureWriter; + + beforeEach(async () => { + result = await runTest(example); + }); + + it("adds parent suite label", async function async() { + expect(result).toHaveTestLike({ + labels: [ + { + name: LabelName.PARENT_SUITE, + value: "first suite", + }, + ], + }); + }); + + it("adds suite label", async function async() { + expect(result).toHaveTestLike({ + labels: [ + { + name: LabelName.SUITE, + value: "second suite", + }, + ], + }); + }); + + it("adds sub suite label", async function async() { + expect(result).toHaveTestLike({ + labels: [ + { + name: LabelName.SUB_SUITE, + value: "third suite > fourth suite", + }, + ], + }); + }); + }); +}); diff --git a/packages/allure-js-commons/index.ts b/packages/allure-js-commons/index.ts index 558e4ad88..0da83f99c 100644 --- a/packages/allure-js-commons/index.ts +++ b/packages/allure-js-commons/index.ts @@ -52,7 +52,8 @@ export { allureReportFolder, stripAscii, allureIdRegexp, - allureLabelRegexp + allureLabelRegexp, + getSuitesLabels } from "./src/utils"; export { parseTestPlan } from "./src/testplan"; diff --git a/packages/allure-js-commons/package.json b/packages/allure-js-commons/package.json index d172b1334..ae4d97c3a 100644 --- a/packages/allure-js-commons/package.json +++ b/packages/allure-js-commons/package.json @@ -32,7 +32,7 @@ "lint": "eslint ./src ./index.ts --ext .ts", "lint:fix": "eslint ./src ./index.ts --ext .ts --fix", "compile": "tsc", - "test": "nyc ts-node --project test/tsconfig.json test/runner.ts" + "test": "nyc tsx --tsconfig test/tsconfig.json test/runner.ts" }, "devDependencies": { "@types/chai": "^4.2.21", @@ -48,7 +48,7 @@ "mocha-multi-reporters": "^1.5.1", "nyc": "^15.1.0", "rimraf": "^3.0.2", - "ts-node": "^10.2.1", + "tsx": "^3.12.7", "typescript": "^4.4.2" }, "dependencies": { diff --git a/packages/allure-js-commons/src/utils.ts b/packages/allure-js-commons/src/utils.ts index 2c4a84cb7..aa40443f0 100644 --- a/packages/allure-js-commons/src/utils.ts +++ b/packages/allure-js-commons/src/utils.ts @@ -2,8 +2,9 @@ import { createHash } from "crypto"; import { readFile } from "fs/promises"; import path from "path"; import { env } from "process"; +import { AllureTest } from "./AllureTest"; +import { ExecutableItem, Label, LabelName, Status } from "./model"; -import { ExecutableItem, Label, Status } from "./model"; export const md5 = (data: string) => createHash("md5").update(data).digest("hex"); export const getLabelsFromEnv = (): Label[] => { @@ -95,3 +96,35 @@ export const getStatusFromError = (error: Error): Status => { return Status.BROKEN; } }; + +export const getSuitesLabels = (suites: string[]): Label[] => { + if (suites.length === 0) { + return []; + } + + const [parentSuite, suite, ...subSuites] = suites; + const labels: Label[] = []; + + if (parentSuite) { + labels.push({ + name: LabelName.PARENT_SUITE, + value: parentSuite, + }); + } + + if (suite) { + labels.push({ + name: LabelName.SUITE, + value: suite, + }); + } + + if (subSuites.length > 0) { + labels.push({ + name: LabelName.SUB_SUITE, + value: subSuites.join(" > "), + }); + } + + return labels; +}; diff --git a/packages/allure-js-commons/test/specs/utils.spec.ts b/packages/allure-js-commons/test/specs/utils.spec.ts index a535b10ae..122ee4095 100644 --- a/packages/allure-js-commons/test/specs/utils.spec.ts +++ b/packages/allure-js-commons/test/specs/utils.spec.ts @@ -1,9 +1,14 @@ -import assert, { AssertionError } from "node:assert"; +import assert from "node:assert"; import { expect } from "chai"; import { expect as jestExpect } from "expect"; -import { ExecutableItem, LabelName, Status } from "../../src/model"; -import { allureLabelRegexp, getStatusFromError, isAnyStepFailed } from "../../src/utils"; import { typeToExtension } from "../../dist/src/writers"; +import { ExecutableItem, LabelName, Status } from "../../src/model"; +import { + allureLabelRegexp, + getStatusFromError, + getSuitesLabels, + isAnyStepFailed, +} from "../../src/utils"; const fixtures = { withoutFailed: { @@ -217,3 +222,56 @@ describe("writers > utils > typeToExtension", () => { expect(extension).eq(""); }); }); + +describe("utils > getSuitesLabels", () => { + describe("with empty suites", () => { + it("returns empty array", () => { + expect(getSuitesLabels([])).eql([]); + }); + }); + + describe("with single suite", () => { + it("returns parent suite label as the first element", () => { + expect(getSuitesLabels(["foo"])).eql([ + { + name: LabelName.PARENT_SUITE, + value: "foo", + }, + ]); + }); + }); + + describe("with two suites", () => { + it("returns parent suite and suite labels as the first two elements", () => { + expect(getSuitesLabels(["foo", "bar"])).eql([ + { + name: LabelName.PARENT_SUITE, + value: "foo", + }, + { + name: LabelName.SUITE, + value: "bar", + }, + ]); + }); + }); + + describe("with three or more suites", () => { + it("returns list of three elements where last one is a sub suite label", () => { + expect(getSuitesLabels(["foo", "bar", "baz", "beep", "boop"])).eql([ + { + name: LabelName.PARENT_SUITE, + value: "foo", + }, + { + name: LabelName.SUITE, + value: "bar", + }, + { + name: LabelName.SUB_SUITE, + value: "baz > beep > boop", + }, + ]); + }); + }); +}); diff --git a/packages/allure-mocha/package.json b/packages/allure-mocha/package.json index 7d5c0875c..f7ba0820b 100644 --- a/packages/allure-mocha/package.json +++ b/packages/allure-mocha/package.json @@ -25,8 +25,8 @@ "compile": "tsc", "generate-report": "allure generate ./out/allure-results -o ./out/allure-report --clean", "allure-report": "allure serve ./out/allure-results", - "test:compile": "nyc ts-node --project test/tsconfig.json", - "test": "nyc ts-node --project test/tsconfig.json test/runner.ts", + "test:compile": "nyc tsx --tsconfig test/tsconfig.json", + "test": "nyc tsx --tsconfig test/tsconfig.json test/runner.ts", "coverage": "codecov", "lint": "eslint ./src --ext .ts", "lint:fix": "eslint ./src --ext .ts --fix" @@ -46,7 +46,7 @@ "nyc": "^15.0.1", "rimraf": "^3.0.2", "source-map-support": "^0.5.19", - "ts-node": "^10.2.1", + "tsx": "^3.12.7", "typescript": "^4.4.2" }, "dependencies": { diff --git a/packages/allure-mocha/src/AllureReporter.ts b/packages/allure-mocha/src/AllureReporter.ts index afd6f93be..c954bc2e9 100644 --- a/packages/allure-mocha/src/AllureReporter.ts +++ b/packages/allure-mocha/src/AllureReporter.ts @@ -8,6 +8,7 @@ import { AttachmentOptions, ContentType, ExecutableItemWrapper, + getSuitesLabels, LabelName, md5, Stage, @@ -112,19 +113,11 @@ export class AllureReporter { } if (test.parent) { - const [parentSuite, suite, ...subSuites] = this.getSuitePath(test); + const suites = this.getSuitePath(test); - if (parentSuite) { - this.currentTest.addLabel(LabelName.PARENT_SUITE, parentSuite); - } - - if (suite) { - this.currentTest.addLabel(LabelName.SUITE, suite); - } - - if (subSuites.length > 0) { - this.currentTest.addLabel(LabelName.SUB_SUITE, subSuites.join(" > ")); - } + getSuitesLabels(suites).forEach((label) => { + this.currentTest!.addLabel(label.name, label.value); + }); } } diff --git a/packages/allure-mocha/test/specs/reporter.ts b/packages/allure-mocha/test/specs/reporter.ts index d8dc7b265..2be51348e 100644 --- a/packages/allure-mocha/test/specs/reporter.ts +++ b/packages/allure-mocha/test/specs/reporter.ts @@ -14,8 +14,8 @@ describe("reporter", () => { describe("parallel mode", () => { it("prints warnings about allure api", () => { const out = spawnSync( - "ts-node", - ["--project", "test/tsconfig.json", "test/fixtures/runners/parallel.ts"], + "tsx", + ["--tsconfig", "test/tsconfig.json", "test/fixtures/runners/parallel.ts"], { cwd: process.cwd(), }, @@ -28,8 +28,8 @@ describe("reporter", () => { describe("single thread mode", () => { it("doesn't print any warning about allure api", () => { const out = spawnSync( - "ts-node", - ["--project", "test/tsconfig.json", "test/fixtures/runners/singleThread.ts"], + "tsx", + ["--tsconfig", "test/tsconfig.json", "test/fixtures/runners/singleThread.ts"], { cwd: process.cwd(), }, diff --git a/yarn.lock b/yarn.lock index acc4fc547..370d5c1ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -490,22 +490,6 @@ __metadata: languageName: node linkType: hard -"@cspotcode/source-map-consumer@npm:0.8.0": - version: 0.8.0 - resolution: "@cspotcode/source-map-consumer@npm:0.8.0" - checksum: c0c16ca3d2f58898f1bd74c4f41a189dbcc202e642e60e489cbcc2e52419c4e89bdead02c886a12fb13ea37798ede9e562b2321df997ebc210ae9bd881561b4e - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:0.6.1": - version: 0.6.1 - resolution: "@cspotcode/source-map-support@npm:0.6.1" - dependencies: - "@cspotcode/source-map-consumer": 0.8.0 - checksum: da9fb4f6404ebd210537bfa8b2821a747407bf422d2d3d46f29bf85c7c3a68a126de1a9ec41398d57ca116c3bef56d58c2fb4def0800630b1ec82533ad2447c2 - languageName: node - linkType: hard - "@cucumber/ci-environment@npm:9.1.0": version: 9.1.0 resolution: "@cucumber/ci-environment@npm:9.1.0" @@ -725,6 +709,190 @@ __metadata: languageName: node linkType: hard +"@esbuild-kit/cjs-loader@npm:^2.4.2": + version: 2.4.2 + resolution: "@esbuild-kit/cjs-loader@npm:2.4.2" + dependencies: + "@esbuild-kit/core-utils": ^3.0.0 + get-tsconfig: ^4.4.0 + checksum: e346e339bfc7eff5c52c270fd0ec06a7f2341b624adfb69f84b7d83f119c35070420906f2761a0b4604e0a0ec90e35eaf12544585476c428ed6d6ee3b250c0fe + languageName: node + linkType: hard + +"@esbuild-kit/core-utils@npm:^3.0.0": + version: 3.1.0 + resolution: "@esbuild-kit/core-utils@npm:3.1.0" + dependencies: + esbuild: ~0.17.6 + source-map-support: ^0.5.21 + checksum: d54fd5adb3ce6784d84bb025ad54ddcfbab99267071a7f65298e547f56696f0b9d0dba96c535f9678a30d4887ec71cd445fdd277d65fbec1f3b504f6808f693e + languageName: node + linkType: hard + +"@esbuild-kit/esm-loader@npm:^2.5.5": + version: 2.5.5 + resolution: "@esbuild-kit/esm-loader@npm:2.5.5" + dependencies: + "@esbuild-kit/core-utils": ^3.0.0 + get-tsconfig: ^4.4.0 + checksum: 9d4a03ffc937fbec75a8456c3d45d7cdb1a65768416791a5720081753502bc9f485ba27942a46f564b12483b140a8a46c12433a4496430d93e4513e430484ec7 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-arm64@npm:0.17.19" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-arm@npm:0.17.19" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-x64@npm:0.17.19" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/darwin-arm64@npm:0.17.19" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/darwin-x64@npm:0.17.19" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/freebsd-arm64@npm:0.17.19" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/freebsd-x64@npm:0.17.19" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-arm64@npm:0.17.19" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-arm@npm:0.17.19" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-ia32@npm:0.17.19" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-loong64@npm:0.17.19" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-mips64el@npm:0.17.19" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-ppc64@npm:0.17.19" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-riscv64@npm:0.17.19" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-s390x@npm:0.17.19" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-x64@npm:0.17.19" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/netbsd-x64@npm:0.17.19" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/openbsd-x64@npm:0.17.19" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/sunos-x64@npm:0.17.19" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-arm64@npm:0.17.19" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-ia32@npm:0.17.19" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-x64@npm:0.17.19" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^0.4.3": version: 0.4.3 resolution: "@eslint/eslintrc@npm:0.4.3" @@ -1357,34 +1525,6 @@ __metadata: languageName: node linkType: hard -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.8 - resolution: "@tsconfig/node10@npm:1.0.8" - checksum: b8d5fffbc6b17ef64ef74f7fdbccee02a809a063ade785c3648dae59406bc207f70ea2c4296f92749b33019fa36a5ae716e42e49cc7f1bbf0fd147be0d6b970a - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node12@npm:1.0.9" - checksum: a01b2400ab3582b86b589c6d31dcd0c0656f333adecde85d6d7d4086adb059808b82692380bb169546d189bf771ae21d02544a75b57bd6da4a5dd95f8567bec9 - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.1 - resolution: "@tsconfig/node14@npm:1.0.1" - checksum: 976345e896c0f059867f94f8d0f6ddb8b1844fb62bf36b727de8a9a68f024857e5db97ed51d3325e23e0616a5e48c034ff51a8d595b3fe7e955f3587540489be - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.2 - resolution: "@tsconfig/node16@npm:1.0.2" - checksum: ca94d3639714672bbfd55f03521d3f56bb6a25479bd425da81faf21f13e1e9d15f40f97377dedbbf477a5841c5b0c8f4cd1b391f33553d750b9202c54c2c07aa - languageName: node - linkType: hard - "@types/aria-query@npm:^5.0.0": version: 5.0.1 resolution: "@types/aria-query@npm:5.0.1" @@ -2080,13 +2220,6 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1": - version: 8.1.1 - resolution: "acorn-walk@npm:8.1.1" - checksum: 5e4dafbcec14fbfac96e1f13726273e969a30fdf607ed4eb6ca335292f85b8c896393fee15837a8f2b27afd7ede0f1c6edb5b5e6d0123a8821fee1a834318e62 - languageName: node - linkType: hard - "acorn@npm:^1.0.3": version: 1.2.2 resolution: "acorn@npm:1.2.2" @@ -2114,7 +2247,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.2.4, acorn@npm:^8.4.1": +"acorn@npm:^8.2.4": version: 8.4.1 resolution: "acorn@npm:8.4.1" bin: @@ -2241,7 +2374,7 @@ __metadata: nyc: ^15.1.0 rimraf: ^3.0.2 sinon: ^14.0.0 - ts-node: ^10.2.1 + tsx: ^3.12.7 typescript: ^4.4.2 languageName: unknown linkType: soft @@ -2268,7 +2401,7 @@ __metadata: nyc: ^15.0.1 rimraf: ^3.0.2 source-map-support: ^0.5.19 - ts-node: ^10.2.1 + tsx: ^3.12.7 typescript: ^4.4.2 languageName: unknown linkType: soft @@ -2295,7 +2428,7 @@ __metadata: rimraf: ^3.0.2 selenium-standalone: ^8.3.0 source-map-support: ^0.5.19 - ts-node: ^10.2.1 + tsx: ^3.12.7 typescript: ^4.4.2 languageName: unknown linkType: soft @@ -2344,7 +2477,7 @@ __metadata: nyc: ^15.1.0 properties: ^1.2.1 rimraf: ^3.0.2 - ts-node: ^10.2.1 + tsx: ^3.12.7 typescript: ^4.4.2 uuid: ^8.3.0 languageName: unknown @@ -2371,7 +2504,7 @@ __metadata: prettier: ^2.3.2 replace-in-file: ^6.2.0 rimraf: ^3.0.2 - ts-node: ^10.2.1 + tsx: ^3.12.7 typescript: ^4.4.2 languageName: unknown linkType: soft @@ -2395,7 +2528,7 @@ __metadata: nyc: ^15.0.1 rimraf: ^3.0.2 source-map-support: ^0.5.19 - ts-node: ^10.2.1 + tsx: ^3.12.7 typescript: ^4.4.2 peerDependencies: mocha: ">=6.2.x" @@ -2597,13 +2730,6 @@ __metadata: languageName: node linkType: hard -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -4396,13 +4522,6 @@ __metadata: languageName: node linkType: hard -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - "cross-fetch@npm:3.1.5": version: 3.1.5 resolution: "cross-fetch@npm:3.1.5" @@ -5284,6 +5403,83 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:~0.17.6": + version: 0.17.19 + resolution: "esbuild@npm:0.17.19" + dependencies: + "@esbuild/android-arm": 0.17.19 + "@esbuild/android-arm64": 0.17.19 + "@esbuild/android-x64": 0.17.19 + "@esbuild/darwin-arm64": 0.17.19 + "@esbuild/darwin-x64": 0.17.19 + "@esbuild/freebsd-arm64": 0.17.19 + "@esbuild/freebsd-x64": 0.17.19 + "@esbuild/linux-arm": 0.17.19 + "@esbuild/linux-arm64": 0.17.19 + "@esbuild/linux-ia32": 0.17.19 + "@esbuild/linux-loong64": 0.17.19 + "@esbuild/linux-mips64el": 0.17.19 + "@esbuild/linux-ppc64": 0.17.19 + "@esbuild/linux-riscv64": 0.17.19 + "@esbuild/linux-s390x": 0.17.19 + "@esbuild/linux-x64": 0.17.19 + "@esbuild/netbsd-x64": 0.17.19 + "@esbuild/openbsd-x64": 0.17.19 + "@esbuild/sunos-x64": 0.17.19 + "@esbuild/win32-arm64": 0.17.19 + "@esbuild/win32-ia32": 0.17.19 + "@esbuild/win32-x64": 0.17.19 + dependenciesMeta: + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: ac11b1a5a6008e4e37ccffbd6c2c054746fc58d0ed4a2f9ee643bd030cfcea9a33a235087bc777def8420f2eaafb3486e76adb7bdb7241a9143b43a69a10afd8 + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -6444,6 +6640,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.4.0": + version: 4.6.0 + resolution: "get-tsconfig@npm:4.6.0" + dependencies: + resolve-pkg-maps: ^1.0.0 + checksum: fd2589a50e21543cf416285e5c4ac605359f49209b6c2e66bb8698fac907356e060de0a681e40881f00182b6f19771377411a88adcc78fd3954732ff54f4a54d + languageName: node + linkType: hard + "get-value@npm:^2.0.3, get-value@npm:^2.0.6": version: 2.0.6 resolution: "get-value@npm:2.0.6" @@ -9284,7 +9489,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x, make-error@npm:^1.1.1": +"make-error@npm:1.x": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -11853,6 +12058,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 1012afc566b3fdb190a6309cc37ef3b2dcc35dff5fa6683a9d00cd25c3247edfbc4691b91078c97adc82a29b77a2660c30d791d65dab4fc78bfc473f60289977 + languageName: node + linkType: hard + "resolve-pkg@npm:^2.0.0": version: 2.0.0 resolution: "resolve-pkg@npm:2.0.0" @@ -13472,42 +13684,6 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.2.1": - version: 10.2.1 - resolution: "ts-node@npm:10.2.1" - dependencies: - "@cspotcode/source-map-support": 0.6.1 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: f37d2827a583c51d012cdd3d9b96629fba7a5b5dfad2c26ca48c7c89f904118924689ca56f4b9b2136217194870a76f26aae06e3490ee613b0e960f02dc96bbe - languageName: node - linkType: hard - "tsconfig-paths@npm:^3.11.0": version: 3.11.0 resolution: "tsconfig-paths@npm:3.11.0" @@ -13552,6 +13728,23 @@ __metadata: languageName: node linkType: hard +"tsx@npm:^3.12.7": + version: 3.12.7 + resolution: "tsx@npm:3.12.7" + dependencies: + "@esbuild-kit/cjs-loader": ^2.4.2 + "@esbuild-kit/core-utils": ^3.0.0 + "@esbuild-kit/esm-loader": ^2.5.5 + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.js + checksum: ddec149ad263e5c75fc8fde5c6ba7ec2ee390934c0a2e2c23897bacab83bc8c665955a23b608a19c42f49c14a7362cf74ad793b52cc94eda684be5c2c13fdb4d + languageName: node + linkType: hard + "tty-browserify@npm:~0.0.0": version: 0.0.1 resolution: "tty-browserify@npm:0.0.1" @@ -14608,13 +14801,6 @@ typescript@^4.4.2: languageName: node linkType: hard -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" From 505103908b91ed1460c5a0f788c95350149725e1 Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Fri, 30 Jun 2023 12:50:06 +0200 Subject: [PATCH 05/12] allure-hermione: do not throw errors when session hasn't been started (fixes #708, via #711) --- packages/allure-hermione/src/index.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/allure-hermione/src/index.ts b/packages/allure-hermione/src/index.ts index 0f179f3c9..d2ad04b9f 100644 --- a/packages/allure-hermione/src/index.ts +++ b/packages/allure-hermione/src/index.ts @@ -125,7 +125,9 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = const currentTest = runningTests.get(testId); if (!currentTest) { - throw new Error("Can't set test metadata due browser session has been finished"); + // eslint-disable-next-line no-console + console.error("Can't assing attachment due test has been finished or hasn't been started"); + return; } const { @@ -182,7 +184,11 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = const currentTest = runningTests.get(testId); if (!currentTest) { - throw new Error("Can't set test metadata due browser session has been finished"); + // eslint-disable-next-line no-console + console.error( + `Can't create "${stepMetadata.name!}" step due test has been finished or hasn't been started`, + ); + return; } const step = AllureCommandStepExecutable.toExecutableItem(runtime, stepMetadata); From 045452328e3aee7febb623711da44e568939ea04 Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Tue, 4 Jul 2023 13:11:56 +0200 Subject: [PATCH 06/12] add support for hermione@7 (fixes #706, via #712) --- packages/allure-hermione/docs/development.md | 3 + packages/allure-hermione/package.json | 4 +- packages/allure-hermione/src/index.ts | 6 + .../allure-hermione/test/.hermione.conf.js | 4 +- .../test/fixtures/attachments.js | 2 +- .../allure-hermione/test/fixtures/hooks.js | 4 +- .../allure-hermione/test/fixtures/labels.js | 22 +- .../allure-hermione/test/fixtures/links.js | 6 +- .../test/fixtures/parameters.js | 2 +- .../allure-hermione/test/fixtures/steps.js | 4 +- yarn.lock | 344 ++++++++++++------ 11 files changed, 261 insertions(+), 140 deletions(-) diff --git a/packages/allure-hermione/docs/development.md b/packages/allure-hermione/docs/development.md index e4a65f887..0333625e5 100644 --- a/packages/allure-hermione/docs/development.md +++ b/packages/allure-hermione/docs/development.md @@ -11,6 +11,9 @@ selenium-standalone install # install selenium server selenium-standalone start # start selenium server ``` +Then, install browsers you want to test with. **The grid installs only drivers not browsers +theirself!** + Then you are able to run Hermione tests with the following settings: ```js diff --git a/packages/allure-hermione/package.json b/packages/allure-hermione/package.json index e00bba8c8..1efc63826 100644 --- a/packages/allure-hermione/package.json +++ b/packages/allure-hermione/package.json @@ -39,7 +39,7 @@ "dotenv": "^10.0.0", "fs-jetpack": "^4.1.0", "glob": "^7.1.7", - "hermione": "^6.0.2", + "hermione": "^6.1.3", "mocha": "^9.1.3", "mocha-multi-reporters": "^1.5.1", "nyc": "^15.0.1", @@ -47,7 +47,7 @@ "selenium-standalone": "^8.3.0", "source-map-support": "^0.5.19", "tsx": "^3.12.7", - "typescript": "^4.4.2" + "typescript": "^5.1.3" }, "dependencies": { "allure-js-commons": "workspace:*" diff --git a/packages/allure-hermione/src/index.ts b/packages/allure-hermione/src/index.ts index d2ad04b9f..c6601d436 100644 --- a/packages/allure-hermione/src/index.ts +++ b/packages/allure-hermione/src/index.ts @@ -61,6 +61,12 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = return (testId?: string) => `${context}:${testId || ""}`; } + // hermone >= 7.0.0 has `id` property as a string + if (typeof context.id === "string") { + // eslint-disable-next-line + return () => `${context.browserId}:${context.id}`; + } + return () => `${context.browserId}:${context.id()}`; }; /** diff --git a/packages/allure-hermione/test/.hermione.conf.js b/packages/allure-hermione/test/.hermione.conf.js index 2a9d36e3e..075b099ee 100644 --- a/packages/allure-hermione/test/.hermione.conf.js +++ b/packages/allure-hermione/test/.hermione.conf.js @@ -12,8 +12,8 @@ module.exports = { headless: { automationProtocol: "webdriver", desiredCapabilities: { - browserName: "firefox", - "moz:firefoxOptions": { + browserName: "chrome", + "goog:chromeOptions": { args: ["--headless"], }, }, diff --git a/packages/allure-hermione/test/fixtures/attachments.js b/packages/allure-hermione/test/fixtures/attachments.js index 7de0ac9e5..e8c5ef89a 100644 --- a/packages/allure-hermione/test/fixtures/attachments.js +++ b/packages/allure-hermione/test/fixtures/attachments.js @@ -1,3 +1,3 @@ it("json", async ({ browser, currentTest }) => { - await browser.attach(currentTest.id(), JSON.stringify({ foo: "bar" }), "application/json"); + await browser.attach(currentTest.id, JSON.stringify({ foo: "bar" }), "application/json"); }); diff --git a/packages/allure-hermione/test/fixtures/hooks.js b/packages/allure-hermione/test/fixtures/hooks.js index de73e3e70..82a659677 100644 --- a/packages/allure-hermione/test/fixtures/hooks.js +++ b/packages/allure-hermione/test/fixtures/hooks.js @@ -1,10 +1,10 @@ describe("hooks", () => { beforeEach(async ({ browser, currentTest }) => { - await browser.label(currentTest.id(), "hook", "before"); + await browser.label(currentTest.id, "hook", "before"); }); afterEach(async ({ browser, currentTest }) => { - await browser.label(currentTest.id(), "hook", "after"); + await browser.label(currentTest.id, "hook", "after"); }); it("first test", () => {}); diff --git a/packages/allure-hermione/test/fixtures/labels.js b/packages/allure-hermione/test/fixtures/labels.js index 2927e9e5a..52cdc0e94 100644 --- a/packages/allure-hermione/test/fixtures/labels.js +++ b/packages/allure-hermione/test/fixtures/labels.js @@ -1,43 +1,43 @@ it("custom", async ({ browser, currentTest }) => { - await browser.label(currentTest.id(), "foo", "bar"); + await browser.label(currentTest.id, "foo", "bar"); }); it("allureId", async ({ browser, currentTest }) => { - await browser.id(currentTest.id(), "42"); + await browser.id(currentTest.id, "42"); }); it("epic", async ({ browser, currentTest }) => { - await browser.epic(currentTest.id(), "foo"); + await browser.epic(currentTest.id, "foo"); }); it("owner", async ({ browser, currentTest }) => { - await browser.owner(currentTest.id(), "foo"); + await browser.owner(currentTest.id, "foo"); }); it("parentSuite", async ({ browser, currentTest }) => { - await browser.parentSuite(currentTest.id(), "foo"); + await browser.parentSuite(currentTest.id, "foo"); }); it("subSuite", async ({ browser, currentTest }) => { - await browser.subSuite(currentTest.id(), "foo"); + await browser.subSuite(currentTest.id, "foo"); }); it("severity", async ({ browser, currentTest }) => { - await browser.severity(currentTest.id(), "foo"); + await browser.severity(currentTest.id, "foo"); }); it("story", async ({ browser, currentTest }) => { - await browser.story(currentTest.id(), "foo"); + await browser.story(currentTest.id, "foo"); }); it("suite", async ({ browser, currentTest }) => { - await browser.suite(currentTest.id(), "foo"); + await browser.suite(currentTest.id, "foo"); }); it("tag", async ({ browser, currentTest }) => { - await browser.tag(currentTest.id(), "foo"); + await browser.tag(currentTest.id, "foo"); }); it("feature", async ({ browser, currentTest }) => { - await browser.feature(currentTest.id(), "foo"); + await browser.feature(currentTest.id, "foo"); }); diff --git a/packages/allure-hermione/test/fixtures/links.js b/packages/allure-hermione/test/fixtures/links.js index 22733c842..f59177ec4 100644 --- a/packages/allure-hermione/test/fixtures/links.js +++ b/packages/allure-hermione/test/fixtures/links.js @@ -1,11 +1,11 @@ it("custom", async ({ browser, currentTest }) => { - await browser.link(currentTest.id(), "http://example.org", "bar", "foo"); + await browser.link(currentTest.id, "http://example.org", "bar", "foo"); }); it("tms", async ({ browser, currentTest }) => { - await browser.tms(currentTest.id(), "foo", "http://example.org"); + await browser.tms(currentTest.id, "foo", "http://example.org"); }); it("issue", async ({ browser, currentTest }) => { - await browser.issue(currentTest.id(), "foo", "http://example.org"); + await browser.issue(currentTest.id, "foo", "http://example.org"); }); diff --git a/packages/allure-hermione/test/fixtures/parameters.js b/packages/allure-hermione/test/fixtures/parameters.js index 441122b1f..21d78c82d 100644 --- a/packages/allure-hermione/test/fixtures/parameters.js +++ b/packages/allure-hermione/test/fixtures/parameters.js @@ -1,5 +1,5 @@ it("custom", async ({ browser, currentTest }) => { - await browser.parameter(currentTest.id(), "foo", "bar", { + await browser.parameter(currentTest.id, "foo", "bar", { excluded: false, mode: "hidden", }); diff --git a/packages/allure-hermione/test/fixtures/steps.js b/packages/allure-hermione/test/fixtures/steps.js index e05ec7591..04cd3bc47 100644 --- a/packages/allure-hermione/test/fixtures/steps.js +++ b/packages/allure-hermione/test/fixtures/steps.js @@ -1,5 +1,5 @@ it("passed", async ({ browser, currentTest }) => { - await browser.step(currentTest.id(), "first step name", async (s1) => { + await browser.step(currentTest.id, "first step name", async (s1) => { await s1.step("second step name", async (s2) => { await s2.step("third step name", (s3) => { s3.label("foo", "bar"); @@ -9,7 +9,7 @@ it("passed", async ({ browser, currentTest }) => { }); it("failed", async ({ browser, currentTest }) => { - await browser.step(currentTest.id(), "first step name", async (s1) => { + await browser.step(currentTest.id, "first step name", async (s1) => { await s1.step("second step name", async (s2) => { await s2.step("third step name", (s3) => { throw new Error("foo"); diff --git a/yarn.lock b/yarn.lock index 370d5c1ea..98e15e86d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -924,6 +924,27 @@ __metadata: languageName: node linkType: hard +"@gemini-testing/devtools@npm:7.28.1": + version: 7.28.1 + resolution: "@gemini-testing/devtools@npm:7.28.1" + dependencies: + "@types/node": ^18.0.0 + "@types/ua-parser-js": ^0.7.33 + "@wdio/config": 7.26.0 + "@wdio/logger": 7.26.0 + "@wdio/protocols": 7.27.0 + "@wdio/types": 7.26.0 + "@wdio/utils": 7.26.0 + chrome-launcher: ^0.15.0 + edge-paths: ^2.1.0 + puppeteer-core: ^19.4.0 + query-selector-shadow-dom: ^1.0.0 + ua-parser-js: ^1.0.1 + uuid: ^9.0.0 + checksum: 0018f6783f05ecc1deb4628276308bf8a859ce93cb4ca4054a93cb732f696cf413adbe6846a8fcd46fac52bd99c57291fb957ea7f9b8ad1b457660fff545eb1e + languageName: node + linkType: hard + "@gemini-testing/mocha@npm:^9.3.0": version: 9.3.0 resolution: "@gemini-testing/mocha@npm:9.3.0" @@ -959,6 +980,58 @@ __metadata: languageName: node linkType: hard +"@gemini-testing/webdriver@npm:7.27.0": + version: 7.27.0 + resolution: "@gemini-testing/webdriver@npm:7.27.0" + dependencies: + "@types/node": ^18.0.0 + "@wdio/config": 7.26.0 + "@wdio/logger": 7.26.0 + "@wdio/protocols": 7.27.0 + "@wdio/types": 7.26.0 + "@wdio/utils": 7.26.0 + got: ^11.0.2 + ky: 0.30.0 + lodash.merge: ^4.6.1 + checksum: 1cf8476b5e77de5d9cabaaeebe0f7b799027add3f0306b6c64bca82e5a37f7fb4e4c5481a173e85745dcceb5d8f9202a1aaf9b48a8d06497d14f6d108ff25268 + languageName: node + linkType: hard + +"@gemini-testing/webdriverio@npm:^7.28.3": + version: 7.28.3 + resolution: "@gemini-testing/webdriverio@npm:7.28.3" + dependencies: + "@gemini-testing/devtools": 7.28.1 + "@gemini-testing/webdriver": 7.27.0 + "@types/aria-query": ^5.0.0 + "@types/node": ^18.0.0 + "@wdio/config": 7.26.0 + "@wdio/logger": 7.26.0 + "@wdio/protocols": 7.27.0 + "@wdio/repl": 7.26.0 + "@wdio/types": 7.26.0 + "@wdio/utils": 7.26.0 + archiver: ^5.0.0 + aria-query: ^5.0.0 + css-shorthand-properties: ^1.1.1 + css-value: ^0.0.1 + devtools-protocol: ^0.0.1081726 + fs-extra: ^11.1.0 + grapheme-splitter: ^1.0.2 + lodash.clonedeep: ^4.5.0 + lodash.isobject: ^3.0.2 + lodash.isplainobject: ^4.0.6 + lodash.zip: ^4.2.0 + minimatch: ^5.0.0 + puppeteer-core: ^19.4.0 + query-selector-shadow-dom: ^1.0.0 + resq: ^1.9.1 + rgb2hex: 0.2.5 + serialize-error: ^8.0.0 + checksum: 5b0bf6a2ab7214607b99f94422f6e8a501bc75d9d92853b0f27640d2f54174366e17b414bf8424a1689cdc35f56cef7a3c69cf12f5a539d6bdf6aae5a632d1b9 + languageName: node + linkType: hard + "@hapi/address@npm:^5.1.0": version: 5.1.0 resolution: "@hapi/address@npm:5.1.0" @@ -1418,6 +1491,29 @@ __metadata: languageName: node linkType: hard +"@puppeteer/browsers@npm:0.5.0": + version: 0.5.0 + resolution: "@puppeteer/browsers@npm:0.5.0" + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + https-proxy-agent: 5.0.1 + progress: 2.0.3 + proxy-from-env: 1.1.0 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + yargs: 17.7.1 + peerDependencies: + typescript: ">= 4.7.4" + peerDependenciesMeta: + typescript: + optional: true + bin: + browsers: lib/cjs/main-cli.js + checksum: d75fde03be4be106ca907834739251c2bb0b33a09fa23315c5dbe8b8b4cfed2f1b26af62e1dbe5fccc227e9bc87b51da0815461b982477eb01439bfdd6e7b01a + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.24.1": version: 0.24.51 resolution: "@sinclair/typebox@npm:0.24.51" @@ -2108,7 +2204,7 @@ __metadata: languageName: node linkType: hard -"@wdio/types@npm:7.26.0, @wdio/types@npm:^7.26.0": +"@wdio/types@npm:7.26.0": version: 7.26.0 resolution: "@wdio/types@npm:7.26.0" dependencies: @@ -2123,6 +2219,21 @@ __metadata: languageName: node linkType: hard +"@wdio/types@npm:^7.26.0": + version: 7.30.2 + resolution: "@wdio/types@npm:7.30.2" + dependencies: + "@types/node": ^18.0.0 + got: ^11.8.1 + peerDependencies: + typescript: ^4.6.2 + peerDependenciesMeta: + typescript: + optional: true + checksum: 3f547927eaccc907cb64b0a937ae5e84f3f11bb735c03718981bf134cb73c074d5b80984cc911704bbfbc6638e28ea1699b32407bbc888eb98c89df6a074d676 + languageName: node + linkType: hard + "@wdio/utils@npm:7.26.0, @wdio/utils@npm:^7.26.0": version: 7.26.0 resolution: "@wdio/utils@npm:7.26.0" @@ -2421,7 +2532,7 @@ __metadata: dotenv: ^10.0.0 fs-jetpack: ^4.1.0 glob: ^7.1.7 - hermione: ^6.0.2 + hermione: ^6.1.3 mocha: ^9.1.3 mocha-multi-reporters: ^1.5.1 nyc: ^15.0.1 @@ -2429,7 +2540,7 @@ __metadata: selenium-standalone: ^8.3.0 source-map-support: ^0.5.19 tsx: ^3.12.7 - typescript: ^4.4.2 + typescript: ^5.1.3 languageName: unknown linkType: soft @@ -3871,6 +3982,17 @@ __metadata: languageName: node linkType: hard +"chromium-bidi@npm:0.4.7": + version: 0.4.7 + resolution: "chromium-bidi@npm:0.4.7" + dependencies: + mitt: 3.0.0 + peerDependencies: + devtools-protocol: "*" + checksum: eec7581e2eddd2c95014c6edc5aae0b036c79bbeadee05166436b16139b6932c902c5ce21d95ed919a592f58d3a47c5469dc5f3de2a300700b2748ab119ad65e + languageName: node + linkType: hard + "ci-info@npm:^2.0.0": version: 2.0.0 resolution: "ci-info@npm:2.0.0" @@ -4837,7 +4959,14 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.0.0, deepmerge@npm:^4.2.2": +"deepmerge@npm:^4.0.0": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": version: 4.2.2 resolution: "deepmerge@npm:4.2.2" checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b @@ -4992,10 +5121,10 @@ __metadata: languageName: node linkType: hard -"devtools-protocol@npm:0.0.1068969": - version: 0.0.1068969 - resolution: "devtools-protocol@npm:0.0.1068969" - checksum: 53b9c8d661e4148eaf8e990f03902fb3a2cceb06044f661013b6c92dd48ece397ef49fd18401775823c9a33069b4b535502f2559d4f99c74a6bdcb71582b6c8a +"devtools-protocol@npm:0.0.1107588": + version: 0.0.1107588 + resolution: "devtools-protocol@npm:0.0.1107588" + checksum: 9064fd643f39ae0adabb8f425b746899ff24371d89a5047d38752653259e6afcb6bcb2d9759ff727eb5885cfc0f9ba8eb384850a2af00694135622e88080e3e5 languageName: node linkType: hard @@ -5006,27 +5135,6 @@ __metadata: languageName: node linkType: hard -"devtools@npm:7.28.0": - version: 7.28.0 - resolution: "devtools@npm:7.28.0" - dependencies: - "@types/node": ^18.0.0 - "@types/ua-parser-js": ^0.7.33 - "@wdio/config": 7.26.0 - "@wdio/logger": 7.26.0 - "@wdio/protocols": 7.27.0 - "@wdio/types": 7.26.0 - "@wdio/utils": 7.26.0 - chrome-launcher: ^0.15.0 - edge-paths: ^2.1.0 - puppeteer-core: ^19.4.0 - query-selector-shadow-dom: ^1.0.0 - ua-parser-js: ^1.0.1 - uuid: ^9.0.0 - checksum: fae0638175e0b8ca49737fef363ee9ca09a257587f8fc2adcf76edfd90b6a70c1c54ea77d099c7afeb429d59c09f96b591ad377cfa50b51546d806c1d20d8641 - languageName: node - linkType: hard - "diff-sequences@npm:^26.6.2": version: 26.6.2 resolution: "diff-sequences@npm:26.6.2" @@ -6428,13 +6536,13 @@ __metadata: linkType: hard "fs-extra@npm:^11.1.0": - version: 11.1.0 - resolution: "fs-extra@npm:11.1.0" + version: 11.1.1 + resolution: "fs-extra@npm:11.1.1" dependencies: graceful-fs: ^4.2.0 jsonfile: ^6.0.1 universalify: ^2.0.0 - checksum: 5ca476103fa1f5ff4a9b3c4f331548f8a3c1881edaae323a4415d3153b5dc11dc6a981c8d1dd93eec8367ceee27b53f8bd27eecbbf66ffcdd04927510c171e7f + checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd languageName: node linkType: hard @@ -7080,12 +7188,13 @@ __metadata: languageName: node linkType: hard -"hermione@npm:^6.0.2": - version: 6.0.2 - resolution: "hermione@npm:6.0.2" +"hermione@npm:^6.1.3": + version: 6.1.3 + resolution: "hermione@npm:6.1.3" dependencies: "@gemini-testing/commander": 2.15.3 "@gemini-testing/mocha": ^9.3.0 + "@gemini-testing/webdriverio": ^7.28.3 "@types/mocha": ^9.0.0 "@wdio/types": ^7.26.0 "@wdio/utils": ^7.26.0 @@ -7109,16 +7218,14 @@ __metadata: sharp: ~0.30.7 sizzle: ^2.3.6 temp: ^0.8.3 - uglify-js: ^2.8.29 uglifyify: ^3.0.4 urijs: ^1.19.11 url-join: ^4.0.1 - webdriverio: 7.28.0 worker-farm: ^1.7.0 yallist: ^3.1.1 bin: hermione: bin/hermione - checksum: 25321e19262beac2b7949506f294a6bfad593d0a67e2212b9b83de2f110cac8bcd8e662cb2e193730a6f7710b2ee4e7eb49e3108b1dc1b7e75123198358102a4 + checksum: aab053a50a46819e2181ff69cdba3c466b9864abf6e13062071456d5251528b9e893d21d05626d34547c6db8f5f6d3da01238a8bf6f321c941f62133b384d7ef languageName: node linkType: hard @@ -9782,12 +9889,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.0, minimatch@npm:^5.1.0": - version: 5.1.1 - resolution: "minimatch@npm:5.1.1" +"minimatch@npm:^5.0.0": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: brace-expansion: ^2.0.1 - checksum: 215edd0978320a3354188f84a537d45841f2449af4df4379f79b9b777e71aa4f5722cc9d1717eabd2a70d38ef76ab7b708d24d83ea6a6c909dfd8833de98b437 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 languageName: node linkType: hard @@ -9800,6 +9907,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^5.1.0": + version: 5.1.1 + resolution: "minimatch@npm:5.1.1" + dependencies: + brace-expansion: ^2.0.1 + checksum: 215edd0978320a3354188f84a537d45841f2449af4df4379f79b9b777e71aa4f5722cc9d1717eabd2a70d38ef76ab7b708d24d83ea6a6c909dfd8833de98b437 + languageName: node + linkType: hard + "minimist@npm:^1.1.0, minimist@npm:^1.2.3": version: 1.2.7 resolution: "minimist@npm:1.2.7" @@ -9891,6 +10007,13 @@ __metadata: languageName: node linkType: hard +"mitt@npm:3.0.0": + version: 3.0.0 + resolution: "mitt@npm:3.0.0" + checksum: f7be5049d27d18b1dbe9408452d66376fa60ae4a79fe9319869d1b90ae8cbaedadc7e9dab30b32d781411256d468be5538996bb7368941c09009ef6bbfa6bfc7 + languageName: node + linkType: hard + "mixin-deep@npm:^1.2.0": version: 1.3.2 resolution: "mixin-deep@npm:1.3.2" @@ -11654,20 +11777,26 @@ __metadata: linkType: hard "puppeteer-core@npm:^19.4.0": - version: 19.5.0 - resolution: "puppeteer-core@npm:19.5.0" + version: 19.11.1 + resolution: "puppeteer-core@npm:19.11.1" dependencies: + "@puppeteer/browsers": 0.5.0 + chromium-bidi: 0.4.7 cross-fetch: 3.1.5 debug: 4.3.4 - devtools-protocol: 0.0.1068969 + devtools-protocol: 0.0.1107588 extract-zip: 2.0.1 https-proxy-agent: 5.0.1 proxy-from-env: 1.1.0 - rimraf: 3.0.2 tar-fs: 2.1.1 unbzip2-stream: 1.4.3 - ws: 8.11.0 - checksum: 0cdac5c54dc9933f4e819ed57ecaa7dc93861937606ba1fab87365c4935a4709543f472e4c9f7eb3c09bf414dceee61acf41c983ab000f06bcf7339615082cd1 + ws: 8.13.0 + peerDependencies: + typescript: ">= 4.7.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 06126e478b8b653e83b98b51cec35dceef8ab576abd1369afd45360c5bac3711443e58ebe3b852d40801a118e4cb7ddf5d3154518b5a9294ee93f7a42d9f22d4 languageName: node linkType: hard @@ -12232,25 +12361,25 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:3.0.2, rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" +"rimraf@npm:^2.6.3": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" dependencies: glob: ^7.1.3 bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + rimraf: ./bin.js + checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd languageName: node linkType: hard -"rimraf@npm:^2.6.3": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" +"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" dependencies: glob: ^7.1.3 bin: - rimraf: ./bin.js - checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 languageName: node linkType: hard @@ -13875,6 +14004,16 @@ typescript@^4.4.2: languageName: node linkType: hard +"typescript@npm:^5.1.3": + version: 5.1.6 + resolution: "typescript@npm:5.1.6" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350 + languageName: node + linkType: hard + "typescript@patch:typescript@^4.4.2#~builtin": version: 4.4.2 resolution: "typescript@patch:typescript@npm%3A4.4.2#~builtin::version=4.4.2&hash=bbeadb" @@ -13885,6 +14024,16 @@ typescript@^4.4.2: languageName: node linkType: hard +"typescript@patch:typescript@^5.1.3#~builtin": + version: 5.1.6 + resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin::version=5.1.6&hash=85af82" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 21e88b0a0c0226f9cb9fd25b9626fb05b4c0f3fddac521844a13e1f30beb8f14e90bd409a9ac43c812c5946d714d6e0dee12d5d02dfc1c562c5aacfa1f49b606 + languageName: node + linkType: hard + "ua-parser-js@npm:^1.0.1": version: 1.0.32 resolution: "ua-parser-js@npm:1.0.32" @@ -13892,7 +14041,7 @@ typescript@^4.4.2: languageName: node linkType: hard -"uglify-js@npm:2.x.x, uglify-js@npm:^2.8.29": +"uglify-js@npm:2.x.x": version: 2.8.29 resolution: "uglify-js@npm:2.8.29" dependencies: @@ -14287,58 +14436,6 @@ typescript@^4.4.2: languageName: node linkType: hard -"webdriver@npm:7.27.0": - version: 7.27.0 - resolution: "webdriver@npm:7.27.0" - dependencies: - "@types/node": ^18.0.0 - "@wdio/config": 7.26.0 - "@wdio/logger": 7.26.0 - "@wdio/protocols": 7.27.0 - "@wdio/types": 7.26.0 - "@wdio/utils": 7.26.0 - got: ^11.0.2 - ky: 0.30.0 - lodash.merge: ^4.6.1 - checksum: 6a908a689444326bde3afb98f043c3eeed615ef82a5c7da369d9bae18694c99b84df98736f585f7af3c3d8032703e3b5431a652eaa4fc250af6e6db1464be254 - languageName: node - linkType: hard - -"webdriverio@npm:7.28.0": - version: 7.28.0 - resolution: "webdriverio@npm:7.28.0" - dependencies: - "@types/aria-query": ^5.0.0 - "@types/node": ^18.0.0 - "@wdio/config": 7.26.0 - "@wdio/logger": 7.26.0 - "@wdio/protocols": 7.27.0 - "@wdio/repl": 7.26.0 - "@wdio/types": 7.26.0 - "@wdio/utils": 7.26.0 - archiver: ^5.0.0 - aria-query: ^5.0.0 - css-shorthand-properties: ^1.1.1 - css-value: ^0.0.1 - devtools: 7.28.0 - devtools-protocol: ^0.0.1081726 - fs-extra: ^11.1.0 - grapheme-splitter: ^1.0.2 - lodash.clonedeep: ^4.5.0 - lodash.isobject: ^3.0.2 - lodash.isplainobject: ^4.0.6 - lodash.zip: ^4.2.0 - minimatch: ^5.0.0 - puppeteer-core: ^19.4.0 - query-selector-shadow-dom: ^1.0.0 - resq: ^1.9.1 - rgb2hex: 0.2.5 - serialize-error: ^8.0.0 - webdriver: 7.27.0 - checksum: 49e651f19e0b6e2541b4de7c9946890962ea1c72df4543f00ef466dddf8b8333351e48ef0955077b9bd0742dc4006334e3933055b4c72689a3da58bbc622d212 - languageName: node - linkType: hard - "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -14573,18 +14670,18 @@ typescript@^4.4.2: languageName: node linkType: hard -"ws@npm:8.11.0": - version: 8.11.0 - resolution: "ws@npm:8.11.0" +"ws@npm:8.13.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 316b33aba32f317cd217df66dbfc5b281a2f09ff36815de222bc859e3424d83766d9eb2bd4d667de658b6ab7be151f258318fb1da812416b30be13103e5b5c67 + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c languageName: node linkType: hard @@ -14745,6 +14842,21 @@ typescript@^4.4.2: languageName: node linkType: hard +"yargs@npm:17.7.1": + version: 17.7.1 + resolution: "yargs@npm:17.7.1" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 + languageName: node + linkType: hard + "yargs@npm:^15.0.2, yargs@npm:^15.4.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" From 800d4af216c98a335822bddb1564d8743a57963b Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Tue, 18 Jul 2023 13:08:08 +0200 Subject: [PATCH 07/12] use browser id instead of session id on test start (via #716) --- packages/allure-hermione/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/allure-hermione/src/index.ts b/packages/allure-hermione/src/index.ts index c6601d436..ac70110e1 100644 --- a/packages/allure-hermione/src/index.ts +++ b/packages/allure-hermione/src/index.ts @@ -285,7 +285,7 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = }); hermione.on(hermione.events.TEST_BEGIN, (test) => { // test hasn't been actually started - if (!test.sessionId) { + if (!test.browserId) { return; } From 628768dbcb2886c3496371e2e21a1dad13f9b582 Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Thu, 20 Jul 2023 16:01:06 +0200 Subject: [PATCH 08/12] feat(hermione): add display name and description runtime api (fixes #715, fixes #714, via #731) --- packages/allure-hermione/README.md | 21 +++++++++++++ packages/allure-hermione/src/index.ts | 17 +++++++++++ packages/allure-hermione/src/utils.ts | 18 +++++++++++ .../test/fixtures/description.js | 7 +++++ .../test/fixtures/displayName.js | 3 ++ .../test/spec/description.test.ts | 30 +++++++++++++++++++ .../test/spec/displayName.test.ts | 25 ++++++++++++++++ .../allure-hermione/test/spec/labels.test.ts | 4 +-- packages/allure-js-commons/src/model.ts | 1 + 9 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 packages/allure-hermione/test/fixtures/description.js create mode 100644 packages/allure-hermione/test/fixtures/displayName.js create mode 100644 packages/allure-hermione/test/spec/description.test.ts create mode 100644 packages/allure-hermione/test/spec/displayName.test.ts diff --git a/packages/allure-hermione/README.md b/packages/allure-hermione/README.md index a2ca91b74..3cff89ced 100644 --- a/packages/allure-hermione/README.md +++ b/packages/allure-hermione/README.md @@ -53,6 +53,27 @@ Don't forget to pass current test id as first argument to command! ## Supported commands +### Display name + +Change your test case name on custom value on the fly using `displayName` method: + +```js +it("my test", async ({ browser, currentTest }) => { + await browser.displayName(currentTest.id(), "my test custom name"); +}); +``` + +### Description + +Provide description in markdown or html syntax: + +```js +it("my test", async ({ browser, currentTest }) => { + await browser.description(currentTest.id(), "my **markdown description**"); + await browser.descriptionHtml(currentTest.id(), "

my html description

"); +}); +``` + ### Labels Markup you tests with labels using low-level `label` method: diff --git a/packages/allure-hermione/src/index.ts b/packages/allure-hermione/src/index.ts index ac70110e1..b682aa439 100644 --- a/packages/allure-hermione/src/index.ts +++ b/packages/allure-hermione/src/index.ts @@ -27,6 +27,9 @@ import { addParameter, getSuitePath, sendMetadata, + setDescription, + setDescriptionHtml, + setDisplayName, } from "./utils"; export type HermioneAttachmentMessage = { @@ -144,6 +147,7 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = steps = [], description, descriptionHtml, + displayName, } = metadata; labels.forEach((label) => { @@ -185,6 +189,10 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = if (descriptionHtml) { currentTest.descriptionHtml = descriptionHtml; } + + if (displayName) { + currentTest.name = displayName; + } }; const handleAllureStep = (testId: string, stepMetadata: StepMetadata) => { const currentTest = runningTests.get(testId); @@ -263,6 +271,15 @@ const hermioneAllureReporter = (hermione: Hermione, opts: AllureReportOptions) = async (message: MetadataMessage) => await sendMetadata(testId(id), message), ); }); + browser.addCommand("displayName", async (id: string, value: string) => { + await setDisplayName(testId(id), value); + }); + browser.addCommand("description", async (id: string, value: string) => { + await setDescription(testId(id), value); + }); + browser.addCommand("descriptionHtml", async (id: string, value: string) => { + await setDescriptionHtml(testId(id), value); + }); }); hermione.on(hermione.events.NEW_WORKER_PROCESS, (worker) => { // eslint-disable-next-line diff --git a/packages/allure-hermione/src/utils.ts b/packages/allure-hermione/src/utils.ts index 015f7254e..fde0e03c0 100644 --- a/packages/allure-hermione/src/utils.ts +++ b/packages/allure-hermione/src/utils.ts @@ -35,6 +35,24 @@ export const sendMetadata = async (testId: string, metadata: MetadataMessage): P ); }); +export const setDisplayName = async (testId: string, displayName: string) => { + await sendMetadata(testId, { + displayName, + }); +}; + +export const setDescription = async (testId: string, description: string) => { + await sendMetadata(testId, { + description, + }); +}; + +export const setDescriptionHtml = async (testId: string, descriptionHtml: string) => { + await sendMetadata(testId, { + descriptionHtml, + }); +}; + export const addLabel = async (testId: string, name: string, value: string) => { await sendMetadata(testId, { labels: [{ name, value }], diff --git a/packages/allure-hermione/test/fixtures/description.js b/packages/allure-hermione/test/fixtures/description.js new file mode 100644 index 000000000..035ae08b9 --- /dev/null +++ b/packages/allure-hermione/test/fixtures/description.js @@ -0,0 +1,7 @@ +it("markdown description", async ({ browser, currentTest }) => { + await browser.description(currentTest.id, "foo"); +}); + +it("html description", async ({ browser, currentTest }) => { + await browser.descriptionHtml(currentTest.id, "foo"); +}); diff --git a/packages/allure-hermione/test/fixtures/displayName.js b/packages/allure-hermione/test/fixtures/displayName.js new file mode 100644 index 000000000..54d66cad8 --- /dev/null +++ b/packages/allure-hermione/test/fixtures/displayName.js @@ -0,0 +1,3 @@ +it("display name", async ({ browser, currentTest }) => { + await browser.displayName(currentTest.id, "foo"); +}); diff --git a/packages/allure-hermione/test/spec/description.test.ts b/packages/allure-hermione/test/spec/description.test.ts new file mode 100644 index 000000000..28a827c9f --- /dev/null +++ b/packages/allure-hermione/test/spec/description.test.ts @@ -0,0 +1,30 @@ +import { TestResult } from "allure-js-commons"; +import { expect } from "chai"; +import Hermione from "hermione"; +import { before, describe, it } from "mocha"; +import { getTestResultByName } from "../runner"; +import { HermioneAllure } from "../types"; + +describe("description", () => { + let results: TestResult[]; + + before(async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; + + await hermione.run(["./test/fixtures/description.js"], {}); + + results = hermione.allure.writer.results; + }); + + it("adds `foo` markdown description", () => { + const { description } = getTestResultByName(results, "markdown description"); + + expect(description).eq("foo"); + }); + + it("adds `foo` html description", () => { + const { descriptionHtml } = getTestResultByName(results, "html description"); + + expect(descriptionHtml).eq("foo"); + }); +}); diff --git a/packages/allure-hermione/test/spec/displayName.test.ts b/packages/allure-hermione/test/spec/displayName.test.ts new file mode 100644 index 000000000..683929efa --- /dev/null +++ b/packages/allure-hermione/test/spec/displayName.test.ts @@ -0,0 +1,25 @@ +import { TestResult } from "allure-js-commons"; +import { expect } from "chai"; +import Hermione from "hermione"; +import { before, describe, it } from "mocha"; +import { getTestResultByName } from "../runner"; +import { HermioneAllure } from "../types"; + +describe("displayName", () => { + let results: TestResult[]; + + before(async () => { + const hermione = new Hermione("./test/.hermione.conf.js") as HermioneAllure; + + await hermione.run(["./test/fixtures/displayName.js"], {}); + + results = hermione.allure.writer.results; + }); + + it("sets custom test name", () => { + const { name, fullName } = getTestResultByName(results, "foo"); + + expect(name).eq("foo"); + expect(fullName).eq("display name"); + }); +}); diff --git a/packages/allure-hermione/test/spec/labels.test.ts b/packages/allure-hermione/test/spec/labels.test.ts index a4e52cf1e..c9abac5a4 100644 --- a/packages/allure-hermione/test/spec/labels.test.ts +++ b/packages/allure-hermione/test/spec/labels.test.ts @@ -1,9 +1,9 @@ import { Label, LabelName, TestResult } from "allure-js-commons"; import { expect } from "chai"; -import { beforeEach, before, describe, it } from "mocha"; import Hermione from "hermione"; -import { HermioneAllure } from "../types"; +import { before, describe, it } from "mocha"; import { getTestResultByName } from "../runner"; +import { HermioneAllure } from "../types"; describe("labels", () => { let results: TestResult[]; diff --git a/packages/allure-js-commons/src/model.ts b/packages/allure-js-commons/src/model.ts index 7c8159e2f..bc2f0ff57 100644 --- a/packages/allure-js-commons/src/model.ts +++ b/packages/allure-js-commons/src/model.ts @@ -15,6 +15,7 @@ export interface StepMetadata extends Omit Date: Wed, 2 Aug 2023 15:23:14 +0200 Subject: [PATCH 09/12] add ability to get current allure api for mocha when config is provided (fixes #668, via #730) --- .../test/fixtures/specs/baseTest.ts | 4 +- packages/allure-mocha/README.md | 24 ++++---- packages/allure-mocha/runtime.d.ts | 2 +- packages/allure-mocha/runtime.js | 6 ++ .../allure-mocha/src/MochaAllureGateway.ts | 60 +++++++++++++++++++ .../allure-mocha/src/MochaAllureReporter.ts | 15 +++-- .../allure-mocha/src/ParallelMochaAllure.ts | 43 ------------- 7 files changed, 94 insertions(+), 60 deletions(-) create mode 100644 packages/allure-mocha/src/MochaAllureGateway.ts delete mode 100644 packages/allure-mocha/src/ParallelMochaAllure.ts diff --git a/packages/allure-decorators/test/fixtures/specs/baseTest.ts b/packages/allure-decorators/test/fixtures/specs/baseTest.ts index d837c5f2c..07bd3f4f9 100644 --- a/packages/allure-decorators/test/fixtures/specs/baseTest.ts +++ b/packages/allure-decorators/test/fixtures/specs/baseTest.ts @@ -1,10 +1,12 @@ import { decorate } from "../../../"; -import { allure, MochaAllure } from "allure-mocha/runtime"; +import { allureGetter, MochaAllure } from "allure-mocha/runtime"; export class BaseTest { public static readonly TEST_URL = "https://custom.domain.com"; public before() { + const allure = allureGetter(); + decorate(allure); } } diff --git a/packages/allure-mocha/README.md b/packages/allure-mocha/README.md index cfb928a2e..4c12deddd 100644 --- a/packages/allure-mocha/README.md +++ b/packages/allure-mocha/README.md @@ -2,7 +2,8 @@ This project implements Allure integration with Mocha framework. -**Allure API doesn't work in parallel mode**! If you want to use the functionality, please switch back to single thread mode! +**Allure API doesn't work in parallel mode**! If you want to use the functionality, please switch +back to single thread mode! ## Installation @@ -40,33 +41,34 @@ If you want to provide extra information, such as steps and attachments, import into your code: ```javascript -const allureMocha = require("allure-mocha/runtime"); +const { allure } = require("allure-mocha/runtime"); it("is a test", () => { - allureMocha.allure.epic("Some info"); + allure.epic("Some info"); }); ``` ### Parameters usage ```ts -import allureMocha from "allure-mocha/runtime"; +const { allure } = require("allure-mocha/runtime"); it("is a test", () => { - allureMocha.allure.parameter("parameterName", "parameterValue"); + allure.parameter("parameterName", "parameterValue"); }); ``` Also addParameter takes an third optional parameter with the hidden and excluded options: -`mode: "hidden" | "masked"` - `masked` hide parameter value to secure sensitive data, and `hidden` entirely hide parameter from report +`mode: "hidden" | "masked"` - `masked` hide parameter value to secure sensitive data, and `hidden` +entirely hide parameter from report `excluded: true` - excludes parameter from the history ```ts -import allureMocha from "allure-mocha/runtime"; +import { allure } from "allure-mocha/runtime"; it("is a test", () => { - allureMocha.allure.parameter("parameterName", "parameterValue", { + allure.parameter("parameterName", "parameterValue", { mode: "hidden", excluded: true, }); @@ -75,8 +77,10 @@ it("is a test", () => { ## Decorators Support -To make tests more readable and avoid explicit API calls, you can use a special extension - [ts-test-decorators](https://github.com/sskorol/ts-test-decorators). +To make tests more readable and avoid explicit API calls, you can use a special +extension - [ts-test-decorators](https://github.com/sskorol/ts-test-decorators). ## Examples -[mocha-allure-example](https://github.com/vovsemenv/mocha-allure-example) - minimal setup for using mocha with allure +[mocha-allure-example](https://github.com/vovsemenv/mocha-allure-example) - minimal setup for using +mocha with allure diff --git a/packages/allure-mocha/runtime.d.ts b/packages/allure-mocha/runtime.d.ts index 6fd11c565..bf394e6e2 100644 --- a/packages/allure-mocha/runtime.d.ts +++ b/packages/allure-mocha/runtime.d.ts @@ -1,3 +1,3 @@ export { MochaAllure } from "./dist/MochaAllure"; export { MochaAllureReporter } from "./dist/MochaAllureReporter"; -export { allure } from "./dist/MochaAllureReporter"; +export { allure, allureGetter } from "./dist/MochaAllureReporter"; diff --git a/packages/allure-mocha/runtime.js b/packages/allure-mocha/runtime.js index c028096e0..7ddbe8883 100644 --- a/packages/allure-mocha/runtime.js +++ b/packages/allure-mocha/runtime.js @@ -23,6 +23,12 @@ Object.defineProperty(module.exports, "allure", { return _MochaAllureReporter.allure; }, }); +Object.defineProperty(module.exports, "allureGetter", { + enumerable: true, + get: function () { + return _MochaAllureReporter.allureGetter; + }, +}); Object.defineProperty(module.exports, "MochaAllureReporter", { enumerable: true, get: function () { diff --git a/packages/allure-mocha/src/MochaAllureGateway.ts b/packages/allure-mocha/src/MochaAllureGateway.ts new file mode 100644 index 000000000..e8762e240 --- /dev/null +++ b/packages/allure-mocha/src/MochaAllureGateway.ts @@ -0,0 +1,60 @@ +import { MochaAllure } from "./MochaAllure"; + +const METHODS_TO_WRAP: (keyof MochaAllure)[] = [ + "epic", + "feature", + "story", + "suite", + "parentSuite", + "subSuite", + "label", + "parameter", + "link", + "issue", + "tms", + "description", + "descriptionHtml", + "owner", + "severity", + "layer", + "id", + "tag", + "writeEnvironmentInfo", + "writeCategoriesDefinitions", + "attachment", + "testAttachment", + "logStep", + "step", +]; + +export class MochaAllureGateway { + allureGetter: () => MochaAllure; + + constructor(allureGetter: () => MochaAllure) { + this.allureGetter = allureGetter; + + METHODS_TO_WRAP.forEach((method) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this[method] = this.wrapMethod(method); + }); + } + + private wrapMethod(methodName: keyof MochaAllure) { + return (...args: any[]) => { + const allure = this.allureGetter(); + + if (!allure) { + // eslint-disable-next-line no-console + console.error( + `MochaAllure: "${methodName}" can't be used in parallel mode! To use Allure Runtime API, please, switch back to single thread mode.`, + ); + return; + } + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + allure[methodName](...args); + }; + } +} diff --git a/packages/allure-mocha/src/MochaAllureReporter.ts b/packages/allure-mocha/src/MochaAllureReporter.ts index 4479c6b7a..e8e144bf0 100644 --- a/packages/allure-mocha/src/MochaAllureReporter.ts +++ b/packages/allure-mocha/src/MochaAllureReporter.ts @@ -2,7 +2,7 @@ import { AllureConfig, AllureRuntime } from "allure-js-commons"; import * as Mocha from "mocha"; import { AllureReporter } from "./AllureReporter"; import { MochaAllure } from "./MochaAllure"; -import { ParallelMochaAllure } from "./ParallelMochaAllure"; +import { MochaAllureGateway } from "./MochaAllureGateway"; const { EVENT_SUITE_BEGIN, @@ -16,9 +16,13 @@ const { EVENT_HOOK_END, } = Mocha.Runner.constants; -// eslint-disable-next-line +let mochaAllure: MochaAllure; + +export const allureGetter = () => mochaAllure; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -export let allure: MochaAllure = new ParallelMochaAllure(); +export const allure: MochaAllure = new MochaAllureGateway(allureGetter); type ParallelRunner = Mocha.Runner & { linkPartialObjects?: (val: boolean) => ParallelRunner; @@ -35,10 +39,11 @@ export class MochaAllureReporter extends Mocha.reporters.Base { ...opts.reporterOptions, resultsDir, }; + const runtime = new AllureRuntime(allureConfig); - this.coreReporter = new AllureReporter(new AllureRuntime(allureConfig)); + this.coreReporter = new AllureReporter(runtime); - allure = this.coreReporter.getImplementation(); + mochaAllure = this.coreReporter.getImplementation(); if (runner.linkPartialObjects) { runner.linkPartialObjects(true); diff --git a/packages/allure-mocha/src/ParallelMochaAllure.ts b/packages/allure-mocha/src/ParallelMochaAllure.ts deleted file mode 100644 index 41b4d2679..000000000 --- a/packages/allure-mocha/src/ParallelMochaAllure.ts +++ /dev/null @@ -1,43 +0,0 @@ -export class ParallelMochaAllure { - constructor() { - const methods = [ - "epic", - "feature", - "story", - "suite", - "parentSuite", - "subSuite", - "label", - "parameter", - "link", - "issue", - "ims", - "description", - "descriptionHtml", - "owner", - "severity", - "layer", - "id", - "tag", - "writeEnvironmentInfo", - "writeCategoriesDefinitions", - "attachment", - "logStep", - "step", - ]; - - methods.forEach((method) => { - // eslint-disable-next-line - // @ts-ignore - this[method] = this.stubMethod(method); - }); - } - - private stubMethod(methodName: string) { - return () => - // eslint-disable-next-line - console.error( - `MochaAllure: "${methodName}" can't be used in parallel mode! To use Allure Runtime API, please, switch back to single thread mode.`, - ); - } -} From a7e8fb24d3d205659dfb5de55e98424e69516739 Mon Sep 17 00:00:00 2001 From: Konstantin Epishev Date: Wed, 2 Aug 2023 17:43:50 +0200 Subject: [PATCH 10/12] add missing description methods for command steps (via #624) --- .../src/AllureCommandStep.ts | 25 +++++++++++++------ .../test/specs/AllureCommandStep.spec.ts | 20 ++++++++++++++- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/packages/allure-js-commons/src/AllureCommandStep.ts b/packages/allure-js-commons/src/AllureCommandStep.ts index 75dc5165a..5d73113a5 100644 --- a/packages/allure-js-commons/src/AllureCommandStep.ts +++ b/packages/allure-js-commons/src/AllureCommandStep.ts @@ -57,6 +57,8 @@ export interface AllureCommandStep { content: Buffer | string, options: ContentType | string, ): void | Promise; + + description(content: string): void | Promise; } export class AllureCommandStepExecutable implements AllureCommandStep { @@ -198,6 +200,10 @@ export class AllureCommandStepExecutable implements AllureCommandStep { }); } + description(content: string): void { + this.metadata.description = content; + } + async step(name: string, body: StepBodyFunction): Promise { if (!this.metadata.steps) { this.metadata.steps = []; @@ -228,8 +234,11 @@ export class AllureCommandStepExecutable implements AllureCommandStep { try { await body.call(this, this); + + const { steps = [], description = "", descriptionHtml = "", ...metadata } = this.metadata; + await messageEmitter({ - ...this.metadata, + ...metadata, steps: [ { name: this.name, @@ -240,15 +249,16 @@ export class AllureCommandStepExecutable implements AllureCommandStep { statusDetails: {}, attachments: this.attachments, parameters: [], - description: this.metadata.description || "", - descriptionHtml: this.metadata.descriptionHtml || "", - steps: this.metadata.steps || [], + steps, + description, }, ], }); } catch (e: any) { + const { steps = [], description = "", descriptionHtml = "", ...metadata } = this.metadata; + await messageEmitter({ - ...this.metadata, + ...metadata, steps: [ { name: this.name, @@ -262,9 +272,8 @@ export class AllureCommandStepExecutable implements AllureCommandStep { }, attachments: this.attachments, parameters: [], - description: this.metadata.description || "", - descriptionHtml: this.metadata.descriptionHtml || "", - steps: this.metadata.steps || [], + steps, + description, }, ], }); diff --git a/packages/allure-js-commons/test/specs/AllureCommandStep.spec.ts b/packages/allure-js-commons/test/specs/AllureCommandStep.spec.ts index f489ac7fd..4e51d6523 100644 --- a/packages/allure-js-commons/test/specs/AllureCommandStep.spec.ts +++ b/packages/allure-js-commons/test/specs/AllureCommandStep.spec.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; import { AllureCommandStepExecutable } from "../../src/AllureCommandStep"; -import { ContentType, LabelName, LinkType, Status } from "../../src/model"; +import { ContentType, LabelName, LinkType, MetadataMessage } from "../../src/model"; const fixtures = { name: "my step name", @@ -479,6 +479,24 @@ describe("AllureCommandStep.start()", () => { }); }); + describe("description", () => { + let metadata: MetadataMessage; + + beforeEach(async () => { + metadata = await currentStep.start((step) => { + step.description("foo"); + }); + }); + + it("doesn't provide description to metadata", () => { + expect(metadata.description).eq(undefined); + }); + + it("adds description to the step", () => { + expect(metadata.steps![0].description).eq("foo"); + }); + }); + describe("attachments", () => { describe("text attachment", () => { it("adds attachment as is", async () => { From b0201a4a8b57a65382126bab5a1ad3970798dd6d Mon Sep 17 00:00:00 2001 From: Adam Artajew Date: Fri, 4 Aug 2023 13:17:00 +0200 Subject: [PATCH 11/12] enable cross-browser testing in cucumber reporter (via #737) --- packages/allure-cucumberjs/README.md | 14 +++++++++++++ .../src/CucumberJSAllureReporter.ts | 1 + .../test/specs/simple_test.ts | 20 +++++++++++++++++-- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/allure-cucumberjs/README.md b/packages/allure-cucumberjs/README.md index c7ef1354e..2fe789ee9 100644 --- a/packages/allure-cucumberjs/README.md +++ b/packages/allure-cucumberjs/README.md @@ -208,3 +208,17 @@ Given(/my step/, async function () { }); }); ``` + +## Cross-browser testing + +For cross-browser testing simply add a parameter using Allure API with the browser name to the `World` instance inside your scenario, i.e.: + +```js +await this.parameter('Browser', 'firefox') +``` + +For better presentation, you can also group suites by browser names, i.e.: + +```js +await this.parentSuite('Firefox') +``` diff --git a/packages/allure-cucumberjs/src/CucumberJSAllureReporter.ts b/packages/allure-cucumberjs/src/CucumberJSAllureReporter.ts index d0d18ed85..fbca224c4 100644 --- a/packages/allure-cucumberjs/src/CucumberJSAllureReporter.ts +++ b/packages/allure-cucumberjs/src/CucumberJSAllureReporter.ts @@ -506,6 +506,7 @@ export class CucumberJSAllureFormatter extends Formatter { currentTest.status = Status.PASSED; } + currentTest.calculateHistoryId(); currentTest.endTest(Date.now()); this.currentTestsMap.delete(data.testCaseStartedId); diff --git a/packages/allure-cucumberjs/test/specs/simple_test.ts b/packages/allure-cucumberjs/test/specs/simple_test.ts index adc79e511..2ba1cba2d 100644 --- a/packages/allure-cucumberjs/test/specs/simple_test.ts +++ b/packages/allure-cucumberjs/test/specs/simple_test.ts @@ -29,6 +29,19 @@ const dataSet: { [name: string]: ITestFormatterOptions } = { }, ], }, + parameterized: { + supportCodeLibrary: buildSupportCodeLibrary(({ Given }) => { + Given("a step", function () { + this.parameter("Browser", "firefox"); + }); + }), + sources: [ + { + data: ["Feature: a", "Scenario: b", "Given a step"].join("\n"), + uri: "a.feature", + }, + ], + }, }; describe("CucumberJSAllureReporter > simple", () => { @@ -76,7 +89,7 @@ describe("CucumberJSAllureReporter > simple", () => { }); it("sets fullName, testCaseId and historyId", async () => { - const results = await runFeatures(dataSet.passed); + const results = await runFeatures(dataSet.parameterized); expect(results.tests).length(1); const [testResult] = results.tests; @@ -84,9 +97,12 @@ describe("CucumberJSAllureReporter > simple", () => { const name = source!.data.match(/\nScenario: (.+)\n/)?.[1]; const fullName = `${source!.uri}#${name!}`; + const { name: paramName, value: paramValue } = testResult.parameters[0]; + const paramsHash = md5(`${paramName}:${paramValue}`); + const historyId = `${testResult.testCaseId}:${paramsHash}`; expect(testResult.fullName).eq(fullName); expect(testResult.testCaseId).eq(md5(fullName)); - expect(testResult.historyId).eq(testResult.testCaseId); + expect(testResult.historyId).eq(historyId); }); }); From 4cf6a29310826cba04e4038b83389ddd4bff41fb Mon Sep 17 00:00:00 2001 From: qameta-ci Date: Fri, 4 Aug 2023 11:22:03 +0000 Subject: [PATCH 12/12] release 2.5.0 --- package.json | 2 +- packages/allure-codeceptjs/package.json | 2 +- packages/allure-cucumberjs/package.json | 2 +- packages/allure-decorators/package.json | 2 +- packages/allure-hermione/package.json | 2 +- packages/allure-jasmine/package.json | 2 +- packages/allure-jest/package.json | 2 +- packages/allure-js-commons/package.json | 2 +- packages/allure-mocha/package.json | 2 +- packages/allure-playwright/package.json | 2 +- packages/newman-reporter-allure/package.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index b87f84eed..bc4cd0a5e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "allure-js", "private": true, - "version": "2.4.0", + "version": "2.5.0", "workspaces": [ "packages/*" ], diff --git a/packages/allure-codeceptjs/package.json b/packages/allure-codeceptjs/package.json index 590a2f1aa..08a346ce2 100644 --- a/packages/allure-codeceptjs/package.json +++ b/packages/allure-codeceptjs/package.json @@ -1,6 +1,6 @@ { "name": "allure-codeceptjs", - "version": "2.4.0", + "version": "2.5.0", "description": "Allure codeceptjs integration", "license": "Apache-2.0", "repository": { diff --git a/packages/allure-cucumberjs/package.json b/packages/allure-cucumberjs/package.json index b32112be9..c2934b256 100644 --- a/packages/allure-cucumberjs/package.json +++ b/packages/allure-cucumberjs/package.json @@ -1,6 +1,6 @@ { "name": "allure-cucumberjs", - "version": "2.4.0", + "version": "2.5.0", "description": "Allure Cucumber.JS integration", "license": "Apache-2.0", "author": { diff --git a/packages/allure-decorators/package.json b/packages/allure-decorators/package.json index d5c192b17..250a08bd9 100644 --- a/packages/allure-decorators/package.json +++ b/packages/allure-decorators/package.json @@ -1,6 +1,6 @@ { "name": "allure-decorators", - "version": "2.4.0", + "version": "2.5.0", "description": "Write your tests in a Java-like annotation-driven manner via JS decorators.", "license": "Apache-2.0", "author": { diff --git a/packages/allure-hermione/package.json b/packages/allure-hermione/package.json index 1efc63826..61c9342ee 100644 --- a/packages/allure-hermione/package.json +++ b/packages/allure-hermione/package.json @@ -1,6 +1,6 @@ { "name": "allure-hermione", - "version": "2.4.0", + "version": "2.5.0", "packageManager": "yarn@3.4.1", "license": "Apache-2.0", "author": { diff --git a/packages/allure-jasmine/package.json b/packages/allure-jasmine/package.json index a99c6cafb..f92920666 100644 --- a/packages/allure-jasmine/package.json +++ b/packages/allure-jasmine/package.json @@ -1,6 +1,6 @@ { "name": "allure-jasmine", - "version": "2.4.0", + "version": "2.5.0", "description": "Allure Jasmine integration", "license": "Apache-2.0", "author": { diff --git a/packages/allure-jest/package.json b/packages/allure-jest/package.json index 2480496be..f7219e542 100644 --- a/packages/allure-jest/package.json +++ b/packages/allure-jest/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "allure-jest", - "version": "2.4.0", + "version": "2.5.0", "description": "Allure Jest integration", "license": "Apache-2.0", "author": { diff --git a/packages/allure-js-commons/package.json b/packages/allure-js-commons/package.json index ae4d97c3a..2fd934d2a 100644 --- a/packages/allure-js-commons/package.json +++ b/packages/allure-js-commons/package.json @@ -1,6 +1,6 @@ { "name": "allure-js-commons", - "version": "2.4.0", + "version": "2.5.0", "description": "Allure JS Commons", "license": "Apache-2.0", "author": { diff --git a/packages/allure-mocha/package.json b/packages/allure-mocha/package.json index f7ba0820b..f1a485bea 100644 --- a/packages/allure-mocha/package.json +++ b/packages/allure-mocha/package.json @@ -1,6 +1,6 @@ { "name": "allure-mocha", - "version": "2.4.0", + "version": "2.5.0", "description": "Allure Mocha integration", "license": "Apache-2.0", "author": { diff --git a/packages/allure-playwright/package.json b/packages/allure-playwright/package.json index 241a6379c..3e5a16398 100644 --- a/packages/allure-playwright/package.json +++ b/packages/allure-playwright/package.json @@ -1,6 +1,6 @@ { "name": "allure-playwright", - "version": "2.4.0", + "version": "2.5.0", "description": "Allure Playwright integration", "license": "Apache-2.0", "author": { diff --git a/packages/newman-reporter-allure/package.json b/packages/newman-reporter-allure/package.json index fc4b2df36..78339ee45 100644 --- a/packages/newman-reporter-allure/package.json +++ b/packages/newman-reporter-allure/package.json @@ -1,6 +1,6 @@ { "name": "newman-reporter-allure", - "version": "2.4.0", + "version": "2.5.0", "description": "Allure Newman integration", "author": { "name": "Qameta Software",