From 146cc5d9c241eeeaadfe66f2f24cb8c009a6fa28 Mon Sep 17 00:00:00 2001 From: Marvin Zhang Date: Sun, 24 Nov 2024 22:54:57 +0800 Subject: [PATCH] feat: added dependency manager for tests --- reporters/dependency-reporter.ts | 23 ++++++++++++++++++ test-utils/base-fixtures.ts | 21 ++++++++++++++++ test-utils/dependency-manager.ts | 41 ++++++++++++++++++++++++++++++++ tests/login/login.spec.ts | 3 ++- utils/.gitkeep | 0 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 reporters/dependency-reporter.ts create mode 100644 test-utils/base-fixtures.ts create mode 100644 test-utils/dependency-manager.ts delete mode 100644 utils/.gitkeep diff --git a/reporters/dependency-reporter.ts b/reporters/dependency-reporter.ts new file mode 100644 index 0000000..257268f --- /dev/null +++ b/reporters/dependency-reporter.ts @@ -0,0 +1,23 @@ +import type { Reporter, TestCase, TestResult } from '@playwright/test/reporter'; +import { TestDependencyManager } from '@/test-utils/dependency-manager'; + +export default class DependencyReporter implements Reporter { + private manager = TestDependencyManager.getInstance(); + private skippedTests: Map = new Map(); + + onTestEnd(test: TestCase, result: TestResult) { + if (result.status === 'skipped') { + this.skippedTests.set( + test.title, + this.manager.getDependencyFailureReason(test.title), + ); + } + } + + onEnd() { + console.log('\nDependency Failure Report:'); + this.skippedTests.forEach((reason, test) => { + console.log(`${test}: Skipped due to: ${reason}`); + }); + } +} \ No newline at end of file diff --git a/test-utils/base-fixtures.ts b/test-utils/base-fixtures.ts new file mode 100644 index 0000000..936fa64 --- /dev/null +++ b/test-utils/base-fixtures.ts @@ -0,0 +1,21 @@ +import { test as base } from '@playwright/test'; +import { TestDependencyManager } from '@/test-utils/dependency-manager'; + +type BaseFixtures = { + dependencyManager: TestDependencyManager; + testInfo: { id: string }; +}; + +export const test = base.extend({ + dependencyManager: async ({}, use) => { + const manager = TestDependencyManager.getInstance(); + await use(manager); + }, + + testInfo: [async ({}, use, testInfo) => { + const info = { + id: testInfo.title, + }; + await use(info); + }, { auto: true }], +}); \ No newline at end of file diff --git a/test-utils/dependency-manager.ts b/test-utils/dependency-manager.ts new file mode 100644 index 0000000..a6f1c73 --- /dev/null +++ b/test-utils/dependency-manager.ts @@ -0,0 +1,41 @@ +export class TestDependencyManager { + private static instance: TestDependencyManager; + private statusMap: Map = new Map(); + private dependencyGraph: Map = new Map(); + private errorMessages: Map = new Map(); + + private constructor() { + } + + static getInstance(): TestDependencyManager { + if (!TestDependencyManager.instance) { + TestDependencyManager.instance = new TestDependencyManager(); + } + return TestDependencyManager.instance; + } + + registerTest(testId: string, dependencies: string[] = []) { + this.dependencyGraph.set(testId, dependencies); + this.statusMap.set(testId, false); + } + + setTestStatus(testId: string, passed: boolean, errorMessage?: string) { + this.statusMap.set(testId, passed); + if (!passed && errorMessage) { + this.errorMessages.set(testId, errorMessage); + } + } + + canRunTest(testId: string): boolean { + const dependencies = this.dependencyGraph.get(testId) || []; + return dependencies.every(depId => this.statusMap.get(depId)); + } + + getDependencyFailureReason(testId: string): string { + const dependencies = this.dependencyGraph.get(testId) || []; + const failedDeps = dependencies.filter(depId => !this.statusMap.get(depId)); + return failedDeps + .map(depId => `${depId}: ${this.errorMessages.get(depId)}`) + .join(', '); + } +} \ No newline at end of file diff --git a/tests/login/login.spec.ts b/tests/login/login.spec.ts index 1cc7b4b..974c7e8 100644 --- a/tests/login/login.spec.ts +++ b/tests/login/login.spec.ts @@ -1,5 +1,6 @@ -import { test as base, expect } from '@playwright/test'; +import { expect } from '@playwright/test'; import { LoginPage } from '@/page-objects/views/login/loginPage'; +import { test as base } from '@/test-utils/base-fixtures'; import userData from '@/fixtures/userData.json'; import { TAG_PRIORITY_CRITICAL } from '@/constants/priority'; diff --git a/utils/.gitkeep b/utils/.gitkeep deleted file mode 100644 index e69de29..0000000