af44c23f21
- 移除旧的测试套件和UAT测试文件 - 更新密码编码器配置使用BCrypt strength=12 - 添加用户角色关联表和相关服务 - 优化前端日期显示格式 - 清理无用资源和配置文件 - 增强测试数据管理和清理功能
482 lines
17 KiB
TypeScript
482 lines
17 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { LoginPage } from './pages/LoginPage';
|
|
import { DictionaryManagementPage } from './pages/DictionaryManagementPage';
|
|
|
|
test.describe('字典管理 E2E 测试', () => {
|
|
let loginPage: LoginPage;
|
|
let dictManagementPage: DictionaryManagementPage;
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
loginPage = new LoginPage(page);
|
|
dictManagementPage = new DictionaryManagementPage(page);
|
|
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
test('DICT-001: 访问字典管理页面', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
await expect(page).toHaveURL(/.*dict/);
|
|
});
|
|
|
|
await test.step('验证页面元素可见', async () => {
|
|
await expect(dictManagementPage.table).toBeVisible();
|
|
await expect(dictManagementPage.createDictTypeButton).toBeVisible();
|
|
await expect(dictManagementPage.searchInput).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test('DICT-002: 创建字典类型', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('点击新增字典类型按钮', async () => {
|
|
await dictManagementPage.clickCreateDictType();
|
|
});
|
|
|
|
await test.step('填写字典类型信息', async () => {
|
|
const timestamp = Date.now();
|
|
const dictTypeData = {
|
|
dictName: `测试字典类型_${timestamp}`,
|
|
dictType: `test_dict_type_${timestamp}`,
|
|
status: '1',
|
|
remark: '这是一个测试字典类型'
|
|
};
|
|
await dictManagementPage.fillDictTypeForm(dictTypeData);
|
|
});
|
|
|
|
await test.step('提交表单', async () => {
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
|
|
await test.step('验证字典类型创建成功', async () => {
|
|
await dictManagementPage.reload();
|
|
const dictTypeCount = await dictManagementPage.getDictTypeCount();
|
|
expect(dictTypeCount).toBeGreaterThan(0);
|
|
});
|
|
});
|
|
|
|
test('DICT-003: 编辑字典类型', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建测试字典类型', async () => {
|
|
await dictManagementPage.clickCreateDictType();
|
|
const timestamp = Date.now();
|
|
const dictTypeData = {
|
|
dictName: `待编辑字典_${timestamp}`,
|
|
dictType: `edit_dict_${timestamp}`,
|
|
status: '1'
|
|
};
|
|
await dictManagementPage.fillDictTypeForm(dictTypeData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
await page.waitForTimeout(1000);
|
|
});
|
|
|
|
await test.step('编辑字典类型', async () => {
|
|
const timestamp = Date.now();
|
|
await dictManagementPage.editDictType(`待编辑字典_${timestamp}`);
|
|
await page.waitForTimeout(500);
|
|
const updateData = {
|
|
dictName: `已编辑字典_${timestamp}`,
|
|
remark: '这是更新后的备注'
|
|
};
|
|
await dictManagementPage.fillDictTypeForm(updateData);
|
|
});
|
|
|
|
await test.step('提交修改', async () => {
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
});
|
|
|
|
test('DICT-004: 删除字典类型', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建测试字典类型', async () => {
|
|
await dictManagementPage.clickCreateDictType();
|
|
const timestamp = Date.now();
|
|
const dictTypeData = {
|
|
dictName: `待删除字典_${timestamp}`,
|
|
dictType: `delete_dict_${timestamp}`,
|
|
status: '1'
|
|
};
|
|
await dictManagementPage.fillDictTypeForm(dictTypeData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
await page.waitForTimeout(1000);
|
|
});
|
|
|
|
await test.step('删除字典类型', async () => {
|
|
const timestamp = Date.now();
|
|
await dictManagementPage.deleteDictType(`待删除字典_${timestamp}`);
|
|
await dictManagementPage.confirmDelete();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
|
|
await test.step('验证字典类型已删除', async () => {
|
|
await dictManagementPage.reload();
|
|
const timestamp = Date.now();
|
|
const dictDeleted = await dictManagementPage.containsText(`待删除字典_${timestamp}`);
|
|
expect(dictDeleted).toBe(false);
|
|
});
|
|
});
|
|
|
|
test('DICT-005: 创建字典数据', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('点击新增字典数据按钮', async () => {
|
|
await dictManagementPage.clickCreateDictData();
|
|
});
|
|
|
|
await test.step('填写字典数据信息', async () => {
|
|
const timestamp = Date.now();
|
|
const dictData = {
|
|
dictLabel: `测试字典标签_${timestamp}`,
|
|
dictValue: `test_value_${timestamp}`,
|
|
dictType: 'sys_normal_disable',
|
|
cssClass: 'el-tag-success',
|
|
listClass: 'default',
|
|
isDefault: 'Y',
|
|
status: '1',
|
|
sort: 1
|
|
};
|
|
await dictManagementPage.fillDictDataForm(dictData);
|
|
});
|
|
|
|
await test.step('提交表单', async () => {
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
|
|
await test.step('验证字典数据创建成功', async () => {
|
|
await dictManagementPage.reload();
|
|
const dictDataCount = await dictManagementPage.getDictDataCount();
|
|
expect(dictDataCount).toBeGreaterThan(0);
|
|
});
|
|
});
|
|
|
|
test('DICT-006: 编辑字典数据', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建测试字典数据', async () => {
|
|
await dictManagementPage.clickCreateDictData();
|
|
const timestamp = Date.now();
|
|
const dictData = {
|
|
dictLabel: `待编辑标签_${timestamp}`,
|
|
dictValue: `edit_value_${timestamp}`,
|
|
dictType: 'sys_normal_disable',
|
|
status: '1',
|
|
sort: 1
|
|
};
|
|
await dictManagementPage.fillDictDataForm(dictData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
await page.waitForTimeout(1000);
|
|
});
|
|
|
|
await test.step('编辑字典数据', async () => {
|
|
const timestamp = Date.now();
|
|
await dictManagementPage.editDictData(`待编辑标签_${timestamp}`);
|
|
await page.waitForTimeout(500);
|
|
const updateData = {
|
|
dictLabel: `已编辑标签_${timestamp}`,
|
|
cssClass: 'el-tag-warning'
|
|
};
|
|
await dictManagementPage.fillDictDataForm(updateData);
|
|
});
|
|
|
|
await test.step('提交修改', async () => {
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
});
|
|
|
|
test('DICT-007: 删除字典数据', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建测试字典数据', async () => {
|
|
await dictManagementPage.clickCreateDictData();
|
|
const timestamp = Date.now();
|
|
const dictData = {
|
|
dictLabel: `待删除标签_${timestamp}`,
|
|
dictValue: `delete_value_${timestamp}`,
|
|
dictType: 'sys_normal_disable',
|
|
status: '1',
|
|
sort: 1
|
|
};
|
|
await dictManagementPage.fillDictDataForm(dictData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
await page.waitForTimeout(1000);
|
|
});
|
|
|
|
await test.step('删除字典数据', async () => {
|
|
const timestamp = Date.now();
|
|
await dictManagementPage.deleteDictData(`待删除标签_${timestamp}`);
|
|
await dictManagementPage.confirmDelete();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
|
|
await test.step('验证字典数据已删除', async () => {
|
|
await dictManagementPage.reload();
|
|
const timestamp = Date.now();
|
|
const dictDataDeleted = await dictManagementPage.containsText(`待删除标签_${timestamp}`);
|
|
expect(dictDataDeleted).toBe(false);
|
|
});
|
|
});
|
|
|
|
test('DICT-008: 搜索字典', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('搜索字典类型', async () => {
|
|
await dictManagementPage.search('系统');
|
|
await page.waitForTimeout(1000);
|
|
});
|
|
|
|
await test.step('验证搜索结果', async () => {
|
|
const searchResult = await dictManagementPage.containsText('系统');
|
|
expect(searchResult).toBe(true);
|
|
});
|
|
|
|
await test.step('清除搜索', async () => {
|
|
await dictManagementPage.search('');
|
|
await page.waitForTimeout(1000);
|
|
const dictTypeCount = await dictManagementPage.getDictTypeCount();
|
|
expect(dictTypeCount).toBeGreaterThan(0);
|
|
});
|
|
});
|
|
|
|
test('DICT-009: 字典状态管理', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建启用状态的字典类型', async () => {
|
|
await dictManagementPage.clickCreateDictType();
|
|
const timestamp = Date.now();
|
|
const dictTypeData = {
|
|
dictName: `启用字典_${timestamp}`,
|
|
dictType: `enabled_dict_${timestamp}`,
|
|
status: '1',
|
|
remark: '这是启用的字典'
|
|
};
|
|
await dictManagementPage.fillDictTypeForm(dictTypeData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
|
|
await test.step('创建禁用状态的字典类型', async () => {
|
|
await dictManagementPage.clickCreateDictType();
|
|
const timestamp = Date.now();
|
|
const dictTypeData = {
|
|
dictName: `禁用字典_${timestamp}`,
|
|
dictType: `disabled_dict_${timestamp}`,
|
|
status: '0',
|
|
remark: '这是禁用的字典'
|
|
};
|
|
await dictManagementPage.fillDictTypeForm(dictTypeData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
});
|
|
|
|
test('DICT-010: 字典排序功能', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建多个字典数据测试排序', async () => {
|
|
for (let i = 1; i <= 3; i++) {
|
|
await dictManagementPage.clickCreateDictData();
|
|
const timestamp = Date.now();
|
|
const dictData = {
|
|
dictLabel: `排序标签_${i}_${timestamp}`,
|
|
dictValue: `sort_value_${i}_${timestamp}`,
|
|
dictType: 'sys_normal_disable',
|
|
status: '1',
|
|
sort: i
|
|
};
|
|
await dictManagementPage.fillDictDataForm(dictData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
await page.waitForTimeout(500);
|
|
}
|
|
});
|
|
|
|
await test.step('验证字典数据按排序号显示', async () => {
|
|
await dictManagementPage.reload();
|
|
await page.waitForTimeout(1000);
|
|
const dictDataCount = await dictManagementPage.getDictDataCount();
|
|
expect(dictDataCount).toBeGreaterThan(0);
|
|
});
|
|
});
|
|
|
|
test('DICT-011: 字典默认值设置', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建默认字典数据', async () => {
|
|
await dictManagementPage.clickCreateDictData();
|
|
const timestamp = Date.now();
|
|
const dictData = {
|
|
dictLabel: `默认标签_${timestamp}`,
|
|
dictValue: `default_value_${timestamp}`,
|
|
dictType: 'sys_normal_disable',
|
|
isDefault: 'Y',
|
|
status: '1',
|
|
sort: 1
|
|
};
|
|
await dictManagementPage.fillDictDataForm(dictData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
|
|
await test.step('创建非默认字典数据', async () => {
|
|
await dictManagementPage.clickCreateDictData();
|
|
const timestamp = Date.now();
|
|
const dictData = {
|
|
dictLabel: `非默认标签_${timestamp}`,
|
|
dictValue: `non_default_value_${timestamp}`,
|
|
dictType: 'sys_normal_disable',
|
|
isDefault: 'N',
|
|
status: '1',
|
|
sort: 2
|
|
};
|
|
await dictManagementPage.fillDictDataForm(dictData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
});
|
|
|
|
test('DICT-012: 字典CSS样式配置', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建带CSS样式的字典数据', async () => {
|
|
await dictManagementPage.clickCreateDictData();
|
|
const timestamp = Date.now();
|
|
const dictData = {
|
|
dictLabel: `样式标签_${timestamp}`,
|
|
dictValue: `style_value_${timestamp}`,
|
|
dictType: 'sys_normal_disable',
|
|
cssClass: 'el-tag-success',
|
|
listClass: 'default',
|
|
status: '1',
|
|
sort: 1
|
|
};
|
|
await dictManagementPage.fillDictDataForm(dictData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
});
|
|
});
|
|
|
|
test('DICT-013: 字典数据验证', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('验证字典类型数据完整性', async () => {
|
|
const dictTypeCount = await dictManagementPage.getDictTypeCount();
|
|
expect(dictTypeCount).toBeGreaterThan(0);
|
|
});
|
|
|
|
await test.step('验证字典数据完整性', async () => {
|
|
const dictDataCount = await dictManagementPage.getDictDataCount();
|
|
expect(dictDataCount).toBeGreaterThan(0);
|
|
});
|
|
|
|
await test.step('验证表格包含必要列', async () => {
|
|
await expect(dictManagementPage.table).toContainText('字典名称');
|
|
await expect(dictManagementPage.table).toContainText('字典类型');
|
|
await expect(dictManagementPage.table).toContainText('状态');
|
|
});
|
|
});
|
|
|
|
test('DICT-014: 字典响应式布局', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('验证桌面端布局', async () => {
|
|
await page.setViewportSize({ width: 1280, height: 720 });
|
|
await expect(dictManagementPage.table).toBeVisible();
|
|
await expect(dictManagementPage.createDictTypeButton).toBeVisible();
|
|
});
|
|
|
|
await test.step('验证平板端布局', async () => {
|
|
await page.setViewportSize({ width: 768, height: 1024 });
|
|
await expect(dictManagementPage.table).toBeVisible();
|
|
await expect(dictManagementPage.createDictTypeButton).toBeVisible();
|
|
});
|
|
|
|
await test.step('验证移动端布局', async () => {
|
|
await page.setViewportSize({ width: 375, height: 667 });
|
|
await expect(dictManagementPage.table).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test('DICT-015: 字典类型与数据关联', async ({ page }) => {
|
|
await test.step('导航到字典管理页面', async () => {
|
|
await dictManagementPage.goto();
|
|
});
|
|
|
|
await test.step('创建字典类型', async () => {
|
|
await dictManagementPage.clickCreateDictType();
|
|
const timestamp = Date.now();
|
|
const dictTypeData = {
|
|
dictName: `关联测试字典_${timestamp}`,
|
|
dictType: `relation_dict_${timestamp}`,
|
|
status: '1',
|
|
remark: '用于测试类型与数据关联'
|
|
};
|
|
await dictManagementPage.fillDictTypeForm(dictTypeData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
await page.waitForTimeout(1000);
|
|
});
|
|
|
|
await test.step('为该类型创建多个字典数据', async () => {
|
|
for (let i = 1; i <= 3; i++) {
|
|
await dictManagementPage.clickCreateDictData();
|
|
const timestamp = Date.now();
|
|
const dictData = {
|
|
dictLabel: `关联数据_${i}_${timestamp}`,
|
|
dictValue: `relation_value_${i}_${timestamp}`,
|
|
dictType: `relation_dict_${timestamp}`,
|
|
status: '1',
|
|
sort: i
|
|
};
|
|
await dictManagementPage.fillDictDataForm(dictData);
|
|
await dictManagementPage.submitForm();
|
|
await expect(dictManagementPage.isSuccessMessageVisible()).resolves.toBe(true);
|
|
await page.waitForTimeout(500);
|
|
}
|
|
});
|
|
|
|
await test.step('验证字典数据关联成功', async () => {
|
|
await dictManagementPage.reload();
|
|
const dictDataCount = await dictManagementPage.getDictDataCount();
|
|
expect(dictDataCount).toBeGreaterThanOrEqual(3);
|
|
});
|
|
});
|
|
});
|