【测试报告】Hsu营销平台系统 - 测试报告
项目简介
项目名称:Hsu营销平台系统 - 抽奖与行为奖励服务
项目概述:本项目采用Spring Boot、React、MySQL、Redis、RabbitMQ等技术栈,基于微服务架构和DDD理念,核心功能涵盖抽奖、用户行为奖励、积分兑换、活动装配和高并发库存管理。后端通过模板模式、责任链模式优化抽奖流程,利用Redis、RabbitMQ实现库存扣减和分布式事务一致性,提升系统在高并发场景下的性能与可靠性。前端采用React实现抽奖组件,优化交互与性能。
测试覆盖功能包括:九宫格抽奖、大转盘抽奖、奖品管理、活动装配、积分账户、商品兑换、用户签到返利等业务流程。
测试方法
- 测试用例设计:结合项目需求文档、前后端API和业务流程,采用等价类划分、边界值分析、场景法等方法,确保核心流程和异常路径全面覆盖。
- 自动化测试:基于Selenium和TestNG编写UI自动化测试脚本,模拟真实用户操作,实现端到端的回归测试。自动化测试覆盖主要业务场景,如抽奖、奖品展示、积分兑换、签到等。
- 接口测试:使用Postman和自动化脚本,对抽奖、账户、商品、签到等所有API进行功能和性能测试,验证接口稳定性和数据一致性。
- 性能与压力测试:采用JMeter对抽奖和积分系统进行高并发场景压测,分析系统响应时间、吞吐量和并发瓶颈,结合Redis和RabbitMQ优化缓存和消息队列处理能力。
- 安全性测试:对登录、积分等敏感操作进行SQL注入、XSS等常见安全漏洞检测,确保系统安全性和数据防护能力。
- 多端/多浏览器兼容性测试:自动化脚本支持Chrome/Edge,人工验证PC端、移动端及主流浏览器下的功能和页面兼容性。
非功能测试用例思维导图
功能测试用例思维导图
部分核心功能展示
- 页面展示
- 抽奖装配功能
- 每日签到返利功能
- 积分兑换抽奖次数功能
对比前一张图的积分和抽奖次数均已变化
- 左侧大转盘抽奖功能
- 右侧大转盘抽奖功能
- 底部展示抽奖权重功能
自动化核心代码
import common.TestUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import java.io.IOException;
import java.util.List;public class LuckySystemTest extends TestUtils {public static String url = "http://127.0.0.1:8080/"; public LuckySystemTest() {super(url);}// 1. 检查Lucky系统首页所有核心UI元素public void checkAllMainElements() throws IOException {// 抽奖主标题与页面头部driver.findElement(By.cssSelector("header"));driver.findElement(By.xpath("//*[contains(text(),'抽奖展示')]"));// Lucky九宫格和大转盘driver.findElement(By.cssSelector(".LuckyGrid, [class*=LuckyGrid]"));driver.findElement(By.cssSelector(".LuckyWheel, [class*=LuckyWheel]"));// 九宫格按钮及奖品图driver.findElement(By.cssSelector("[src='/raffle-button.png']"));driver.findElement(By.cssSelector("[src^='/raffle-award-0']")); // 任意一个奖品图片// 会员卡、商品、活动装配、权重规则模块driver.findElement(By.cssSelector(".MemberCard, [class*=MemberCard]"));driver.findElement(By.cssSelector(".SkuProduct, [class*=SkuProduct]"));driver.findElement(By.cssSelector(".StrategyArmory, [class*=StrategyArmory]"));driver.findElement(By.cssSelector(".StrategyRuleWeight, [class*=StrategyRuleWeight]"));// 底部版权driver.findElement(By.cssSelector("footer"));// Edge同样检查driverByEdge.findElement(By.cssSelector("header"));driverByEdge.findElement(By.xpath("//*[contains(text(),'抽奖展示')]"));driverByEdge.findElement(By.cssSelector(".LuckyGrid, [class*=LuckyGrid]"));driverByEdge.findElement(By.cssSelector(".LuckyWheel, [class*=LuckyWheel]"));driverByEdge.findElement(By.cssSelector("[src='/raffle-button.png']"));driverByEdge.findElement(By.cssSelector("[src^='/raffle-award-0']"));driverByEdge.findElement(By.cssSelector(".MemberCard, [class*=MemberCard]"));driverByEdge.findElement(By.cssSelector(".SkuProduct, [class*=SkuProduct]"));driverByEdge.findElement(By.cssSelector(".StrategyArmory, [class*=StrategyArmory]"));driverByEdge.findElement(By.cssSelector(".StrategyRuleWeight, [class*=StrategyRuleWeight]"));driverByEdge.findElement(By.cssSelector("footer"));getScreenShot("checkAllMainElements");}// 2. Lucky九宫格抽奖流程(按钮点击、动画、结果弹窗)public void gridRaffleFlow() throws IOException {// 点击抽奖按钮WebElement gridBtn = driver.findElement(By.cssSelector("[src='/raffle-button.png']"));gridBtn.click();// 等待动画和结果弹窗出现// driver.findElement(By.xpath("//*[contains(text(),'恭喜')]"));Thread.sleep(3500); // 等待动画和alert(如需)getScreenShot("gridRaffleFlow");// EdgeWebElement gridBtnEdge = driverByEdge.findElement(By.cssSelector("[src='/raffle-button.png']"));gridBtnEdge.click();Thread.sleep(3500);getScreenShot("gridRaffleFlow_Edge");}// 3. Lucky大转盘抽奖流程public void wheelRaffleFlow() throws IOException {// 点击大转盘“开始”按钮(可能是span或button,视页面结构修改)WebElement wheelBtn = driver.findElement(By.xpath("//*[text()='开始' or contains(.,'开始')]"));wheelBtn.click();Thread.sleep(3500);getScreenShot("wheelRaffleFlow");// EdgeWebElement wheelBtnEdge = driverByEdge.findElement(By.xpath("//*[text()='开始' or contains(.,'开始')]"));wheelBtnEdge.click();Thread.sleep(3500);getScreenShot("wheelRaffleFlow_Edge");}// 4. 查询奖品列表展示(奖品卡/奖品图片/奖品名称全部渲染)public void checkPrizeListDisplay() throws IOException {List<WebElement> prizeImgs = driver.findElements(By.cssSelector("[src^='/raffle-award-']"));assert(prizeImgs.size() >= 8); // 九宫格奖品或转盘奖品for (WebElement img : prizeImgs) {assert(img.isDisplayed());}getScreenShot("checkPrizeListDisplay");}// 5. 商品兑换流程public void skuExchangeFlow() throws IOException {// 找到商品列表第一个商品的兑换按钮并点击(按钮类名需与实际页面一致)WebElement exchangeBtn = driver.findElement(By.cssSelector(".SkuProduct .exchange-btn, [class*=SkuProduct] [class*=exchange]"));exchangeBtn.click();// 等待弹窗或页面提示(如有)Thread.sleep(1000);getScreenShot("skuExchangeFlow");}// 6. 活动装配(装配按钮点击,等待结果)public void armoryAction() throws IOException {WebElement armoryBtn = driver.findElement(By.cssSelector(".StrategyArmory button, [class*=StrategyArmory] button"));armoryBtn.click();// 可以等待装配结果的提示Thread.sleep(1000);getScreenShot("armoryAction");}// 7. 权重规则查看流程public void ruleWeightCheck() throws IOException {WebElement ruleBtn = driver.findElement(By.cssSelector(".StrategyRuleWeight button, [class*=StrategyRuleWeight] button"));ruleBtn.click();// 弹窗或规则详情区出现Thread.sleep(500);getScreenShot("ruleWeightCheck");}// 8. 会员卡查看(点击、展开等)public void memberCardCheck() throws IOException {WebElement memberCard = driver.findElement(By.cssSelector(".MemberCard, [class*=MemberCard]"));memberCard.click();Thread.sleep(500);getScreenShot("memberCardCheck");}// 9. 签到返利操作public void calendarSignFlow() throws IOException {WebElement signBtn = driver.findElement(By.cssSelector(".CalendarSign button, [class*=CalendarSign] button"));signBtn.click();Thread.sleep(500);getScreenShot("calendarSignFlow");}// 10. 查询积分账户信息public void checkCreditAccount() throws IOException {WebElement creditInfo = driver.findElement(By.cssSelector(".CreditAccountInfo, [class*=CreditAccountInfo]"));assert(creditInfo.isDisplayed());getScreenShot("checkCreditAccount");}// 11. 查询活动额度(额度区/文本)public void checkActivityAccount() throws IOException {WebElement quotaInfo = driver.findElement(By.cssSelector(".ActivityAccountInfo, [class*=ActivityAccountInfo]"));assert(quotaInfo.isDisplayed());getScreenShot("checkActivityAccount");}}
测试结论
本次测试,涵盖抽奖、奖品、活动、账户、签到、积分、商品兑换等全部核心业务模块,自动化与手工测试协同推进,接口和UI两端均有覆盖。系统在核心流程、边界场景、高并发下均通过测试,主要功能稳定、响应及时,满足业务上线标准。针对测试中发现的关键问题,已完成修复并回归验证。整体测试质量达到预期。