feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import { test, expect } from '../test-fixtures';
|
||||
|
||||
test.describe('Spring Boot Actuator监控集成测试', () => {
|
||||
test('@smoke 健康检查', async ({ actuatorMonitor }) => {
|
||||
const isHealthy = await actuatorMonitor.checkHealth();
|
||||
expect(isHealthy).toBeTruthy();
|
||||
});
|
||||
|
||||
test('@smoke 获取性能指标', async ({ actuatorMonitor, testLogger }) => {
|
||||
try {
|
||||
const metrics = await actuatorMonitor.getMetrics();
|
||||
testLogger.info(`JVM Memory: ${metrics.jvmMemoryUsed}MB / ${metrics.jvmMemoryMax}MB`);
|
||||
testLogger.info(`GC Pause: ${metrics.jvmGcPause}ms`);
|
||||
|
||||
expect(metrics.jvmMemoryUsed).toBeGreaterThanOrEqual(0);
|
||||
expect(metrics.jvmMemoryMax).toBeGreaterThanOrEqual(0);
|
||||
} catch (error) {
|
||||
testLogger.warn('性能指标端点未启用,跳过测试');
|
||||
test.skip();
|
||||
}
|
||||
});
|
||||
|
||||
test('@smoke 获取JVM信息', async ({ actuatorMonitor, testLogger }) => {
|
||||
try {
|
||||
const jvmInfo = await actuatorMonitor.getJvmInfo();
|
||||
testLogger.info(`Heap Memory: ${jvmInfo.memory.heap.used}MB / ${jvmInfo.memory.heap.max}MB`);
|
||||
testLogger.info(`Threads: ${jvmInfo.threads.live} (Peak: ${jvmInfo.threads.peak})`);
|
||||
|
||||
expect(jvmInfo.memory.heap.used).toBeGreaterThanOrEqual(0);
|
||||
expect(jvmInfo.threads.live).toBeGreaterThanOrEqual(0);
|
||||
} catch (error) {
|
||||
testLogger.warn('JVM信息端点未启用,跳过测试');
|
||||
test.skip();
|
||||
}
|
||||
});
|
||||
|
||||
test('@smoke 获取应用信息', async ({ actuatorMonitor, testLogger }) => {
|
||||
try {
|
||||
const appInfo = await actuatorMonitor.getAppInfo();
|
||||
testLogger.info(`Application: ${appInfo.name} v${appInfo.version}`);
|
||||
|
||||
expect(appInfo.name).toBeTruthy();
|
||||
} catch (error) {
|
||||
testLogger.warn('应用信息端点未返回有效数据');
|
||||
// info 端点可能返回空对象
|
||||
expect(true).toBeTruthy();
|
||||
}
|
||||
});
|
||||
|
||||
test('@smoke 获取环境信息', async ({ actuatorMonitor, testLogger }) => {
|
||||
try {
|
||||
const envInfo = await actuatorMonitor.getEnvInfo();
|
||||
testLogger.info(`Active Profiles: ${envInfo.activeProfiles.join(', ')}`);
|
||||
|
||||
expect(envInfo.activeProfiles.length).toBeGreaterThanOrEqual(0);
|
||||
} catch (error) {
|
||||
testLogger.warn('环境信息端点未启用,跳过测试');
|
||||
test.skip();
|
||||
}
|
||||
});
|
||||
|
||||
test('@regression 等待应用健康状态', async ({ actuatorMonitor }) => {
|
||||
const isHealthy = await actuatorMonitor.waitForHealth(5, 2000);
|
||||
expect(isHealthy).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,14 @@
|
||||
import { test, expect } from '../test-fixtures';
|
||||
|
||||
test.describe('API连接测试', () => {
|
||||
test('@smoke 检查API服务是否运行', async ({ actuatorMonitor }) => {
|
||||
try {
|
||||
const isHealthy = await actuatorMonitor.checkHealth();
|
||||
console.log(`API健康状态: ${isHealthy}`);
|
||||
expect(isHealthy).toBeTruthy();
|
||||
} catch (error) {
|
||||
console.log('API服务未运行或无法访问');
|
||||
throw new Error('API服务未运行,请先启动API服务');
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,261 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { AssertionHelper } from '../helpers/assertion-helper';
|
||||
|
||||
test.describe('AssertionHelper - 断言辅助工具测试', () => {
|
||||
let assertionHelper: AssertionHelper;
|
||||
let page: any;
|
||||
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
assertionHelper = new AssertionHelper();
|
||||
const context = await browser.newContext();
|
||||
page = await context.newPage();
|
||||
});
|
||||
|
||||
test.afterAll(async ({ browser }) => {
|
||||
await browser.close();
|
||||
});
|
||||
|
||||
test('应该能够验证元素可见性', async () => {
|
||||
await page.setContent('<button>点击我</button>');
|
||||
|
||||
await assertionHelper.assertElementVisible(page, 'button', '按钮应该可见');
|
||||
|
||||
const button = page.locator('button');
|
||||
await expect(button).toBeVisible();
|
||||
});
|
||||
|
||||
test('应该能够验证元素隐藏', async () => {
|
||||
await page.setContent('<div style="display:none">隐藏的元素</div>');
|
||||
|
||||
await assertionHelper.assertElementHidden(page, 'div', '元素应该隐藏');
|
||||
|
||||
const div = page.locator('div');
|
||||
await expect(div).toBeHidden();
|
||||
});
|
||||
|
||||
test('应该能够验证元素文本', async () => {
|
||||
await page.setContent('<h1>欢迎来到系统</h1>');
|
||||
|
||||
await assertionHelper.assertElementText(page, 'h1', '欢迎来到系统', '标题文本应该正确');
|
||||
|
||||
const h1 = page.locator('h1');
|
||||
await expect(h1).toHaveText('欢迎来到系统');
|
||||
});
|
||||
|
||||
test('应该能够验证元素包含文本', async () => {
|
||||
await page.setContent('<p>这是一段很长的文本内容</p>');
|
||||
|
||||
await assertionHelper.assertElementContainsText(page, 'p', '很长的文本', '段落应该包含指定文本');
|
||||
|
||||
const p = page.locator('p');
|
||||
await expect(p).toContainText('很长的文本');
|
||||
});
|
||||
|
||||
test('应该能够验证元素值', async () => {
|
||||
await page.setContent('<input type="text" value="默认值" />');
|
||||
|
||||
await assertionHelper.assertElementValue(page, 'input', '默认值', '输入框值应该正确');
|
||||
|
||||
const input = page.locator('input');
|
||||
await expect(input).toHaveValue('默认值');
|
||||
});
|
||||
|
||||
test('应该能够验证元素启用状态', async () => {
|
||||
await page.setContent('<button>点击我</button>');
|
||||
|
||||
await assertionHelper.assertElementEnabled(page, 'button', '按钮应该启用');
|
||||
|
||||
const button = page.locator('button');
|
||||
await expect(button).toBeEnabled();
|
||||
});
|
||||
|
||||
test('应该能够验证元素禁用状态', async () => {
|
||||
await page.setContent('<button disabled>禁用按钮</button>');
|
||||
|
||||
await assertionHelper.assertElementDisabled(page, 'button', '按钮应该禁用');
|
||||
|
||||
const button = page.locator('button');
|
||||
await expect(button).toBeDisabled();
|
||||
});
|
||||
|
||||
test('应该能够验证复选框选中状态', async () => {
|
||||
await page.setContent('<input type="checkbox" checked />');
|
||||
|
||||
await assertionHelper.assertElementChecked(page, 'input[type="checkbox"]', '复选框应该选中');
|
||||
|
||||
const checkbox = page.locator('input[type="checkbox"]');
|
||||
await expect(checkbox).toBeChecked();
|
||||
});
|
||||
|
||||
test('应该能够验证元素数量', async () => {
|
||||
await page.setContent('<ul><li>项目1</li><li>项目2</li><li>项目3</li></ul>');
|
||||
|
||||
await assertionHelper.assertElementCount(page, 'li', 3, '应该有3个列表项');
|
||||
|
||||
const items = page.locator('li');
|
||||
const count = await items.count();
|
||||
expect(count).toBe(3);
|
||||
});
|
||||
|
||||
test('应该能够验证元素数量大于指定值', async () => {
|
||||
await page.setContent('<ul><li>项目1</li><li>项目2</li><li>项目3</li></ul>');
|
||||
|
||||
await assertionHelper.assertElementCountGreaterThan(page, 'li', 2, '列表项数量应该大于2');
|
||||
|
||||
const items = page.locator('li');
|
||||
const count = await items.count();
|
||||
expect(count).toBeGreaterThan(2);
|
||||
});
|
||||
|
||||
test('应该能够验证元素数量小于指定值', async () => {
|
||||
await page.setContent('<ul><li>项目1</li><li>项目2</li></ul>');
|
||||
|
||||
await assertionHelper.assertElementCountLessThan(page, 'li', 5, '列表项数量应该小于5');
|
||||
|
||||
const items = page.locator('li');
|
||||
const count = await items.count();
|
||||
expect(count).toBeLessThan(5);
|
||||
});
|
||||
|
||||
test('应该能够验证URL', async () => {
|
||||
await page.goto('https://example.com');
|
||||
|
||||
await assertionHelper.assertURL(page, /example\.com/, 'URL应该包含example.com');
|
||||
|
||||
await expect(page).toHaveURL(/example\.com/);
|
||||
});
|
||||
|
||||
test('应该能够验证页面标题', async () => {
|
||||
await page.setContent('<title>测试页面</title>');
|
||||
|
||||
await assertionHelper.assertTitle(page, '测试页面', '页面标题应该正确');
|
||||
|
||||
await expect(page).toHaveTitle('测试页面');
|
||||
});
|
||||
|
||||
test('应该能够验证元素属性', async () => {
|
||||
await page.setContent('<input type="password" name="password" />');
|
||||
|
||||
await assertionHelper.assertAttributeValue(page, 'input', 'type', 'password', '输入框类型应该是password');
|
||||
|
||||
const input = page.locator('input');
|
||||
await expect(input).toHaveAttribute('type', 'password');
|
||||
});
|
||||
|
||||
test('应该能够验证CSS类', async () => {
|
||||
await page.setContent('<button class="btn btn-primary">点击我</button>');
|
||||
|
||||
await assertionHelper.assertCSSClass(page, 'button', 'btn-primary', '按钮应该有btn-primary类');
|
||||
|
||||
const button = page.locator('button');
|
||||
await expect(button).toHaveClass(/btn-primary/);
|
||||
});
|
||||
|
||||
test('应该能够验证成功消息', async () => {
|
||||
await page.setContent('<div class="success-message">操作成功</div>');
|
||||
|
||||
await assertionHelper.assertSuccessMessage(page, '应该显示成功消息');
|
||||
|
||||
const successMessage = page.locator('.success-message');
|
||||
await expect(successMessage).toBeVisible();
|
||||
});
|
||||
|
||||
test('应该能够验证错误消息', async () => {
|
||||
await page.setContent('<div class="error-message">操作失败</div>');
|
||||
|
||||
await assertionHelper.assertErrorMessage(page, '操作失败', '应该显示错误消息');
|
||||
|
||||
const errorMessage = page.locator('.error-message');
|
||||
await expect(errorMessage).toBeVisible();
|
||||
await expect(errorMessage).toContainText('操作失败');
|
||||
});
|
||||
|
||||
test('应该能够验证加载状态', async () => {
|
||||
await page.setContent('<div class="loading">加载中...</div>');
|
||||
|
||||
await assertionHelper.assertLoading(page, '应该显示加载状态');
|
||||
|
||||
const loading = page.locator('.loading');
|
||||
await expect(loading).toBeVisible();
|
||||
});
|
||||
|
||||
test('应该能够验证非加载状态', async () => {
|
||||
await page.setContent('<div>内容</div>');
|
||||
|
||||
await assertionHelper.assertNotLoading(page, '不应该显示加载状态');
|
||||
|
||||
const loading = page.locator('.loading');
|
||||
await expect(loading).toBeHidden();
|
||||
});
|
||||
|
||||
test('应该能够验证模态框可见', async () => {
|
||||
await page.setContent('<div class="modal">模态框内容</div>');
|
||||
|
||||
await assertionHelper.assertModalVisible(page, '应该显示模态框');
|
||||
|
||||
const modal = page.locator('.modal');
|
||||
await expect(modal).toBeVisible();
|
||||
});
|
||||
|
||||
test('应该能够验证模态框隐藏', async () => {
|
||||
await page.setContent('<div class="modal" style="display:none">模态框内容</div>');
|
||||
|
||||
await assertionHelper.assertModalHidden(page, '模态框应该隐藏');
|
||||
|
||||
const modal = page.locator('.modal');
|
||||
await expect(modal).toBeHidden();
|
||||
});
|
||||
|
||||
test('应该能够验证Toast可见', async () => {
|
||||
await page.setContent('<div class="toast">通知消息</div>');
|
||||
|
||||
await assertionHelper.assertToastVisible(page, '应该显示Toast');
|
||||
|
||||
const toast = page.locator('.toast');
|
||||
await expect(toast).toBeVisible();
|
||||
});
|
||||
|
||||
test('应该能够验证Toast隐藏', async () => {
|
||||
await page.setContent('<div class="toast" style="display:none">通知消息</div>');
|
||||
|
||||
await assertionHelper.assertToastHidden(page, 'Toast应该隐藏');
|
||||
|
||||
const toast = page.locator('.toast');
|
||||
await expect(toast).toBeHidden();
|
||||
});
|
||||
|
||||
test('应该能够处理自定义消息', async () => {
|
||||
await page.setContent('<button>点击我</button>');
|
||||
|
||||
await assertionHelper.assertElementVisible(page, 'button', '自定义消息:按钮应该可见');
|
||||
|
||||
const button = page.locator('button');
|
||||
await expect(button).toBeVisible();
|
||||
});
|
||||
|
||||
test('应该能够处理空选择器', async () => {
|
||||
await page.setContent('<div>内容</div>');
|
||||
|
||||
try {
|
||||
await assertionHelper.assertElementVisible(page, '.non-existent', '不存在的元素');
|
||||
expect(true).toBe(false);
|
||||
} catch (error) {
|
||||
expect(error).toBeDefined();
|
||||
}
|
||||
});
|
||||
|
||||
test('应该能够处理多个断言', async () => {
|
||||
await page.setContent(`
|
||||
<form>
|
||||
<input type="text" name="username" />
|
||||
<input type="password" name="password" />
|
||||
<button type="submit">登录</button>
|
||||
</form>
|
||||
`);
|
||||
|
||||
await assertionHelper.assertElementVisible(page, 'input[name="username"]', '用户名输入框应该可见');
|
||||
await assertionHelper.assertElementVisible(page, 'input[name="password"]', '密码输入框应该可见');
|
||||
await assertionHelper.assertElementVisible(page, 'button[type="submit"]', '登录按钮应该可见');
|
||||
await assertionHelper.assertElementEnabled(page, 'button[type="submit"]', '登录按钮应该启用');
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,264 @@
|
||||
import { test, expect } from '../test-fixtures';
|
||||
|
||||
test.describe('DataStrategyManager - 数据策略管理器测试', () => {
|
||||
|
||||
test('应该能够初始化并获取默认策略', async ({ dataStrategyManager }) => {
|
||||
const strategy = dataStrategyManager.getStrategy();
|
||||
expect(strategy).toBe('hybrid');
|
||||
|
||||
const config = dataStrategyManager.getConfig();
|
||||
expect(config.strategy).toBe('hybrid');
|
||||
expect(config.mockEnabled).toBe(true);
|
||||
expect(config.realDataEnabled).toBe(true);
|
||||
expect(config.autoCleanup).toBe(true);
|
||||
});
|
||||
|
||||
test('应该能够设置和获取数据策略', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('mock');
|
||||
expect(dataStrategyManager.getStrategy()).toBe('mock');
|
||||
|
||||
dataStrategyManager.setStrategy('real');
|
||||
expect(dataStrategyManager.getStrategy()).toBe('real');
|
||||
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
expect(dataStrategyManager.getStrategy()).toBe('hybrid');
|
||||
});
|
||||
|
||||
test('应该能够根据@smoke标签选择Mock数据源', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
const dataSource = dataStrategyManager.selectDataSource(['@smoke']);
|
||||
expect(dataSource).toBe('mock');
|
||||
});
|
||||
|
||||
test('应该能够根据@regression标签选择混合数据源', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
const dataSource = dataStrategyManager.selectDataSource(['@regression']);
|
||||
expect(dataSource).toBe('hybrid');
|
||||
});
|
||||
|
||||
test('应该能够根据@full标签选择真实数据源', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
const dataSource = dataStrategyManager.selectDataSource(['@full']);
|
||||
expect(dataSource).toBe('real');
|
||||
});
|
||||
|
||||
test('应该能够根据@critical标签选择真实数据源', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
const dataSource = dataStrategyManager.selectDataSource(['@critical']);
|
||||
expect(dataSource).toBe('real');
|
||||
});
|
||||
|
||||
test('应该能够创建Mock用户数据', async ({ dataStrategyManager }) => {
|
||||
const userData = {
|
||||
username: 'testuser',
|
||||
password: 'password123'
|
||||
};
|
||||
|
||||
const result = await dataStrategyManager.createData('user', userData, ['@smoke']);
|
||||
expect(result).toBeDefined();
|
||||
expect(result.username).toBe('testuser');
|
||||
expect(result.password).toBe('password123');
|
||||
expect(result.email).toBeDefined();
|
||||
expect(result.phone).toBeDefined();
|
||||
});
|
||||
|
||||
test('应该能够创建Mock角色数据', async ({ dataStrategyManager }) => {
|
||||
const roleData = {
|
||||
roleName: '测试角色',
|
||||
roleKey: 'test_role'
|
||||
};
|
||||
|
||||
const result = await dataStrategyManager.createData('role', roleData, ['@smoke']);
|
||||
expect(result).toBeDefined();
|
||||
expect(result.roleName).toBe('测试角色');
|
||||
expect(result.roleKey).toBe('test_role');
|
||||
expect(result.description).toBeDefined();
|
||||
});
|
||||
|
||||
test('应该能够创建Mock菜单数据', async ({ dataStrategyManager }) => {
|
||||
const menuData = {
|
||||
menuName: '测试菜单',
|
||||
path: '/test'
|
||||
};
|
||||
|
||||
const result = await dataStrategyManager.createData('menu', menuData, ['@smoke']);
|
||||
expect(result).toBeDefined();
|
||||
expect(result.menuName).toBe('测试菜单');
|
||||
expect(result.path).toBe('/test');
|
||||
expect(result.icon).toBeDefined();
|
||||
});
|
||||
|
||||
test('应该能够创建数据快照', async ({ dataStrategyManager }) => {
|
||||
const snapshotName = 'test-snapshot';
|
||||
const snapshot = await dataStrategyManager.createSnapshot(snapshotName);
|
||||
|
||||
expect(snapshot).toBeDefined();
|
||||
expect(snapshot.name).toBe(snapshotName);
|
||||
expect(snapshot.timestamp).toBeGreaterThan(0);
|
||||
expect(snapshot.data).toBeDefined();
|
||||
});
|
||||
|
||||
test('应该能够回滚到数据快照', async ({ dataStrategyManager }) => {
|
||||
const snapshotName = 'rollback-test-snapshot';
|
||||
|
||||
await dataStrategyManager.createData('user', { username: 'user1' }, ['@smoke']);
|
||||
await dataStrategyManager.createSnapshot(snapshotName);
|
||||
|
||||
await dataStrategyManager.createData('user', { username: 'user2' }, ['@smoke']);
|
||||
|
||||
await dataStrategyManager.rollbackToSnapshot(snapshotName);
|
||||
|
||||
const users = dataStrategyManager.getTestData('user');
|
||||
expect(users.length).toBe(1);
|
||||
expect(users[0].username).toBe('user1');
|
||||
});
|
||||
|
||||
test('应该能够获取所有快照', async ({ dataStrategyManager }) => {
|
||||
await dataStrategyManager.createSnapshot('snapshot1');
|
||||
await dataStrategyManager.createSnapshot('snapshot2');
|
||||
await dataStrategyManager.createSnapshot('snapshot3');
|
||||
|
||||
const snapshots = dataStrategyManager.getAllSnapshots();
|
||||
expect(snapshots.length).toBe(3);
|
||||
expect(snapshots[0].name).toBe('snapshot1');
|
||||
expect(snapshots[1].name).toBe('snapshot2');
|
||||
expect(snapshots[2].name).toBe('snapshot3');
|
||||
});
|
||||
|
||||
test('应该能够删除快照', async ({ dataStrategyManager }) => {
|
||||
const snapshotName = 'delete-test-snapshot';
|
||||
await dataStrategyManager.createSnapshot(snapshotName);
|
||||
|
||||
expect(dataStrategyManager.getSnapshot(snapshotName)).toBeDefined();
|
||||
|
||||
dataStrategyManager.deleteSnapshot(snapshotName);
|
||||
|
||||
expect(dataStrategyManager.getSnapshot(snapshotName)).toBeUndefined();
|
||||
});
|
||||
|
||||
test('应该能够获取统计信息', async ({ dataStrategyManager }) => {
|
||||
await dataStrategyManager.createData('user', { username: 'user1' }, ['@smoke']);
|
||||
await dataStrategyManager.createData('user', { username: 'user2' }, ['@smoke']);
|
||||
await dataStrategyManager.createData('role', { roleName: 'role1' }, ['@smoke']);
|
||||
await dataStrategyManager.createSnapshot('snapshot1');
|
||||
await dataStrategyManager.createSnapshot('snapshot2');
|
||||
|
||||
const stats = dataStrategyManager.getStatistics();
|
||||
|
||||
expect(stats.totalTestData).toBe(3);
|
||||
expect(stats.totalSnapshots).toBe(2);
|
||||
expect(stats.strategy).toBe('hybrid');
|
||||
expect(stats.config).toBeDefined();
|
||||
});
|
||||
|
||||
test('应该能够清理所有测试数据', async ({ dataStrategyManager }) => {
|
||||
await dataStrategyManager.createData('user', { username: 'user1' }, ['@smoke']);
|
||||
await dataStrategyManager.createData('role', { roleName: 'role1' }, ['@smoke']);
|
||||
await dataStrategyManager.createSnapshot('snapshot1');
|
||||
|
||||
expect(dataStrategyManager.getTestData('user').length).toBeGreaterThan(0);
|
||||
expect(dataStrategyManager.getAllSnapshots().length).toBeGreaterThan(0);
|
||||
|
||||
await dataStrategyManager.cleanupAll();
|
||||
|
||||
expect(dataStrategyManager.getTestData('user').length).toBe(0);
|
||||
expect(dataStrategyManager.getAllSnapshots().length).toBe(0);
|
||||
});
|
||||
|
||||
test('应该能够处理多个标签的情况', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
|
||||
const dataSource1 = dataStrategyManager.selectDataSource(['@smoke', '@normal']);
|
||||
expect(dataSource1).toBe('mock');
|
||||
|
||||
const dataSource2 = dataStrategyManager.selectDataSource(['@regression', '@normal']);
|
||||
expect(dataSource2).toBe('hybrid');
|
||||
|
||||
const dataSource3 = dataStrategyManager.selectDataSource(['@full', '@complete']);
|
||||
expect(dataSource3).toBe('real');
|
||||
|
||||
const dataSource4 = dataStrategyManager.selectDataSource(['@critical', '@smoke']);
|
||||
expect(dataSource4).toBe('real');
|
||||
});
|
||||
|
||||
test('应该能够处理未知数据类型', async ({ dataStrategyManager }) => {
|
||||
const unknownData = { name: 'unknown' };
|
||||
const result = await dataStrategyManager.createData('unknown', unknownData, ['@smoke']);
|
||||
|
||||
expect(result).toBeDefined();
|
||||
expect(result.name).toBe('unknown');
|
||||
});
|
||||
|
||||
test('应该能够处理强制真实数据策略', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('real');
|
||||
|
||||
const dataSource = dataStrategyManager.selectDataSource(['@smoke']);
|
||||
expect(dataSource).toBe('real');
|
||||
});
|
||||
|
||||
test('应该能够处理强制Mock数据策略', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('mock');
|
||||
|
||||
const dataSource = dataStrategyManager.selectDataSource(['@full']);
|
||||
expect(dataSource).toBe('mock');
|
||||
});
|
||||
|
||||
test('应该能够处理没有标签的情况', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
|
||||
const dataSource = dataStrategyManager.selectDataSource([]);
|
||||
expect(dataSource).toBe('mock');
|
||||
});
|
||||
|
||||
test('应该能够创建混合数据', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
|
||||
const userData = { username: 'hybrid_user' };
|
||||
const result = await dataStrategyManager.createData('user', userData, ['@regression']);
|
||||
|
||||
expect(result).toBeDefined();
|
||||
expect(result.username).toBe('hybrid_user');
|
||||
expect(result._dataSource).toBe('hybrid');
|
||||
expect(result._mockData).toBeDefined();
|
||||
expect(result._realData).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('DataStrategyManager - 集成测试', () => {
|
||||
|
||||
test('应该在测试用例中正常使用数据策略管理器', async ({ dataStrategyManager, page }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
|
||||
const userData = await dataStrategyManager.createData('user', {
|
||||
username: 'integration_test_user',
|
||||
password: 'password123'
|
||||
}, ['@smoke']);
|
||||
|
||||
expect(userData).toBeDefined();
|
||||
expect(userData.username).toBe('integration_test_user');
|
||||
|
||||
await page.goto('http://localhost:3000/login');
|
||||
await page.fill('input[name="username"]', userData.username);
|
||||
await page.fill('input[name="password"]', userData.password);
|
||||
});
|
||||
|
||||
test('应该能够在不同测试标签下使用不同数据源', async ({ dataStrategyManager }) => {
|
||||
dataStrategyManager.setStrategy('hybrid');
|
||||
|
||||
const mockData = await dataStrategyManager.createData('user', {
|
||||
username: 'mock_user'
|
||||
}, ['@smoke']);
|
||||
|
||||
const hybridData = await dataStrategyManager.createData('user', {
|
||||
username: 'hybrid_user'
|
||||
}, ['@regression']);
|
||||
|
||||
const realData = await dataStrategyManager.createData('user', {
|
||||
username: 'real_user'
|
||||
}, ['@full']);
|
||||
|
||||
expect(mockData).toBeDefined();
|
||||
expect(hybridData).toBeDefined();
|
||||
expect(realData).toBeDefined();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,14 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { DataStrategyManager, dataStrategyManager } from '../core/data-strategy-manager';
|
||||
|
||||
test('DataStrategyManager - 基本功能测试', async () => {
|
||||
const strategy = dataStrategyManager.getStrategy();
|
||||
expect(strategy).toBe('hybrid');
|
||||
|
||||
dataStrategyManager.setStrategy('mock');
|
||||
expect(dataStrategyManager.getStrategy()).toBe('mock');
|
||||
|
||||
const mockData = await dataStrategyManager.createData('user', { username: 'test' }, ['@smoke']);
|
||||
expect(mockData).toBeDefined();
|
||||
expect(mockData.username).toBe('test');
|
||||
});
|
||||
@@ -0,0 +1,9 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test.describe('Playwright配置验证', () => {
|
||||
test('验证配置加载', async ({ page }) => {
|
||||
await page.goto('/');
|
||||
const title = await page.title();
|
||||
expect(title).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,326 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { TestCoverageReporter, testCoverageReporter } from '../core/test-coverage-reporter';
|
||||
|
||||
test.describe('TestCoverageReporter - 测试覆盖率报告生成器', () => {
|
||||
|
||||
test('应该能够初始化覆盖率报告器', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(0);
|
||||
expect(coverage.passedTests).toBe(0);
|
||||
expect(coverage.failedTests).toBe(0);
|
||||
expect(coverage.skippedTests).toBe(0);
|
||||
expect(coverage.passRate).toBe(0);
|
||||
expect(coverage.testSuites).toHaveLength(0);
|
||||
});
|
||||
|
||||
test('应该能够记录测试结果', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.recordTestResult('LoginTests', '登录功能测试', 'passed', 1000, ['@smoke', '@critical'], 'login.spec.ts');
|
||||
reporter.recordTestResult('LoginTests', '登出功能测试', 'passed', 500, ['@smoke'], 'login.spec.ts');
|
||||
reporter.recordTestResult('LoginTests', '权限验证测试', 'failed', 2000, ['@critical'], 'login.spec.ts');
|
||||
reporter.recordTestResult('LoginTests', '表单验证测试', 'skipped', 0, ['@normal'], 'login.spec.ts');
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(4);
|
||||
expect(coverage.passedTests).toBe(2);
|
||||
expect(coverage.failedTests).toBe(1);
|
||||
expect(coverage.skippedTests).toBe(1);
|
||||
expect(coverage.passRate).toBe(50);
|
||||
expect(coverage.testSuites).toHaveLength(1);
|
||||
});
|
||||
|
||||
test('应该能够计算套件覆盖率', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.recordTestResult('LoginTests', '测试1', 'passed', 1000, ['@smoke'], 'login.spec.ts');
|
||||
reporter.recordTestResult('LoginTests', '测试2', 'passed', 1000, ['@smoke'], 'login.spec.ts');
|
||||
reporter.recordTestResult('DashboardTests', '测试1', 'passed', 1000, ['@regression'], 'dashboard.spec.ts');
|
||||
reporter.recordTestResult('DashboardTests', '测试2', 'failed', 1000, ['@regression'], 'dashboard.spec.ts');
|
||||
reporter.recordTestResult('UserManagementTests', '测试1', 'passed', 1000, ['@full'], 'user.spec.ts');
|
||||
reporter.recordTestResult('UserManagementTests', '测试2', 'passed', 1000, ['@full'], 'user.spec.ts');
|
||||
reporter.recordTestResult('UserManagementTests', '测试3', 'skipped', 0, ['@full'], 'user.spec.ts');
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
const loginSuite = coverage.testSuites.find(s => s.name === 'LoginTests');
|
||||
const dashboardSuite = coverage.testSuites.find(s => s.name === 'DashboardTests');
|
||||
const userManagementSuite = coverage.testSuites.find(s => s.name === 'UserManagementTests');
|
||||
|
||||
expect(loginSuite).toBeDefined();
|
||||
expect(loginSuite?.totalTests).toBe(2);
|
||||
expect(loginSuite?.passedTests).toBe(2);
|
||||
expect(loginSuite?.failedTests).toBe(0);
|
||||
expect(loginSuite?.skippedTests).toBe(0);
|
||||
expect(loginSuite?.passRate).toBe(100);
|
||||
|
||||
expect(dashboardSuite).toBeDefined();
|
||||
expect(dashboardSuite?.totalTests).toBe(2);
|
||||
expect(dashboardSuite?.passedTests).toBe(1);
|
||||
expect(dashboardSuite?.failedTests).toBe(1);
|
||||
expect(dashboardSuite?.skippedTests).toBe(0);
|
||||
expect(dashboardSuite?.passRate).toBe(50);
|
||||
|
||||
expect(userManagementSuite).toBeDefined();
|
||||
expect(userManagementSuite?.totalTests).toBe(3);
|
||||
expect(userManagementSuite?.passedTests).toBe(2);
|
||||
expect(userManagementSuite?.failedTests).toBe(0);
|
||||
expect(userManagementSuite?.skippedTests).toBe(1);
|
||||
expect(userManagementSuite?.passRate).toBeCloseTo(66.67, 2);
|
||||
});
|
||||
|
||||
test('应该能够生成JSON格式报告', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.recordTestResult('TestSuite', '测试用例', 'passed', 1000, ['@smoke'], 'test.spec.ts');
|
||||
|
||||
const jsonReport = reporter.exportCoverage('json');
|
||||
const coverageData = JSON.parse(jsonReport);
|
||||
|
||||
expect(coverageData).toHaveProperty('totalTests');
|
||||
expect(coverageData).toHaveProperty('passedTests');
|
||||
expect(coverageData).toHaveProperty('failedTests');
|
||||
expect(coverageData).toHaveProperty('skippedTests');
|
||||
expect(coverageData).toHaveProperty('passRate');
|
||||
expect(coverageData).toHaveProperty('testSuites');
|
||||
expect(coverageData).toHaveProperty('executionTime');
|
||||
expect(coverageData).toHaveProperty('timestamp');
|
||||
});
|
||||
|
||||
test('应该能够生成HTML格式报告', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.recordTestResult('TestSuite', '测试用例', 'passed', 1000, ['@smoke'], 'test.spec.ts');
|
||||
|
||||
const htmlReport = reporter.exportCoverage('html');
|
||||
|
||||
expect(htmlReport).toContain('<!DOCTYPE html>');
|
||||
expect(htmlReport).toContain('<html');
|
||||
expect(htmlReport).toContain('测试覆盖率报告');
|
||||
expect(htmlReport).toContain('总测试数');
|
||||
expect(htmlReport).toContain('通过测试');
|
||||
expect(htmlReport).toContain('失败测试');
|
||||
expect(htmlReport).toContain('跳过测试');
|
||||
expect(htmlReport).toContain('通过率');
|
||||
});
|
||||
|
||||
test('应该能够生成Markdown格式报告', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.recordTestResult('TestSuite', '测试用例', 'passed', 1000, ['@smoke'], 'test.spec.ts');
|
||||
|
||||
const markdownReport = reporter.exportCoverage('markdown');
|
||||
|
||||
expect(markdownReport).toContain('# 测试覆盖率报告');
|
||||
expect(markdownReport).toContain('## 概要');
|
||||
expect(markdownReport).toContain('总测试数');
|
||||
expect(markdownReport).toContain('通过测试');
|
||||
expect(markdownReport).toContain('失败测试');
|
||||
expect(markdownReport).toContain('跳过测试');
|
||||
expect(markdownReport).toContain('通过率');
|
||||
});
|
||||
|
||||
test('应该能够获取套件覆盖率', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.recordTestResult('LoginTests', '测试1', 'passed', 1000, ['@smoke'], 'login.spec.ts');
|
||||
reporter.recordTestResult('LoginTests', '测试2', 'passed', 1000, ['@smoke'], 'login.spec.ts');
|
||||
reporter.recordTestResult('DashboardTests', '测试1', 'passed', 1000, ['@regression'], 'dashboard.spec.ts');
|
||||
|
||||
const loginSuite = reporter.getSuiteCoverage('LoginTests');
|
||||
const dashboardSuite = reporter.getSuiteCoverage('DashboardTests');
|
||||
const nonExistentSuite = reporter.getSuiteCoverage('NonExistentTests');
|
||||
|
||||
expect(loginSuite).toBeDefined();
|
||||
expect(loginSuite?.name).toBe('LoginTests');
|
||||
expect(loginSuite?.totalTests).toBe(2);
|
||||
|
||||
expect(dashboardSuite).toBeDefined();
|
||||
expect(dashboardSuite?.name).toBe('DashboardTests');
|
||||
expect(dashboardSuite?.totalTests).toBe(1);
|
||||
|
||||
expect(nonExistentSuite).toBeUndefined();
|
||||
});
|
||||
|
||||
test('应该能够处理空测试结果', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(0);
|
||||
expect(coverage.passedTests).toBe(0);
|
||||
expect(coverage.failedTests).toBe(0);
|
||||
expect(coverage.skippedTests).toBe(0);
|
||||
expect(coverage.passRate).toBe(0);
|
||||
expect(coverage.testSuites).toHaveLength(0);
|
||||
});
|
||||
|
||||
test('应该能够处理全部通过的测试', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
for (let i = 0; i < 10; i++) {
|
||||
reporter.recordTestResult('TestSuite', `测试${i}`, 'passed', 1000, ['@smoke'], 'test.spec.ts');
|
||||
}
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(10);
|
||||
expect(coverage.passedTests).toBe(10);
|
||||
expect(coverage.failedTests).toBe(0);
|
||||
expect(coverage.skippedTests).toBe(0);
|
||||
expect(coverage.passRate).toBe(100);
|
||||
});
|
||||
|
||||
test('应该能够处理全部失败的测试', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
for (let i = 0; i < 5; i++) {
|
||||
reporter.recordTestResult('TestSuite', `测试${i}`, 'failed', 1000, ['@critical'], 'test.spec.ts');
|
||||
}
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(5);
|
||||
expect(coverage.passedTests).toBe(0);
|
||||
expect(coverage.failedTests).toBe(5);
|
||||
expect(coverage.skippedTests).toBe(0);
|
||||
expect(coverage.passRate).toBe(0);
|
||||
});
|
||||
|
||||
test('应该能够处理全部跳过的测试', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
for (let i = 0; i < 3; i++) {
|
||||
reporter.recordTestResult('TestSuite', `测试${i}`, 'skipped', 0, ['@normal'], 'test.spec.ts');
|
||||
}
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(3);
|
||||
expect(coverage.passedTests).toBe(0);
|
||||
expect(coverage.failedTests).toBe(0);
|
||||
expect(coverage.skippedTests).toBe(3);
|
||||
expect(coverage.passRate).toBe(0);
|
||||
});
|
||||
|
||||
test('应该能够处理混合状态的测试', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.recordTestResult('TestSuite', '测试1', 'passed', 1000, ['@smoke'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '测试2', 'failed', 2000, ['@critical'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '测试3', 'skipped', 0, ['@normal'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '测试4', 'passed', 1500, ['@regression'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '测试5', 'failed', 3000, ['@regression'], 'test.spec.ts');
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(5);
|
||||
expect(coverage.passedTests).toBe(2);
|
||||
expect(coverage.failedTests).toBe(2);
|
||||
expect(coverage.skippedTests).toBe(1);
|
||||
expect(coverage.passRate).toBe(40);
|
||||
});
|
||||
|
||||
test('应该能够正确计算执行时间', async () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.startCoverage();
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
|
||||
reporter.recordTestResult('TestSuite', '测试1', 'passed', 50, ['@smoke'], 'test.spec.ts');
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
|
||||
reporter.recordTestResult('TestSuite', '测试2', 'passed', 50, ['@smoke'], 'test.spec.ts');
|
||||
|
||||
reporter.endCoverage();
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.executionTime).toBeGreaterThan(200);
|
||||
expect(coverage.executionTime).toBeLessThan(500);
|
||||
});
|
||||
|
||||
test('应该能够处理多个测试套件', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
const suites = ['LoginTests', 'DashboardTests', 'UserManagementTests', 'RoleManagementTests', 'MenuManagementTests'];
|
||||
|
||||
suites.forEach((suite, index) => {
|
||||
reporter.recordTestResult(suite, `测试${index + 1}`, 'passed', 1000, ['@smoke'], `${suite.toLowerCase()}.spec.ts`);
|
||||
});
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(5);
|
||||
expect(coverage.testSuites).toHaveLength(5);
|
||||
expect(coverage.passRate).toBe(100);
|
||||
|
||||
coverage.testSuites.forEach(suite => {
|
||||
expect(suite.totalTests).toBe(1);
|
||||
expect(suite.passedTests).toBe(1);
|
||||
expect(suite.failedTests).toBe(0);
|
||||
expect(suite.skippedTests).toBe(0);
|
||||
expect(suite.passRate).toBe(100);
|
||||
});
|
||||
});
|
||||
|
||||
test('应该能够处理不同标签的测试', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
reporter.recordTestResult('TestSuite', '冒烟测试', 'passed', 1000, ['@smoke'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '回归测试', 'passed', 1000, ['@regression'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '完整测试', 'passed', 1000, ['@full'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '关键测试', 'passed', 1000, ['@critical'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '普通测试', 'passed', 1000, ['@normal'], 'test.spec.ts');
|
||||
reporter.recordTestResult('TestSuite', '无标签测试', 'passed', 1000, [], 'test.spec.ts');
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(6);
|
||||
expect(coverage.passedTests).toBe(6);
|
||||
|
||||
const testCases = coverage.testSuites[0].tests;
|
||||
expect(testCases[0].tags).toEqual(['@smoke']);
|
||||
expect(testCases[1].tags).toEqual(['@regression']);
|
||||
expect(testCases[2].tags).toEqual(['@full']);
|
||||
expect(testCases[3].tags).toEqual(['@critical']);
|
||||
expect(testCases[4].tags).toEqual(['@normal']);
|
||||
expect(testCases[5].tags).toEqual([]);
|
||||
});
|
||||
|
||||
test('应该能够处理长测试名称', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
const longName = '这是一个非常非常非常长的测试用例名称,用于测试系统是否能够正确处理长名称的情况';
|
||||
reporter.recordTestResult('TestSuite', longName, 'passed', 1000, ['@smoke'], 'test.spec.ts');
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
const testCase = coverage.testSuites[0].tests[0];
|
||||
|
||||
expect(testCase.name).toBe(longName);
|
||||
expect(testCase.name.length).toBeGreaterThan(50);
|
||||
});
|
||||
|
||||
test('应该能够处理特殊字符的测试名称', () => {
|
||||
const reporter = new TestCoverageReporter();
|
||||
|
||||
const specialNames = ['测试<test>', '测试"test"', '测试\'test\'', '测试&test&', '测试#test#'];
|
||||
|
||||
specialNames.forEach((name, index) => {
|
||||
reporter.recordTestResult('TestSuite', name, 'passed', 1000, ['@smoke'], 'test.spec.ts');
|
||||
});
|
||||
|
||||
const coverage = reporter.getCoverage();
|
||||
|
||||
expect(coverage.totalTests).toBe(5);
|
||||
expect(coverage.passedTests).toBe(5);
|
||||
|
||||
coverage.testSuites[0].tests.forEach((testCase, index) => {
|
||||
expect(testCase.name).toBe(specialNames[index]);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,118 @@
|
||||
import { test, expect } from '../test-fixtures';
|
||||
|
||||
test.describe('数据管理器测试', () => {
|
||||
test.beforeEach(async ({ testDataManager, testLogger }) => {
|
||||
testLogger.startTest('数据管理器测试');
|
||||
});
|
||||
|
||||
test.afterEach(async ({ testDataManager, testLogger }) => {
|
||||
await testDataManager.cleanup();
|
||||
testLogger.endTest('数据管理器测试', 'passed');
|
||||
});
|
||||
|
||||
test('@smoke 创建测试用户', async ({ testDataManager, testLogger }) => {
|
||||
testLogger.startStep('创建测试用户');
|
||||
|
||||
const userData = {
|
||||
username: 'test_user_001',
|
||||
realName: '测试用户001',
|
||||
email: 'test001@example.com',
|
||||
phone: '13800138001',
|
||||
status: 1
|
||||
};
|
||||
|
||||
const user = await testDataManager.createTestUserFromGenerator(userData);
|
||||
|
||||
expect(user).toBeTruthy();
|
||||
expect(user.username).toBe(userData.username);
|
||||
expect(user.realName).toBe(userData.realName);
|
||||
|
||||
testLogger.endStep('创建测试用户', 'passed');
|
||||
});
|
||||
|
||||
test('@smoke 创建测试角色', async ({ testDataManager, testLogger }) => {
|
||||
testLogger.startStep('创建测试角色');
|
||||
|
||||
const roleData = {
|
||||
roleName: '测试角色001',
|
||||
roleCode: 'test_role_001',
|
||||
description: '测试角色描述',
|
||||
status: 1
|
||||
};
|
||||
|
||||
const role = await testDataManager.createTestRole(roleData);
|
||||
|
||||
expect(role).toBeTruthy();
|
||||
expect(role.roleName).toBe(roleData.roleName);
|
||||
expect(role.roleCode).toBe(roleData.roleCode);
|
||||
|
||||
testLogger.endStep('创建测试角色', 'passed');
|
||||
});
|
||||
|
||||
test('@smoke 创建测试菜单', async ({ testDataManager, testLogger }) => {
|
||||
testLogger.startStep('创建测试菜单');
|
||||
|
||||
const menuData = {
|
||||
name: '测试菜单001',
|
||||
code: 'test_menu_001',
|
||||
path: '/test/menu/001',
|
||||
icon: 'SettingOutlined',
|
||||
sortOrder: 1,
|
||||
status: 1,
|
||||
parentId: 0
|
||||
};
|
||||
|
||||
const menu = await testDataManager.createTestMenu(menuData);
|
||||
|
||||
expect(menu).toBeTruthy();
|
||||
expect(menu.name).toBe(menuData.name);
|
||||
expect(menu.code).toBe(menuData.code);
|
||||
|
||||
testLogger.endStep('创建测试菜单', 'passed');
|
||||
});
|
||||
|
||||
test('@regression 批量创建测试数据', async ({ testDataManager, testLogger }) => {
|
||||
testLogger.startStep('批量创建测试用户');
|
||||
|
||||
const users = [];
|
||||
for (let i = 0; i < 5; i++) {
|
||||
const userData = {
|
||||
username: `test_user_${i}`,
|
||||
realName: `测试用户${i}`,
|
||||
email: `test${i}@example.com`,
|
||||
phone: `1380013800${i}`,
|
||||
status: 1
|
||||
};
|
||||
|
||||
const user = await testDataManager.createTestUserFromGenerator(userData);
|
||||
users.push(user);
|
||||
}
|
||||
|
||||
expect(users.length).toBe(5);
|
||||
expect(users.every(u => u.username.startsWith('test_user_'))).toBeTruthy();
|
||||
|
||||
testLogger.endStep('批量创建测试用户', 'passed');
|
||||
});
|
||||
|
||||
test('@regression 清理测试数据', async ({ testDataManager, testLogger }) => {
|
||||
testLogger.startStep('创建测试用户');
|
||||
|
||||
const userData = {
|
||||
username: 'test_user_cleanup',
|
||||
realName: '测试用户清理',
|
||||
email: 'test_cleanup@example.com',
|
||||
phone: '13800138099',
|
||||
status: 1
|
||||
};
|
||||
|
||||
const user = await testDataManager.createTestUserFromGenerator(userData);
|
||||
expect(user).toBeTruthy();
|
||||
|
||||
testLogger.endStep('创建测试用户', 'passed');
|
||||
testLogger.startStep('清理测试数据');
|
||||
|
||||
await testDataManager.cleanup();
|
||||
|
||||
testLogger.endStep('清理测试数据', 'passed');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user