- 在MarketingCode聚合中新增品类ID和品类名称字段,完善产品信息结构 - 迁移生成营销码命令,支持传入品类ID和品类名称参数 - 积分发放失败时发送积分获得失败通知集成事件 - 新增通知发送及积分失败通知的集成事件处理器,使用SSE推送通知 - 在积分相关集成事件处理器中添加发送积分变动通知功能 - 移除Notification聚合,相关数据库表删除 - 新增分页结果类型PagedResult,支持营销码查询分页返回 - 营销码查询支持分页参数,返回分页结果数据
223 lines
9.5 KiB
Python
223 lines
9.5 KiB
Python
"""
|
||
一物一码会员营销系统 - 手动测试辅助脚本
|
||
此脚本帮助你手动测试系统,会自动截图并记录测试步骤
|
||
"""
|
||
|
||
from playwright.sync_api import sync_playwright
|
||
import time
|
||
from datetime import datetime
|
||
|
||
def manual_test():
|
||
"""手动测试辅助"""
|
||
admin_url = "http://localhost:3000"
|
||
h5_url = "http://localhost:5173"
|
||
|
||
print("="*60)
|
||
print("一物一码会员营销系统 - 手动测试辅助")
|
||
print("="*60)
|
||
print("\n测试说明:")
|
||
print("1. 此脚本会打开浏览器供你手动操作")
|
||
print("2. 按照提示完成各项测试")
|
||
print("3. 脚本会自动截图记录测试过程")
|
||
print("4. 按 Enter 继续下一步,输入 'q' 退出\n")
|
||
|
||
with sync_playwright() as p:
|
||
# 启动浏览器(非headless模式,便于观察)
|
||
browser = p.chromium.launch(headless=False, slow_mo=500)
|
||
context = browser.new_context()
|
||
|
||
# ===== 测试管理后台 =====
|
||
print("\n【开始测试:管理后台】")
|
||
admin_page = context.new_page()
|
||
admin_page.goto(admin_url)
|
||
admin_page.wait_for_load_state('networkidle')
|
||
|
||
# 1. 登录
|
||
print("\n1. 管理后台登录")
|
||
print(" 请在浏览器中:")
|
||
print(" - 输入用户名: admin")
|
||
print(" - 输入密码: admin123")
|
||
print(" - 点击登录")
|
||
input(" 完成后按 Enter 继续...")
|
||
admin_page.screenshot(path=f'test_screenshots/01_admin_login_{int(time.time())}.png', full_page=True)
|
||
|
||
# 2. 仪表盘
|
||
print("\n2. 查看仪表盘")
|
||
print(" 请观察:")
|
||
print(" - 统计卡片数据是否正常")
|
||
print(" - 近期订单列表")
|
||
print(" - 库存预警信息")
|
||
input(" 完成后按 Enter 继续...")
|
||
admin_page.screenshot(path=f'test_screenshots/02_admin_dashboard_{int(time.time())}.png', full_page=True)
|
||
|
||
# 3. 营销码生成
|
||
print("\n3. 生成营销码")
|
||
admin_page.goto(f"{admin_url}/marketing-codes")
|
||
admin_page.wait_for_load_state('networkidle')
|
||
print(" 请在浏览器中:")
|
||
print(" - 批次号: BATCH-TEST-001")
|
||
print(" - 产品ID: PROD-001")
|
||
print(" - 产品名称: 测试产品A")
|
||
print(" - 数量: 10")
|
||
print(" - 点击生成")
|
||
input(" 完成后按 Enter 继续...")
|
||
admin_page.screenshot(path=f'test_screenshots/03_marketing_codes_{int(time.time())}.png', full_page=True)
|
||
|
||
# 记录营销码
|
||
print("\n ⚠️ 请记录生成的营销码(复制第一个),稍后C端测试会用到")
|
||
marketing_code = input(" 请输入第一个营销码: ").strip()
|
||
|
||
# 4. 积分规则
|
||
print("\n4. 创建积分规则")
|
||
admin_page.goto(f"{admin_url}/points-rules")
|
||
admin_page.wait_for_load_state('networkidle')
|
||
print(" 请在浏览器中:")
|
||
print(" - 规则名称: 测试产品积分规则")
|
||
print(" - 规则类型: 产品规则")
|
||
print(" - 积分值: 100")
|
||
print(" - 产品ID: PROD-001")
|
||
print(" - 点击创建")
|
||
input(" 完成后按 Enter 继续...")
|
||
admin_page.screenshot(path=f'test_screenshots/04_points_rule_{int(time.time())}.png', full_page=True)
|
||
|
||
# 5. 创建礼品
|
||
print("\n5. 创建礼品")
|
||
admin_page.goto(f"{admin_url}/gifts")
|
||
admin_page.wait_for_load_state('networkidle')
|
||
print(" 请在浏览器中:")
|
||
print(" - 点击'创建礼品'按钮")
|
||
print(" - 填写礼品信息:")
|
||
print(" * 名称: 测试礼品-电子产品")
|
||
print(" * 类型: 实物")
|
||
print(" * 描述: 这是一个测试用的电子产品礼品")
|
||
print(" * 图片URL: https://via.placeholder.com/400")
|
||
print(" * 所需积分: 500")
|
||
print(" * 总库存: 100")
|
||
print(" * 每人限兑: 2")
|
||
print(" - 点击保存")
|
||
input(" 完成后按 Enter 继续...")
|
||
admin_page.screenshot(path=f'test_screenshots/05_gift_created_{int(time.time())}.png', full_page=True)
|
||
|
||
# 6. 礼品上架
|
||
print("\n6. 礼品上架")
|
||
admin_page.goto(f"{admin_url}/gifts")
|
||
admin_page.wait_for_load_state('networkidle')
|
||
print(" 请在浏览器中:")
|
||
print(" - 找到刚创建的礼品")
|
||
print(" - 点击上架开关")
|
||
input(" 完成后按 Enter 继续...")
|
||
admin_page.screenshot(path=f'test_screenshots/06_gift_onshelf_{int(time.time())}.png', full_page=True)
|
||
|
||
# ===== 测试C端应用 =====
|
||
print("\n\n【开始测试:C端应用】")
|
||
h5_page = context.new_page()
|
||
h5_page.set_viewport_size({"width": 375, "height": 667}) # 移动端尺寸
|
||
h5_page.goto(h5_url)
|
||
h5_page.wait_for_load_state('networkidle')
|
||
|
||
# 7. 注册
|
||
print("\n7. 会员注册")
|
||
timestamp = int(time.time()) % 100000000
|
||
test_phone = f"138{timestamp}"
|
||
print(f" 请在浏览器中:")
|
||
print(f" - 如果在登录页,点击'注册'链接")
|
||
print(f" - 手机号: {test_phone}")
|
||
print(f" - 密码: 123456")
|
||
print(f" - 昵称: 测试用户{timestamp}")
|
||
print(f" - 点击注册")
|
||
input(" 完成后按 Enter 继续...")
|
||
h5_page.screenshot(path=f'test_screenshots/07_h5_register_{int(time.time())}.png', full_page=True)
|
||
|
||
# 8. 首页
|
||
print("\n8. 查看首页")
|
||
print(" 请观察:")
|
||
print(" - 会员信息是否正确")
|
||
print(" - 积分余额")
|
||
print(" - 快捷功能入口")
|
||
input(" 完成后按 Enter 继续...")
|
||
h5_page.screenshot(path=f'test_screenshots/08_h5_home_{int(time.time())}.png', full_page=True)
|
||
|
||
# 9. 扫码积分
|
||
print("\n9. 扫码获取积分")
|
||
print(f" 请在浏览器中:")
|
||
print(f" - 点击'扫码'或导航到扫码页面")
|
||
print(f" - 输入营销码: {marketing_code}")
|
||
print(f" - 点击确认/提交")
|
||
print(f" - 观察积分是否增加")
|
||
input(" 完成后按 Enter 继续...")
|
||
h5_page.screenshot(path=f'test_screenshots/09_h5_scan_{int(time.time())}.png', full_page=True)
|
||
|
||
# 10. 积分明细
|
||
print("\n10. 查看积分明细")
|
||
print(" 请在浏览器中:")
|
||
print(" - 导航到'积分明细'页面")
|
||
print(" - 观察是否有扫码积分记录")
|
||
input(" 完成后按 Enter 继续...")
|
||
h5_page.screenshot(path=f'test_screenshots/10_h5_points_{int(time.time())}.png', full_page=True)
|
||
|
||
# 11. 积分商城
|
||
print("\n11. 浏览积分商城")
|
||
print(" 请在浏览器中:")
|
||
print(" - 导航到'积分商城'页面")
|
||
print(" - 观察礼品列表")
|
||
print(" - 点击查看礼品详情")
|
||
input(" 完成后按 Enter 继续...")
|
||
h5_page.screenshot(path=f'test_screenshots/11_h5_mall_{int(time.time())}.png', full_page=True)
|
||
|
||
# 12. 兑换礼品(如果积分足够)
|
||
response = input("\n12. 是否要测试兑换礼品? (积分需要>=500) [y/N]: ")
|
||
if response.lower() == 'y':
|
||
print(" 请在浏览器中:")
|
||
print(" - 选择一个礼品")
|
||
print(" - 点击兑换")
|
||
print(" - 填写收货地址:")
|
||
print(" * 收货人: 张三")
|
||
print(" * 电话: 13800138000")
|
||
print(" * 地址: 北京市朝阳区xxx街道xxx号")
|
||
print(" - 确认兑换")
|
||
input(" 完成后按 Enter 继续...")
|
||
h5_page.screenshot(path=f'test_screenshots/12_h5_redeem_{int(time.time())}.png', full_page=True)
|
||
|
||
# 13. 查看订单
|
||
print("\n13. 查看我的订单")
|
||
print(" 请在浏览器中:")
|
||
print(" - 导航到'我的订单'页面")
|
||
print(" - 观察订单列表")
|
||
print(" - 点击查看订单详情")
|
||
input(" 完成后按 Enter 继续...")
|
||
h5_page.screenshot(path=f'test_screenshots/13_h5_orders_{int(time.time())}.png', full_page=True)
|
||
|
||
# ===== 测试后台订单管理 =====
|
||
if response.lower() == 'y':
|
||
print("\n\n【测试:后台订单管理】")
|
||
print("\n14. 管理后台处理订单")
|
||
admin_page.bring_to_front()
|
||
admin_page.goto(f"{admin_url}/orders")
|
||
admin_page.wait_for_load_state('networkidle')
|
||
print(" 请在浏览器中:")
|
||
print(" - 查看订单列表")
|
||
print(" - 筛选'待处理'订单")
|
||
print(" - 点击刚才的订单'详情'")
|
||
print(" - 尝试发货操作(输入物流单号: SF1234567890)")
|
||
input(" 完成后按 Enter 继续...")
|
||
admin_page.screenshot(path=f'test_screenshots/14_admin_order_manage_{int(time.time())}.png', full_page=True)
|
||
|
||
print("\n\n" + "="*60)
|
||
print("测试完成!")
|
||
print("="*60)
|
||
print(f"\n所有截图已保存到: test_screenshots/ 目录")
|
||
print(f"测试账号信息:")
|
||
print(f" 手机号: {test_phone}")
|
||
print(f" 密码: 123456")
|
||
if marketing_code:
|
||
print(f" 使用的营销码: {marketing_code}")
|
||
|
||
input("\n按 Enter 关闭浏览器...")
|
||
browser.close()
|
||
|
||
if __name__ == "__main__":
|
||
import os
|
||
os.makedirs('test_screenshots', exist_ok=True)
|
||
|
||
manual_test()
|