Files
effekt-interface/resources/sql/automation_execution_pgsql.sql
2026-05-11 14:29:16 +08:00

178 lines
10 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 自动化执行建表脚本PostgreSQL
-- 说明:
-- 1. 本脚本为可直接执行脚本。
-- 2. 使用 PostgreSQL 标准 COMMENT ON 语法为表和字段添加注释。
-- 3. 当前脚本仅创建自动化执行主表、执行明细表、索引、更新时间触发器。
-- 4. 如需外键约束,请根据你当前库中的 test_plan / test_case / plan_case 实际表名补充。
BEGIN;
CREATE TABLE IF NOT EXISTS public.auto_execution (
id BIGSERIAL PRIMARY KEY,
execution_no VARCHAR(64) NOT NULL,
trigger_type SMALLINT NOT NULL,
project_id BIGINT NOT NULL,
plan_id BIGINT NULL,
plan_round_no INTEGER NULL,
source_case_id BIGINT NULL,
env_code VARCHAR(32) NOT NULL,
run_mode SMALLINT NOT NULL DEFAULT 1,
status SMALLINT NOT NULL DEFAULT 0,
jenkins_job_name VARCHAR(128) NULL,
jenkins_queue_id BIGINT NULL,
jenkins_build_number BIGINT NULL,
jenkins_build_url VARCHAR(512) NULL,
console_url VARCHAR(512) NULL,
report_url VARCHAR(512) NULL,
total_count INTEGER NOT NULL DEFAULT 0,
pending_count INTEGER NOT NULL DEFAULT 0,
running_count INTEGER NOT NULL DEFAULT 0,
passed_count INTEGER NOT NULL DEFAULT 0,
failed_count INTEGER NOT NULL DEFAULT 0,
blocked_count INTEGER NOT NULL DEFAULT 0,
skipped_count INTEGER NOT NULL DEFAULT 0,
not_found_count INTEGER NOT NULL DEFAULT 0,
trigger_by BIGINT NULL,
trigger_source VARCHAR(32) NOT NULL DEFAULT 'platform',
trigger_message TEXT NULL,
start_time TIMESTAMP NULL,
end_time TIMESTAMP NULL,
duration_seconds INTEGER NULL,
callback_token VARCHAR(128) NULL,
ext JSONB NOT NULL DEFAULT '{}'::jsonb,
created_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT uk_auto_execution_no UNIQUE (execution_no)
);
COMMENT ON TABLE public.auto_execution IS '自动化执行主表';
COMMENT ON COLUMN public.auto_execution.id IS '主键ID';
COMMENT ON COLUMN public.auto_execution.execution_no IS '执行编号,平台生成,唯一';
COMMENT ON COLUMN public.auto_execution.trigger_type IS '触发类型1-单条执行2-计划执行';
COMMENT ON COLUMN public.auto_execution.project_id IS '项目ID';
COMMENT ON COLUMN public.auto_execution.plan_id IS '计划ID单条执行时可为空';
COMMENT ON COLUMN public.auto_execution.plan_round_no IS '计划轮次快照';
COMMENT ON COLUMN public.auto_execution.source_case_id IS '单条执行时的来源功能用例 case_id';
COMMENT ON COLUMN public.auto_execution.env_code IS '执行环境编码,如 test/uat/prod-pre';
COMMENT ON COLUMN public.auto_execution.run_mode IS '执行模式1-串行2-并行';
COMMENT ON COLUMN public.auto_execution.status IS '执行状态0-待触发1-触发中2-排队中3-执行中4-成功5-失败6-已取消7-触发失败8-回调异常';
COMMENT ON COLUMN public.auto_execution.jenkins_job_name IS 'Jenkins 任务名称';
COMMENT ON COLUMN public.auto_execution.jenkins_queue_id IS 'Jenkins 队列ID';
COMMENT ON COLUMN public.auto_execution.jenkins_build_number IS 'Jenkins 构建号';
COMMENT ON COLUMN public.auto_execution.jenkins_build_url IS 'Jenkins 构建地址';
COMMENT ON COLUMN public.auto_execution.console_url IS 'Jenkins 控制台地址';
COMMENT ON COLUMN public.auto_execution.report_url IS '聚合测试报告地址';
COMMENT ON COLUMN public.auto_execution.total_count IS '执行总用例数';
COMMENT ON COLUMN public.auto_execution.pending_count IS '待执行用例数';
COMMENT ON COLUMN public.auto_execution.running_count IS '执行中用例数';
COMMENT ON COLUMN public.auto_execution.passed_count IS '通过用例数';
COMMENT ON COLUMN public.auto_execution.failed_count IS '失败用例数';
COMMENT ON COLUMN public.auto_execution.blocked_count IS '阻塞用例数';
COMMENT ON COLUMN public.auto_execution.skipped_count IS '跳过用例数';
COMMENT ON COLUMN public.auto_execution.not_found_count IS '未找到自动化用例数';
COMMENT ON COLUMN public.auto_execution.trigger_by IS '触发人用户ID';
COMMENT ON COLUMN public.auto_execution.trigger_source IS '触发来源,默认 platform';
COMMENT ON COLUMN public.auto_execution.trigger_message IS '触发说明、失败原因或补充消息';
COMMENT ON COLUMN public.auto_execution.start_time IS '实际开始执行时间';
COMMENT ON COLUMN public.auto_execution.end_time IS '实际结束执行时间';
COMMENT ON COLUMN public.auto_execution.duration_seconds IS '执行耗时,单位秒';
COMMENT ON COLUMN public.auto_execution.callback_token IS '本次执行给 pytest/Jenkins 使用的拉取 token';
COMMENT ON COLUMN public.auto_execution.ext IS '扩展字段JSONB';
COMMENT ON COLUMN public.auto_execution.created_time IS '创建时间';
COMMENT ON COLUMN public.auto_execution.updated_time IS '更新时间';
CREATE TABLE IF NOT EXISTS public.auto_execution_case (
id BIGSERIAL PRIMARY KEY,
execution_id BIGINT NOT NULL,
plan_case_id BIGINT NULL,
case_id BIGINT NOT NULL,
case_key VARCHAR(64) NULL,
case_title VARCHAR(255) NULL,
run_order INTEGER NOT NULL DEFAULT 0,
status SMALLINT NOT NULL DEFAULT 0,
pytest_nodeid VARCHAR(512) NULL,
result_message TEXT NULL,
error_message TEXT NULL,
stack_trace TEXT NULL,
report_url VARCHAR(512) NULL,
duration_seconds INTEGER NULL,
started_time TIMESTAMP NULL,
finished_time TIMESTAMP NULL,
retry_count INTEGER NOT NULL DEFAULT 0,
ext JSONB NOT NULL DEFAULT '{}'::jsonb,
created_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT uk_auto_execution_case_exec_case UNIQUE (execution_id, case_id)
);
COMMENT ON TABLE public.auto_execution_case IS '自动化执行明细表';
COMMENT ON COLUMN public.auto_execution_case.id IS '主键ID';
COMMENT ON COLUMN public.auto_execution_case.execution_id IS '执行主单ID对应 auto_execution.id';
COMMENT ON COLUMN public.auto_execution_case.plan_case_id IS '计划用例ID对应计划与用例关系表主键';
COMMENT ON COLUMN public.auto_execution_case.case_id IS '功能用例ID也是当前自动化与功能用例的桥梁';
COMMENT ON COLUMN public.auto_execution_case.case_key IS '用例编号快照';
COMMENT ON COLUMN public.auto_execution_case.case_title IS '用例标题快照';
COMMENT ON COLUMN public.auto_execution_case.run_order IS '执行顺序';
COMMENT ON COLUMN public.auto_execution_case.status IS '明细状态0-待执行1-执行中2-通过3-失败4-阻塞5-跳过6-未找到7-已取消';
COMMENT ON COLUMN public.auto_execution_case.pytest_nodeid IS 'pytest 节点标识,如 tests/test_xx.py::test_yy';
COMMENT ON COLUMN public.auto_execution_case.result_message IS '结果摘要';
COMMENT ON COLUMN public.auto_execution_case.error_message IS '错误信息';
COMMENT ON COLUMN public.auto_execution_case.stack_trace IS '失败堆栈';
COMMENT ON COLUMN public.auto_execution_case.report_url IS '单用例报告地址';
COMMENT ON COLUMN public.auto_execution_case.duration_seconds IS '执行耗时,单位秒';
COMMENT ON COLUMN public.auto_execution_case.started_time IS '明细开始时间';
COMMENT ON COLUMN public.auto_execution_case.finished_time IS '明细结束时间';
COMMENT ON COLUMN public.auto_execution_case.retry_count IS '重试次数';
COMMENT ON COLUMN public.auto_execution_case.ext IS '扩展字段JSONB';
COMMENT ON COLUMN public.auto_execution_case.created_time IS '创建时间';
COMMENT ON COLUMN public.auto_execution_case.updated_time IS '更新时间';
CREATE INDEX IF NOT EXISTS idx_auto_execution_project_id ON public.auto_execution(project_id);
CREATE INDEX IF NOT EXISTS idx_auto_execution_plan_id ON public.auto_execution(plan_id);
CREATE INDEX IF NOT EXISTS idx_auto_execution_status ON public.auto_execution(status);
CREATE INDEX IF NOT EXISTS idx_auto_execution_trigger_by ON public.auto_execution(trigger_by);
CREATE INDEX IF NOT EXISTS idx_auto_execution_created_time ON public.auto_execution(created_time DESC);
CREATE INDEX IF NOT EXISTS idx_auto_execution_build_number ON public.auto_execution(jenkins_build_number);
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_execution_id ON public.auto_execution_case(execution_id);
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_case_id ON public.auto_execution_case(case_id);
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_plan_case_id ON public.auto_execution_case(plan_case_id);
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_status ON public.auto_execution_case(status);
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_run_order ON public.auto_execution_case(run_order);
COMMENT ON INDEX public.idx_auto_execution_project_id IS '按项目查询执行记录索引';
COMMENT ON INDEX public.idx_auto_execution_plan_id IS '按计划查询执行记录索引';
COMMENT ON INDEX public.idx_auto_execution_status IS '按执行状态查询索引';
COMMENT ON INDEX public.idx_auto_execution_trigger_by IS '按触发人查询索引';
COMMENT ON INDEX public.idx_auto_execution_created_time IS '按创建时间倒序查询索引';
COMMENT ON INDEX public.idx_auto_execution_build_number IS '按 Jenkins 构建号查询索引';
COMMENT ON INDEX public.idx_auto_execution_case_execution_id IS '按执行主单查询明细索引';
COMMENT ON INDEX public.idx_auto_execution_case_case_id IS '按功能用例ID查询明细索引';
COMMENT ON INDEX public.idx_auto_execution_case_plan_case_id IS '按计划用例ID查询明细索引';
COMMENT ON INDEX public.idx_auto_execution_case_status IS '按明细状态查询索引';
COMMENT ON INDEX public.idx_auto_execution_case_run_order IS '按执行顺序查询索引';
CREATE OR REPLACE FUNCTION public.set_updated_time()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_time = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION public.set_updated_time() IS '通用更新时间触发器函数,更新 updated_time';
DROP TRIGGER IF EXISTS trg_auto_execution_updated_time ON public.auto_execution;
CREATE TRIGGER trg_auto_execution_updated_time
BEFORE UPDATE ON public.auto_execution
FOR EACH ROW
EXECUTE FUNCTION public.set_updated_time();
DROP TRIGGER IF EXISTS trg_auto_execution_case_updated_time ON public.auto_execution_case;
CREATE TRIGGER trg_auto_execution_case_updated_time
BEFORE UPDATE ON public.auto_execution_case
FOR EACH ROW
EXECUTE FUNCTION public.set_updated_time();
COMMIT;