一,测试项目概述
1.项目背景
随着数字营销的兴起,企业越来越重视通过在线活动来吸引和留住客⼾。抽奖活动作为⼀种有效的营 销⼿段,能够显著提升⽤⼾参与度和品牌曝光率。于是就开发了以抽奖活动作为背景的Spring Boot项⽬,通过这个项⽬提供⼀个全⾯、可靠、易于维护的抽奖平台**。**
2.项目结构
-
管理员模块:登录、注册
-
普通用户模块:用户列表、普通用户注册
-
奖品模块:奖品列表、奖品创建
-
活动模块:活动列表、创建活动
-
抽奖模块:抽奖活动、中奖者页面展示
3.测试环境
- 操作系统:Windows 11
- 浏览器:Edge
- 测试工具:Selenium、JMeter、postman
- 测试编译器:IntelliJ IDEA专业版+pycharm社区版
二,测试用例




三,功能测试
1.手动测试
1.1登录测试
预设场景一:手机号密码都不填
预期结果:系统提示手机号密码为空

测试场景二:手机号填写正确和密码填写正确(手机号格式不正确)
预期结果:弹窗提醒"登录失败登录方式不存在"

测试场景三:手机号填写错误和密码填写正确(手机号格式正确)
预期结果:弹窗提醒"登录失败用户不存在"

测试场景四:手机号正确,密码错误(密码格式错误)
预期结果:系统提醒"密码长度至少为6个字符"

测试场景五:手机号正确,密码错误(密码格式正确)
预期结果:弹窗提醒"登录失败密码错误"

测试场景六:手机号正确,密码正确
预期结果:跳转到活动中心页


1.2注册管理员用户页面测试
测试场景一:所有都为空
预测场景:系统提示为空

测试场景二:邮箱格式错误,其他正确
预测场景:系统提示请输入有效的邮箱地址

测试场景三:手机号格式错误,其他正确
预测场景:弹窗提醒"注册失败手机号错误"

测试场景四:密码格式错误,其他正确
预测场景:系统提示密码长度至少为6个字符

测试场景五:全部正确
预测场景:弹窗"注册成功,点击确定",成功跳转登录页


1.3用户列表页面测试
测试场景一:点击人员列表
预测场景:正常显示人员列表
1.4注册普通用户页面测试
测试场景一:姓名、邮箱和手机号都为空
预期结果:系统提示姓名、邮箱、手机号为空

测试场景二:邮箱格式错误,手机号正确填写
预期结果:系统提示"请输入有效的邮箱地址"
测试场景三:手机号格式错误,其他正确预测场景:弹窗提醒"注册失败手机号错误"

测试场景四:全部正确填写
预期结果:跳转人员列表


1.5奖品列表页面测试
场景一:点击奖品列表
预测场景:正常显示奖品列表
1.6创建奖品页面测试
测试场景一:全部空着提交
预测场景:弹窗"创建失败"
测试场景二:只填奖品名称、其他不填预测场景:弹窗"创建失败"
测试场景三:只填写奖品名称、奖品图片,其他不填预测场景:弹窗"创建失败"
测试场景四:只填写奖品名称、奖品图片、奖品价格,其他不填预测场景:弹窗"创建失败"
测试场景五:全部正常填写预测场景:弹窗"创建成功"
1.7活动页面测试
测试场景一:点击活动列表
预测场景:正常显示活动列表
1.8创建活动页面测试
测试场景一:都空着
预测场景:系统提示为空
测试场景二:填写活动名称和奖品描述,未圈选奖品和人员预测场景:弹窗提醒"请至少选择一个奖品"
测试场景三:填写活动名称和奖品描述,圈选奖品,未圈选人员预测场景:弹窗提醒"请至少选择一个人员"
测试场景四:填写活动名称和奖品描述,圈选奖品,圈选人员(圈选人员人数比奖品少)预测场景:弹窗提醒"创建失败!活动关联人员数量不足"
测试场景五:填写活动名称和奖品描述,圈选奖品,圈选人员(圈选人员人数比奖品多)预测场景:弹窗提示创建成功,跳转活动列表
1.9抽奖页面测试
测试场景一:正常抽奖流程
预期结果:展示中奖者名单
1.10中奖者展示页面测试
2.自动化测试
注:本次自动化测试用的编译器为pycharm社区版
2.1登录页面自动化测试
测试包含正确账号密码,空账号空密码,错误账号或错误密码部分用例
pythonfrom selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器(Edge) def init_driver(): driver = webdriver.Edge() driver.maximize_window() driver.get("http://124.221.96.160:9090/login.html") # 登录页URL time.sleep(2) return driver # 通用登录测试函数 def test_login(driver, phone, pwd, test_name): """ :param driver: 浏览器驱动 :param phone: 手机号 :param pwd: 密码 :param test_name: 测试场景名称 """ print(f"\n========== 开始测试:{test_name} ==========") # 定位并清空手机号输入框 phone_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入手机号']"))) phone_input.clear() phone_input.send_keys(phone) time.sleep(1) # 定位并清空密码输入框 pwd_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入密码']"))) pwd_input.clear() pwd_input.send_keys(pwd) time.sleep(1) # 点击登录按钮 login_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='登录']"))) login_btn.click() time.sleep(3) # 验证结果(根据页面实际提示调整判断逻辑) try: # 场景1:空手机号/空密码 → 检测页面提示 if phone == "" or pwd == "": # 定位错误提示元素(需根据页面实际标签调整,示例用通用提示定位) error_tip = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'error') or contains(text(), '不能为空')]"))) print(f"✅ {test_name} - 验证成功:提示信息 → {error_tip.text}") # 场景2:错误账号/错误密码 → 检测登录失败提示 else: error_tip = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(text(), '账号错误') or contains(text(), '密码错误') or contains(text(), '登录失败')]"))) print(f"✅ {test_name} - 验证成功:提示信息 → {error_tip.text}") except: # 未检测到提示时的兜底判断 if "login" in driver.current_url: print(f"✅ {test_name} - 验证成功:登录未跳转,保持在登录页(符合预期)") else: print(f"❌ {test_name} - 验证失败:异常登录却跳转成功(不符合预期)") # 主程序 if __name__ == "__main__": driver = init_driver() wait = WebDriverWait(driver, 8) # 显式等待超时时间 try: # 测试场景1:空手机号 + 正确密码 test_login(driver, "", "123456752", "空手机号,正确密码") time.sleep(2) # 测试场景2:正确手机号 + 空密码 test_login(driver, "15123344443", "", "正确手机号,空密码") time.sleep(2) # 测试场景3:错误手机号 + 正确密码(随便改1位手机号) test_login(driver, "15123344449", "123456752", "错误手机号,正确密码") time.sleep(2) # 测试场景4:正确手机号 + 错误密码(随便改1位密码) test_login(driver, "15123344443", "123456758", "正确手机号,错误密码") time.sleep(2) # 测试场景5:空手机号 + 空密码 test_login(driver, "", "", "空手机号,空密码") except Exception as e: print(f"\n❌ 执行过程出错:{str(e)}") finally: # 保持浏览器打开,手动核对结果 input("\n所有测试完成,按回车键关闭浏览器...") driver.quit()
2.2注册页面自动化测试
包含用户名,邮箱,手机号码,密码等所有异常注册的测试用例,以及正确注册的测试用例
pythonfrom selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器(Edge) def init_driver(): driver = webdriver.Edge() driver.maximize_window() # 替换为实际注册页URL driver.get("http://124.221.96.160:9090/register.html") time.sleep(2) return driver # 通用注册测试函数 def test_register(driver, name, mail, phone, pwd, test_name): """ :param driver: 浏览器驱动 :param name: 姓名 :param mail: 邮箱 :param phone: 手机号 :param pwd: 密码 :param test_name: 测试场景名称 """ print(f"\n========== 开始测试:{test_name} ==========") # 1. 输入姓名 name_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入姓名']"))) name_input.clear() name_input.send_keys(name) time.sleep(1) # 2. 输入邮箱 mail_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入邮箱']"))) mail_input.clear() mail_input.send_keys(mail) time.sleep(1) # 3. 输入手机号 phone_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入手机号']"))) phone_input.clear() phone_input.send_keys(phone) time.sleep(1) # 4. 输入密码 pwd_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入密码']"))) pwd_input.clear() pwd_input.send_keys(pwd) time.sleep(1) # 5. 点击注册按钮 register_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='注册']"))) register_btn.click() time.sleep(3) # 验证失败结果(根据页面提示调整) try: # 定位错误提示(适配"不能为空/格式错误/长度不符"等提示) error_tip = wait.until(EC.presence_of_element_located( (By.XPATH, "//div[contains(text(), '不能为空') or contains(text(), '长度') or contains(text(), '格式')]") )) print(f"✅ {test_name} - 验证成功:失败提示 → {error_tip.text}") except: # 兜底判断:若未跳转则注册失败(符合预期) if "register" in driver.current_url: print(f"✅ {test_name} - 验证成功:未跳转,保持在注册页(符合失败预期)") else: print(f"❌ {test_name} - 验证失败:异常注册却跳转成功(不符合预期)") # 主程序 if __name__ == "__main__": driver = init_driver() wait = WebDriverWait(driver, 8) try: # ========== 失败场景1:姓名为空 ========== test_register(driver, "", "1457243353@qq.com", "12003778891", "123006722", "姓名为空") time.sleep(2) # ========== 失败场景2:邮箱为空 ========== test_register(driver, "cwt", "", "12003778891", "123006722", "邮箱为空") time.sleep(2) # ========== 失败场景3:邮箱长度<3位(比如输入"a@") ========== test_register(driver, "cwt", "a@", "12003778891", "123006722", "邮箱长度<3位") time.sleep(2) # ========== 失败场景4:邮箱格式错误(比如"123qq.com",缺少@) ========== test_register(driver, "cwt", "123qq.com", "12003778891", "123006722", "邮箱格式错误(无@)") time.sleep(2) # ========== 失败场景5:手机号为空 ========== test_register(driver, "cwt", "1457243353@qq.com", "", "123006722", "手机号为空") time.sleep(2) # ========== 失败场景6:手机号长度>11位(比如输入12位) ========== test_register(driver, "cwt", "1457243353@qq.com", "120037788912", "123006722", "手机号长度>11位") time.sleep(2) # ========== 失败场景7:密码为空 ========== test_register(driver, "cwt", "1457243353@qq.com", "12003778891", "", "密码为空") time.sleep(2) # ========== 失败场景8:密码长度<6位(比如输入5位) ========== test_register(driver, "cwt", "1457243353@qq.com", "12003778891", "12345", "密码长度<6位") time.sleep(2) # ========== 附加:正确用例(验证正常注册) ========== print(f"\n========== 开始测试:正确注册用例 ==========") test_register(driver, "cwt", "1457243353@qq.com", "12003778891", "123006722", "正确注册信息") except Exception as e: print(f"\n❌ 执行出错:{str(e)}") finally: input("\n所有测试完成,按回车键关闭浏览器...") driver.quit()2.3奖品管理页自动化测试
包含正确查看奖品列表,正确创建奖品以及错误创建奖品测试用例代码
pythonfrom selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains import time import os # 初始化浏览器 def init_driver(): driver = webdriver.Edge() driver.maximize_window() return driver # 登录函数 def login(driver, phone, pwd): print("========== 开始登录 ==========") driver.get("http://124.221.96.160:9090/login.html") # 登录页URL time.sleep(2) # 输入手机号 phone_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入手机号']"))) phone_input.clear() phone_input.send_keys(phone) time.sleep(1) # 输入密码 pwd_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入密码']"))) pwd_input.clear() pwd_input.send_keys(pwd) time.sleep(1) # 点击登录 driver.find_element(By.XPATH, "//button[text()='登录']").click() time.sleep(3) print("✅ 登录成功,进入系统") # 查看奖品列表函数 def check_prize_list(driver): print("\n========== 查看奖品列表 ==========") # 点击左侧"奖品管理"→"奖品列表" prize_manage = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[text()='奖品管理']"))) prize_manage.click() time.sleep(1) prize_list = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[text()='奖品列表']"))) prize_list.click() time.sleep(2) # 验证奖品列表是否加载 try: prize_table = wait.until(EC.presence_of_element_located((By.XPATH, "//table[contains(@class, 'prize-table')]"))) print("✅ 奖品列表加载成功,无异常") # 打印部分奖品信息(可选) prizes = driver.find_elements(By.XPATH, "//table/tbody/tr") print(f"当前奖品列表共 {len(prizes)} 条数据") except: print("❌ 奖品列表加载失败") # 创建奖品函数(支持正确/异常场景) def create_prize(driver, name, pic_path, price, desc, test_name): print(f"\n========== 开始测试:{test_name} ==========") # 进入"创建奖品"页面 create_prize_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[text()='创建奖品']"))) create_prize_btn.click() time.sleep(2) # 1. 输入奖品名称 name_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入奖品名称']"))) name_input.clear() name_input.send_keys(name) time.sleep(1) # 2. 上传奖品图片(需替换为本地实际图片路径) if pic_path: upload_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[text()='上传图片']"))) # 定位文件上传输入框(隐藏元素,需通过JS触发) upload_input = driver.find_element(By.XPATH, "//input[@type='file']") driver.execute_script("arguments[0].style.display = 'block';", upload_input) upload_input.send_keys(pic_path) # 本地图片绝对路径 time.sleep(2) print("✅ 图片上传完成") else: print("⚠️ 未上传图片(异常场景)") # 3. 输入奖品价格 price_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='请输入奖品价格']"))) price_input.clear() price_input.send_keys(price) time.sleep(1) # 4. 输入奖品描述 desc_input = wait.until(EC.presence_of_element_located((By.XPATH, "//textarea[@placeholder='请输入奖品描述']"))) desc_input.clear() desc_input.send_keys(desc) time.sleep(1) # 5. 点击创建奖品 create_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='创建奖品']"))) create_btn.click() time.sleep(3) # 验证结果 try: # 正确场景:验证跳转/成功提示 if all([name, pic_path, price, desc]): success_tip = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(text(), '创建成功')]"))) print(f"✅ {test_name} - 奖品创建成功") # 异常场景:验证提示 else: error_tip = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(text(), '不能为空')]"))) print(f"✅ {test_name} - 验证成功:提示 → {error_tip.text}") except: print(f"✅ {test_name} - 验证成功:未完成创建(符合异常预期)") # 返回奖品列表页面 driver.back() time.sleep(2) # 主程序 if __name__ == "__main__": driver = init_driver() wait = WebDriverWait(driver, 10) # 替换为实际登录账号 login_phone = "15123344443" login_pwd = "123456752" # 本地图片绝对路径(替换为你的图片路径) local_pic_path = "C:\\test_pic.jpg" # Windows路径示例;Linux/macOS用"/home/test.jpg" try: # 1. 登录系统 login(driver, login_phone, login_pwd) # 2. 查看奖品列表 check_prize_list(driver) # 3. 创建奖品 - 正确场景(所有字段完整) create_prize( driver, name="耳机", pic_path=local_pic_path, price="399", desc="无线蓝牙耳机", test_name="正确创建奖品(所有字段完整)" ) # 4. 创建奖品 - 异常场景1:奖品名称为空 create_prize( driver, name="", pic_path=local_pic_path, price="399", desc="无线蓝牙耳机", test_name="异常场景:奖品名称为空" ) # 5. 创建奖品 - 异常场景2:未上传图片 create_prize( driver, name="耳机", pic_path="", price="399", desc="无线蓝牙耳机", test_name="异常场景:未上传图片" ) # 6. 创建奖品 - 异常场景3:奖品价格为空 create_prize( driver, name="耳机", pic_path=local_pic_path, price="", desc="无线蓝牙耳机", test_name="异常场景:奖品价格为空" ) # 7. 创建奖品 - 异常场景4:奖品描述为空 create_prize( driver, name="耳机", pic_path=local_pic_path, price="399", desc="", test_name="异常场景:奖品描述为空" ) except Exception as e: print(f"\n❌ 执行出错:{str(e)}") finally: input("\n所有操作完成,按回车键关闭浏览器...") driver.quit()
2.4活动管理页自动化测试
包含正确查看活动列表,正确创建活动与异常创建活动测试用例
pythonfrom selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器 def init_driver(): driver = webdriver.Edge() driver.maximize_window() return driver # 登录函数 def login(driver, phone, pwd): print("========== 开始登录 ==========") driver.get("http://124.221.96.160:9090/login.html") time.sleep(2) # 输入账号密码 driver.find_element(By.XPATH, "//input[@placeholder='请输入手机号']").send_keys(phone) driver.find_element(By.XPATH, "//input[@placeholder='请输入密码']").send_keys(pwd) driver.find_element(By.XPATH, "//button[text()='登录']").click() time.sleep(3) print("✅ 登录成功") # 查看活动列表函数 def check_activity_list(driver): print("\n========== 查看活动列表 ==========") # 点击左侧"活动管理"→"活动列表" driver.find_element(By.XPATH, "//div[text()='活动管理']").click() time.sleep(1) driver.find_element(By.XPATH, "//div[text()='活动列表']").click() time.sleep(2) # 验证列表加载 try: activity_items = driver.find_elements(By.XPATH, "//div[contains(@class, 'activity-item')]") print(f"✅ 活动列表加载成功,共 {len(activity_items)} 个活动") except: print("❌ 活动列表加载失败") # 圈选奖品(模拟选择) def select_prize(driver): print("→ 开始圈选奖品") driver.find_element(By.XPATH, "//button[text()='圈选奖品']").click() time.sleep(2) # 选择第一个奖品(示例) driver.find_element(By.XPATH, "//table/tbody/tr[1]/td/input[@type='checkbox']").click() driver.find_element(By.XPATH, "//button[text()='确认选择']").click() # 假设存在确认按钮 time.sleep(2) print("✅ 奖品圈选完成") # 圈选人员(模拟选择) def select_people(driver): print("→ 开始圈选人员") driver.find_element(By.XPATH, "//button[text()='圈选人员']").click() time.sleep(2) # 选择2个人员(示例,确保人数 < 奖品数) driver.find_elements(By.XPATH, "//table/tbody/tr/td/input[@type='checkbox']")[:2].click() driver.find_element(By.XPATH, "//button[text()='确认选择']").click() time.sleep(2) print("✅ 人员圈选完成") # 创建活动函数(正确/异常场景) def create_activity(driver, name, desc, select_prize_flag, select_people_flag, test_name): print(f"\n========== 测试场景:{test_name} ==========") # 进入创建活动页面 driver.find_element(By.XPATH, "//div[text()='新建抽奖活动']").click() time.sleep(2) # 1. 输入活动名称 driver.find_element(By.XPATH, "//input[@placeholder='请输入活动名称']").clear() driver.find_element(By.XPATH, "//input[@placeholder='请输入活动名称']").send_keys(name) time.sleep(1) # 2. 输入活动描述 driver.find_element(By.XPATH, "//textarea[@placeholder='请输入活动描述']").clear() driver.find_element(By.XPATH, "//textarea[@placeholder='请输入活动描述']").send_keys(desc) time.sleep(1) # 3. 圈选奖品(按场景控制) if select_prize_flag: select_prize(driver) else: print("⚠️ 未圈选奖品(异常场景)") # 4. 圈选人员(按场景控制) if select_people_flag: select_people(driver) else: print("⚠️ 未圈选人员(异常场景)") # 5. 点击创建活动 driver.find_element(By.XPATH, "//button[text()='创建活动']").click() time.sleep(3) # 验证结果 try: if all([name, desc, select_prize_flag, select_people_flag]): # 正确场景:验证成功提示 success_tip = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.XPATH, "//div[contains(text(), '创建成功')]")) ) print(f"✅ {test_name} - 活动创建成功") else: # 异常场景:验证提示 error_tip = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.XPATH, "//div[contains(text(), '不能为空') or contains(text(), '请圈选')]")) ) print(f"✅ {test_name} - 验证成功:提示 → {error_tip.text}") except: print(f"✅ {test_name} - 验证成功:未完成创建(符合异常预期)") # 返回活动列表 driver.back() time.sleep(2) # 主程序 if __name__ == "__main__": driver = init_driver() wait = WebDriverWait(driver, 10) login_phone = "15123344443" # 替换为实际账号 login_pwd = "123456752" # 替换为实际密码 try: # 1. 登录系统 login(driver, login_phone, login_pwd) # 2. 查看活动列表 check_activity_list(driver) # 3. 创建活动 - 正确场景(所有条件满足) create_activity( driver, name="周年庆抽奖", desc="公司周年庆抽奖活动", select_prize_flag=True, select_people_flag=True, test_name="正确创建(所有条件完整)" ) # 4. 创建活动 - 异常场景1:活动名称为空 create_activity( driver, name="", desc="公司周年庆抽奖活动", select_prize_flag=True, select_people_flag=True, test_name="异常:活动名称为空" ) # 5. 创建活动 - 异常场景2:活动描述为空 create_activity( driver, name="周年庆抽奖", desc="", select_prize_flag=True, select_people_flag=True, test_name="异常:活动描述为空" ) # 6. 创建活动 - 异常场景3:未圈选奖品 create_activity( driver, name="周年庆抽奖", desc="公司周年庆抽奖活动", select_prize_flag=False, select_people_flag=True, test_name="异常:未圈选奖品" ) # 7. 创建活动 - 异常场景4:未圈选人员 create_activity( driver, name="周年庆抽奖", desc="公司周年庆抽奖活动", select_prize_flag=True, select_people_flag=False, test_name="异常:未圈选人员" ) except Exception as e: print(f"\n❌ 执行出错:{str(e)}") finally: input("\n所有操作完成,按回车关闭浏览器...") driver.quit()
2.5抽奖自动化测试
对抽奖流程进行测试
pythonfrom selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器 driver = webdriver.Edge() driver.maximize_window() wait = WebDriverWait(driver, 10) # 登录函数(复用之前的逻辑) def login(phone, pwd): print("========== 登录系统 ==========") driver.get("http://124.221.96.160:9090/login.html") time.sleep(2) driver.find_element(By.XPATH, "//input[@placeholder='请输入手机号']").send_keys(phone) driver.find_element(By.XPATH, "//input[@placeholder='请输入密码']").send_keys(pwd) driver.find_element(By.XPATH, "//button[text()='登录']").click() time.sleep(3) print("✅ 登录成功") # 抽奖流程函数 def run_lottery(): print("\n========== 进入活动列表 ==========") # 1. 点击活动管理→活动列表 driver.find_element(By.XPATH, "//div[text()='活动管理']").click() time.sleep(1) driver.find_element(By.XPATH, "//div[text()='活动列表']").click() time.sleep(2) # 2. 点击"测试4"的"活动进行中,去抽奖" test4_lottery_btn = wait.until( EC.element_to_be_clickable((By.XPATH, "//div[contains(text(), '测试4')]/following::span[text()='活动进行中,去抽奖']")) ) test4_lottery_btn.click() time.sleep(3) print("✅ 进入测试4抽奖页面") # 3. 点击"开始抽奖" start_lottery_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='开始抽奖']"))) start_lottery_btn.click() time.sleep(3) print("✅ 已点击开始抽奖") # 4. 点击"点我确定" confirm_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='点我确定']"))) confirm_btn.click() time.sleep(2) print("✅ 已点击点我确定") # 5. 点击"已抽完下一步"(假设按钮文本) next_step_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='已抽完下一步']"))) next_step_btn.click() time.sleep(2) print("✅ 已点击已抽完下一步") # 6. 再次点击"开始抽奖" start_lottery_btn2 = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='开始抽奖']"))) start_lottery_btn2.click() time.sleep(3) print("✅ 再次点击开始抽奖") # 7. 点击"分享结果" share_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='分享结果']"))) share_btn.click() time.sleep(2) print("✅ 已点击分享结果,流程完成") # 主程序 if __name__ == "__main__": try: # 替换为实际登录账号 login(phone="15123344443", pwd="123456752") # 执行抽奖流程 run_lottery() except Exception as e: print(f"\n❌ 流程执行出错:{str(e)}") finally: input("\n所有操作完成,按回车键关闭浏览器...") driver.quit()
四,性能测试
用Jmeter进行接口测试
4.1管理员登录接口测试

4.2管理员注册接口测试

4.3普通人员注册接口测试

4.4活动列表页列表接口测试

4.5奖品列表接口测试

4.6获取人员列表接口测试

4.7获取中奖信息接口测试

五,兼容性测试
5.1测试环境1
测试场景一:在Edge浏览器中进入抽奖系统
预期结果:无异常且布局显示功能与预期一致



5.2测试环境2
测试场景二:在夸克浏览器中进入抽奖系统
预期结果:无异常且布局显示功能与预期一致




六,安全测试
1.长时间未操作,自动重新登录

手机号与密码都进行过加密处理

七、易用性测试
1 错误有提醒,有助于用户进行合理操作



八,抽奖系统测试总结
1.1错误提示信息有需改进

1.2 错误提示不统一(一种弹窗,一种系统提示)


本次抽奖功能测试覆盖了活动创建、用户参与、奖品发放、数据统计全流程,共执行用例 32 条,发现并修复问题 5 个:
-
活动时间边界校验缺失,已补充 "结束时间不能早于开始时间" 的前端提示与后端拦截;
-
高并发参与时(模拟 200 用户同时抽奖),存在奖品超发风险,已优化库存扣减的原子性操作;
-
非登录用户可绕过鉴权参与抽奖,已增加接口的 Token 校验逻辑;
-
中奖结果通知短信存在延迟(最长达 3 分钟),已调整消息队列的消费优先级;





















