From 6c35ba7fb4de4f6a24c7fe70f02d67b86260b858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Wed, 25 Mar 2026 10:21:47 +0800 Subject: [PATCH] fix: resolve UAT test issues and improve test infrastructure --- uat-tests/package-lock.json | 121 ++++++++++++++++++ uat-tests/package.json | 6 +- uat-tests/pages/UserManagementPage.ts | 2 +- uat-tests/playwright.config.ts | 5 +- uat-tests/scenarios/basic-validation.spec.ts | 36 ++++++ .../scenarios/login-verification.spec.ts | 34 +++++ uat-tests/utils/data-loader.ts | 2 +- 7 files changed, 202 insertions(+), 4 deletions(-) create mode 100644 uat-tests/package-lock.json create mode 100644 uat-tests/scenarios/basic-validation.spec.ts create mode 100644 uat-tests/scenarios/login-verification.spec.ts diff --git a/uat-tests/package-lock.json b/uat-tests/package-lock.json new file mode 100644 index 0000000..068dbce --- /dev/null +++ b/uat-tests/package-lock.json @@ -0,0 +1,121 @@ +{ + "name": "novalon-uat-tests", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "novalon-uat-tests", + "version": "1.0.0", + "dependencies": { + "dotenv": "^17.3.1" + }, + "devDependencies": { + "@playwright/test": "^1.40.0", + "@types/dotenv": "^6.1.1" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/dotenv": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", + "integrity": "sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/uat-tests/package.json b/uat-tests/package.json index d6b219f..dae6434 100644 --- a/uat-tests/package.json +++ b/uat-tests/package.json @@ -11,6 +11,10 @@ "install-browsers": "playwright install --with-deps" }, "devDependencies": { - "@playwright/test": "^1.40.0" + "@playwright/test": "^1.40.0", + "@types/dotenv": "^6.1.1" + }, + "dependencies": { + "dotenv": "^17.3.1" } } diff --git a/uat-tests/pages/UserManagementPage.ts b/uat-tests/pages/UserManagementPage.ts index 5057219..bd3ee33 100644 --- a/uat-tests/pages/UserManagementPage.ts +++ b/uat-tests/pages/UserManagementPage.ts @@ -1,5 +1,5 @@ import { Page, Locator } from '@playwright/test'; -import { UserManagementPage as BaseUserManagementPage } from '../../../novalon-manage-web/e2e/pages/UserManagementPage'; +import { UserManagementPage as BaseUserManagementPage } from '../../novalon-manage-web/e2e/pages/UserManagementPage'; export class UserManagementPage extends BaseUserManagementPage { readonly logoutButton: Locator; diff --git a/uat-tests/playwright.config.ts b/uat-tests/playwright.config.ts index af879fb..4db54da 100644 --- a/uat-tests/playwright.config.ts +++ b/uat-tests/playwright.config.ts @@ -1,7 +1,10 @@ import { defineConfig, devices } from '@playwright/test'; +import dotenv from 'dotenv'; + +dotenv.config(); export default defineConfig({ - testDir: './uat-tests/scenarios', + testDir: './scenarios', fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, diff --git a/uat-tests/scenarios/basic-validation.spec.ts b/uat-tests/scenarios/basic-validation.spec.ts new file mode 100644 index 0000000..d5b3f35 --- /dev/null +++ b/uat-tests/scenarios/basic-validation.spec.ts @@ -0,0 +1,36 @@ +import { test, expect } from '@playwright/test'; + +test.describe('UAT - 基础环境验证', () => { + test('前端服务可访问', async ({ page }) => { + await page.goto('http://localhost:3003'); + await page.waitForLoadState('networkidle'); + + const title = await page.title(); + console.log('页面标题:', title); + + expect(title).toBeTruthy(); + }); + + test('登录页面可访问', async ({ page }) => { + await page.goto('http://localhost:3003/login'); + await page.waitForLoadState('networkidle'); + + const currentUrl = page.url(); + console.log('当前URL:', currentUrl); + + expect(currentUrl).toContain('/login'); + }); + + test('登录表单元素存在', async ({ page }) => { + await page.goto('http://localhost:3003/login'); + await page.waitForLoadState('networkidle'); + + const usernameInput = page.locator('input[type="text"], input[placeholder*="用户"]'); + const passwordInput = page.locator('input[type="password"]'); + const loginButton = page.locator('button:has-text("登录"), button:has-text("登 录")'); + + await expect(usernameInput).toBeVisible(); + await expect(passwordInput).toBeVisible(); + await expect(loginButton).toBeVisible(); + }); +}); diff --git a/uat-tests/scenarios/login-verification.spec.ts b/uat-tests/scenarios/login-verification.spec.ts new file mode 100644 index 0000000..78f9846 --- /dev/null +++ b/uat-tests/scenarios/login-verification.spec.ts @@ -0,0 +1,34 @@ +import { test, expect } from '@playwright/test'; +import { LoginPage } from '../../novalon-manage-web/e2e/pages/LoginPage'; + +test.describe('UAT - 登录功能验证', () => { + let loginPage: LoginPage; + + test.beforeEach(async ({ page }) => { + loginPage = new LoginPage(page); + await loginPage.goto(); + }); + + test('使用admin账户登录', async ({ page }) => { + await loginPage.login('admin', 'admin123'); + + const currentUrl = page.url(); + console.log('登录后URL:', currentUrl); + + await page.waitForLoadState('networkidle'); + + const isLoggedIn = await loginPage.isLoggedIn(); + expect(isLoggedIn).toBeTruthy(); + }); + + test('登录失败显示错误信息', async ({ page }) => { + await loginPage.login('wronguser', 'wrongpassword'); + + await page.waitForTimeout(2000); + + const errorMessage = await loginPage.getErrorMessage(); + console.log('错误信息:', errorMessage); + + expect(errorMessage).toBeTruthy(); + }); +}); diff --git a/uat-tests/utils/data-loader.ts b/uat-tests/utils/data-loader.ts index 725cd8e..ce1a6dd 100644 --- a/uat-tests/utils/data-loader.ts +++ b/uat-tests/utils/data-loader.ts @@ -28,7 +28,7 @@ export class DataLoader { static getUserByRole(role: string): any { const data = this.load(); - return data.users.find(user => user.role === role); + return data.users[role] || null; } static getUsersByScenario(scenarioName: string): any[] {