2025-04-22 13:58:08 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""
|
|
|
|
|
|
测试脚本:验证旅游内容创作工具的完整工作流程
|
|
|
|
|
|
"""
|
|
|
|
|
|
import os
|
|
|
|
|
|
import sys
|
|
|
|
|
|
import json
|
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
|
|
# 添加项目根目录到Python路径
|
|
|
|
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
|
|
|
|
|
|
|
|
# 导入所需模块
|
|
|
|
|
|
from main import load_config, generate_topics_step, generate_content_and_posters_step
|
2025-04-22 14:16:29 +08:00
|
|
|
|
from utils.tweet_generator import run_topic_generation_pipeline
|
|
|
|
|
|
from core.topic_parser import TopicParser
|
2025-04-22 13:58:08 +08:00
|
|
|
|
|
|
|
|
|
|
def test_full_workflow():
|
|
|
|
|
|
"""测试完整的工作流程,从选题生成到海报制作"""
|
|
|
|
|
|
print("测试完整工作流程...")
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 1. 加载配置
|
|
|
|
|
|
print("步骤 1: 加载配置...")
|
|
|
|
|
|
config = load_config()
|
|
|
|
|
|
print(f"配置加载成功: {len(config)} 个配置项")
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 执行选题生成
|
|
|
|
|
|
print("\n步骤 2: 生成选题...")
|
2025-04-22 14:16:29 +08:00
|
|
|
|
run_id, tweet_topic_record = run_topic_generation_pipeline(config)
|
2025-04-22 13:58:08 +08:00
|
|
|
|
|
|
|
|
|
|
if not run_id or not tweet_topic_record:
|
|
|
|
|
|
print("选题生成失败,测试终止。")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
print(f"选题生成成功,Run ID: {run_id}")
|
|
|
|
|
|
print(f"生成了 {len(tweet_topic_record.topics_list)} 个选题")
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 执行内容和海报生成
|
|
|
|
|
|
print("\n步骤 3: 生成内容和海报...")
|
|
|
|
|
|
generate_content_and_posters_step(config, run_id, tweet_topic_record)
|
|
|
|
|
|
|
|
|
|
|
|
# 4. 验证输出
|
|
|
|
|
|
output_dir = os.path.join(config["output_dir"], run_id)
|
|
|
|
|
|
if os.path.exists(output_dir):
|
|
|
|
|
|
items = os.listdir(output_dir)
|
|
|
|
|
|
print(f"\n输出目录 {output_dir} 中有 {len(items)} 个项目")
|
|
|
|
|
|
|
|
|
|
|
|
# 检查是否有生成的海报
|
|
|
|
|
|
poster_count = 0
|
|
|
|
|
|
for item in items:
|
|
|
|
|
|
if item.startswith(("1_", "2_", "3_", "4_", "5_")): # 假设选题编号从1开始
|
|
|
|
|
|
poster_dir = os.path.join(output_dir, item, "poster")
|
|
|
|
|
|
if os.path.exists(poster_dir):
|
|
|
|
|
|
poster_files = [f for f in os.listdir(poster_dir) if f.endswith(".jpg")]
|
|
|
|
|
|
poster_count += len(poster_files)
|
|
|
|
|
|
|
|
|
|
|
|
print(f"共生成 {poster_count} 个海报")
|
|
|
|
|
|
return poster_count > 0
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f"输出目录 {output_dir} 不存在")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"测试过程中出错: {e}")
|
|
|
|
|
|
import traceback
|
|
|
|
|
|
traceback.print_exc()
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def test_steps_separately():
|
|
|
|
|
|
"""分步测试工作流程"""
|
|
|
|
|
|
print("分步测试工作流程...")
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 1. 加载配置
|
|
|
|
|
|
print("步骤 1: 加载配置...")
|
|
|
|
|
|
config = load_config()
|
|
|
|
|
|
|
|
|
|
|
|
# 将variants设置为较小的值以加快测试
|
|
|
|
|
|
test_config = config.copy()
|
|
|
|
|
|
test_config["variants"] = 1 # 每个选题只生成1个变体
|
|
|
|
|
|
test_config["num"] = 2 # 只生成2个选题
|
|
|
|
|
|
|
|
|
|
|
|
print(f"测试配置已准备: variants={test_config['variants']}, num={test_config['num']}")
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 仅执行选题生成
|
|
|
|
|
|
print("\n步骤 2: 仅测试选题生成...")
|
2025-04-22 14:16:29 +08:00
|
|
|
|
run_id, tweet_topic_record = run_topic_generation_pipeline(test_config)
|
2025-04-22 13:58:08 +08:00
|
|
|
|
|
|
|
|
|
|
if not run_id or not tweet_topic_record:
|
|
|
|
|
|
print("选题生成失败,测试终止。")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
# 保存生成的选题数据用于后续测试
|
|
|
|
|
|
topics_file = os.path.join(test_config["output_dir"], run_id, "tweet_topic.json")
|
|
|
|
|
|
print(f"选题结果已保存到: {topics_file}")
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 模拟间隔后继续处理
|
|
|
|
|
|
print("\n步骤 3: 模拟间隔后处理选题结果...")
|
|
|
|
|
|
print("(在真实场景中,可能是在不同的时间或机器上进行后续处理)")
|
|
|
|
|
|
time.sleep(2) # 模拟短暂延迟
|
|
|
|
|
|
|
|
|
|
|
|
# 4. 从保存的选题文件加载数据,并手动执行内容和海报生成
|
|
|
|
|
|
print("\n步骤 4: 加载保存的选题,执行内容和海报生成...")
|
|
|
|
|
|
|
|
|
|
|
|
# 这部分通常是由main函数中的流程自动处理的
|
|
|
|
|
|
# 这里为了演示分段流程,模拟手动加载数据并处理
|
|
|
|
|
|
|
|
|
|
|
|
if os.path.exists(topics_file):
|
|
|
|
|
|
with open(topics_file, 'r', encoding='utf-8') as f:
|
|
|
|
|
|
topics_data = json.load(f)
|
|
|
|
|
|
|
|
|
|
|
|
loaded_topic_record = TopicParser.from_json(topics_data)
|
|
|
|
|
|
print(f"从 {topics_file} 加载了 {len(loaded_topic_record.topics_list)} 个选题")
|
|
|
|
|
|
|
|
|
|
|
|
# 执行内容和海报生成步骤
|
|
|
|
|
|
generate_content_and_posters_step(test_config, run_id, loaded_topic_record)
|
|
|
|
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f"选题文件 {topics_file} 不存在")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"测试过程中出错: {e}")
|
|
|
|
|
|
import traceback
|
|
|
|
|
|
traceback.print_exc()
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
print("==== 旅游内容创作工具工作流程测试 ====\n")
|
|
|
|
|
|
|
|
|
|
|
|
# 判断测试模式
|
|
|
|
|
|
import argparse
|
|
|
|
|
|
parser = argparse.ArgumentParser(description='测试旅游内容创作工具的工作流程')
|
|
|
|
|
|
parser.add_argument('--mode', type=str, choices=['full', 'steps', 'both'],
|
|
|
|
|
|
default='both', help='测试模式: full=完整流程, steps=分步测试, both=两种模式都测试')
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
|
|
|
|
success = True
|
|
|
|
|
|
|
|
|
|
|
|
if args.mode in ['full', 'both']:
|
|
|
|
|
|
print("\n==== 测试完整工作流程 ====")
|
|
|
|
|
|
success = test_full_workflow() and success
|
|
|
|
|
|
|
|
|
|
|
|
if args.mode in ['steps', 'both']:
|
|
|
|
|
|
print("\n==== 测试分步工作流程 ====")
|
|
|
|
|
|
success = test_steps_separately() and success
|
|
|
|
|
|
|
|
|
|
|
|
if success:
|
|
|
|
|
|
print("\n==== 所有测试通过! ====")
|
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
else:
|
|
|
|
|
|
print("\n==== 测试失败! ====")
|
|
|
|
|
|
sys.exit(1)
|