This commit is contained in:
jiaojm
2025-11-12 17:21:18 +08:00
repo.diff.parent 25ebc112d1
repo.diff.commit 1fc326dbae
repo.diff.stats_desc%!(EXTRA int=7, int=30, int=35)

repo.diff.view_file

@@ -928,7 +928,7 @@ docker:
.PHONY: e2e-test
e2e-test:
@echo "正在启动E2E-TEST..."
@./run-e2e-tests.sh
@./tests/e2e/run-e2e-tests.sh
# This endif closes the if at the top of the file

11
tests/e2e/.dockerignore Normal file
repo.diff.view_file

@@ -0,0 +1,11 @@
# 1. 忽略 Node.js 依赖目录
/node_modules
# 2. 忽略本地的测试报告和结果
/reports
/test-data
/test-artifacts
/Readme.md
/utils_e2e.ts
/utils_e2e_test.go
/e2e_test.go

repo.diff.view_file

@@ -8,7 +8,7 @@ services:
# pull_policy: always
# 我们告诉 Compose 在本地构建
build:
context: .
context: ../..
dockerfile: docker/Dockerfile.devstar #
image: devstar-e2e-test:latest #
@@ -20,8 +20,8 @@ services:
# 挂载 Docker Socket允许 DevStar 创建 Devcontainer
- /var/run/docker.sock:/var/run/docker.sock
# 挂载数据卷,使用相对路径,保证测试环境可移植
- ./tests/e2e/test-data/devstar_data:/var/lib/gitea
- ./tests/e2e/test-data/devstar_data:/etc/gitea
- ./test-data/devstar_data:/var/lib/gitea
- ./test-data/devstar_data:/etc/gitea
# 健康检查。test-runner 会等待这个检查通过
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/ || exit 1"]
@@ -32,7 +32,7 @@ services:
test-runner:
# 从 'tests/' 目录下的 Dockerfile 构建
build:
context: ./tests/e2e
context: .
# 等待 devstar 的 "healthcheck" 通过后,才启动
depends_on:
devstar:
@@ -44,7 +44,7 @@ services:
# 也挂载 Docker Socket
- /var/run/docker.sock:/var/run/docker.sock
# 将测试报告写回到宿主机的 ./reports 目录
- ./tests/e2e/reports:/app/playwright-report
- ./reports:/app/playwright-report
# 覆盖默认命令,强制运行测试并生成我们想要的报告
command: >
npx playwright test

repo.diff.view_file

@@ -9,31 +9,21 @@
}
const browser = await chromium.launch();
const page = await browser.newPage();
try {
await page.goto(baseURL!, { timeout: 15000 });
console.log('[GlobalSetup] 检测到安装界面!正在开始自动化安装...');
await page.getByRole('textbox', { name: 'Server Domain *' }).click();
await page.getByRole('textbox', { name: 'Server Domain *' }).fill('172.17.0.1');
await page.getByRole('textbox', { name: 'Gitea Base URL *' }).click();
await page.getByRole('textbox', { name: 'Gitea Base URL *' }).fill('http://172.17.0.1:80');
await page.getByText('Server and Third-Party Service Settings').click();
await page.getByRole('checkbox', { name: 'Enable user sign-in via Wechat QR Code.' }).uncheck();
await page.getByRole('checkbox', { name: 'Require a CAPTCHA for user' }).uncheck();
await page.getByText('Administrator Account Settings').click();
await page.getByRole('textbox', { name: 'Administrator Username' }).click();
await page.getByRole('textbox', { name: 'Administrator Username' }).fill('testuser');
@@ -43,23 +33,11 @@
await page.getByRole('textbox', { name: 'Password', exact: true }).fill('12345678');
await page.getByRole('textbox', { name: 'Confirm Password' }).click();
await page.getByRole('textbox', { name: 'Confirm Password' }).fill('12345678');
await page.getByRole('button', { name: 'Install Gitea'}).click(); // 'Install' (英文) 或 '安装' (中文) 都能匹配
await page.getByRole('button', { name: 'Install Gitea'}).click(); // 'Install' (英文) 或 '安装' (中文) 都能匹配
// 4. 等待安装完成
await page.waitForTimeout(240*1000);
console.log('[GlobalSetup] 安装成功!');
await page.waitForTimeout(240*1000);
console.log('[GlobalSetup] 安装成功!');
} catch (error) {
// 5. 截图并报错

repo.diff.view_file

@@ -3,10 +3,16 @@
# 它会处理所有清理、权限、拉取和执行工作
# 任何命令失败立即退出
set -e
#
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
#
PROJECT_ROOT=$( cd -- "$SCRIPT_DIR/../.." &> /dev/null && pwd )
#
cd "$PROJECT_ROOT"
echo "===== [1/5] 清理旧的测试环境... ====="
# 彻底销毁旧的 compose 环境,-v 会删除关联的数据卷
docker compose -f docker-compose.test.yml down -v --remove-orphans
docker compose -f tests/e2e/docker-compose.test.yml down -v --remove-orphans
docker image prune -f
docker builder prune -f
# 清理并重建报告和数据目录
@@ -36,7 +42,7 @@ echo "===== [4/5] 启动并运行测试... ====="
# --build: 确保 test-runner 镜像是最新的
# --abort-on-container-exit: 如果 devstar 挂了, 测试立即停止
# --exit-code-from test-runner: 运行结束后,将 test-runner 的退出码(0=成功, 1=失败)作为本命令的退出码
docker compose -f docker-compose.test.yml up \
docker compose -f ./tests/e2e/docker-compose.test.yml up \
--build \
--abort-on-container-exit \
--exit-code-from test-runner

repo.diff.view_file

@@ -22,7 +22,7 @@ export async function login_user(browser: Browser, workerInfo: WorkerInfo, user:
await page.locator('input[name=password]').fill(LOGIN_PASSWORD);
await page.click('form button.ui.primary.button:visible');
//await page.waitForLoadState('networkidle'); // eslint-disable-line playwright/no-networkidle
await page.waitForLoadState('networkidle'); // eslint-disable-line playwright/no-networkidle
expect(page.url(), {message: `Failed to login user ${user}`}).toBe(`${workerInfo.project.use.baseURL}/`);

repo.diff.view_file

@@ -1,5 +1,5 @@
APP_NAME = Gitea: Git with a cup of tea
RUN_MODE = dev
RUN_MODE = prod
[database]
DB_TYPE = sqlite3