基于多设计模式的抽奖系统__测试报告

一,测试项目概述

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登录页面自动化测试

测试包含正确账号密码,空账号空密码,错误账号或错误密码部分用例

python 复制代码
from 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注册页面自动化测试

包含用户名,邮箱,手机号码,密码等所有异常注册的测试用例,以及正确注册的测试用例

python 复制代码
from 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奖品管理页自动化测试

包含正确查看奖品列表,正确创建奖品以及错误创建奖品测试用例代码

python 复制代码
from 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活动管理页自动化测试

包含正确查看活动列表,正确创建活动与异常创建活动测试用例

python 复制代码
from 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抽奖自动化测试

对抽奖流程进行测试

python 复制代码
from 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 个:

  1. 活动时间边界校验缺失,已补充 "结束时间不能早于开始时间" 的前端提示与后端拦截;

  2. 高并发参与时(模拟 200 用户同时抽奖),存在奖品超发风险,已优化库存扣减的原子性操作;

  3. 非登录用户可绕过鉴权参与抽奖,已增加接口的 Token 校验逻辑;

  4. 中奖结果通知短信存在延迟(最长达 3 分钟),已调整消息队列的消费优先级;

相关推荐
v***5651 小时前
常见的 Spring 项目目录结构
java·后端·spring
超频化石鱼1 小时前
使用Postman访问siliconflow大模型接口
java·postman·ai编程
f***45321 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud
b***66611 小时前
Spring Framework 中文官方文档
java·后端·spring
7***47711 小时前
【SQL】掌握SQL查询技巧:数据分组与排序
java·jvm·sql
好好研究1 小时前
MyBatis框架 - 逆向工程
java·数据库·mybatis
关于不上作者榜就原神启动那件事1 小时前
心跳机制详解
java·前端·servlet
张np1 小时前
java基础-List接口
java·开发语言
聆风吟º1 小时前
【Spring Boot 报错已解决】Error creating bean with entityManagerFactory 原因分析与解决方案
java·spring boot·后端