活动抽奖系统--测试报告
一、项目描述1.项目背景基于 Spring Boot 开发的在线抽奖管理平台支持活动创建、奖品管理、用户管理、抽奖执行和中奖记录查询等功能。具备异常回滚机制确保业务处理正常中奖数据不会丢失中奖结果通过邮箱通知。2.项目模块管理员模块登录管理员用户注册。普通用户模块用户列表普通用户注册。奖品模块奖品列表奖品创建。活动模块活动列表活动创建。抽奖模块抽奖活动中奖活动通知。3.测试环境操作系统Windows 11浏览器Chrome测试工具Selenium、JMeter、postman二、测试用例三、功能测试1.手动测试1.1登陆页面测试测试场景1手机号与密码均不填写。预期结果提示请输入手机号与密码。测试场景2手机号填写正确密码填写正确手机号对应的账号不存在预期结果提示登陆失败用户不存在测试场景3手机号密码格式正确但密码错误。预期结果提示登陆失败用户名或密码错误测试场景4手机号格式正确密码格式错误。预期结果提示密码长度至少为6位测试场景5手机号正确密码正确预期结果正确登录跳转至活动页面1.2注册管理员用户页面测试测试场景1所有信息均不填写预期结果系统提示请输入信息测试场景2密码格式错误预期结果提示密码长度至少为6个字符测试场景2邮箱格式错误预期结果提示请输入有效的邮箱地址测试场景3手机号格式错误预期结果提示手机号格式错误测试场景4所有格式均正确,但邮箱或手机号已被使用预期结果提示注册失败邮箱或手机号已被使用测试场景5所有格式均正确且手机号或邮箱未被使用预期场景成功注册并跳转登录页面1.3人员列表页面测试测试场景1点击人员列表预测场景正常显示人员列表1.4注册普通用户页面测试测试场景1姓名、邮箱和手机号都为空预期结果系统提示姓名、邮箱、手机号为空测试场景2格式正确但邮箱或手机号已被使用预期结果:提示注册失败邮箱或手机号已被使用测试场景3所有信息均正确且无人使用预期结果注册成功跳转用户列表页1.5奖品列表页面测试测试场景1点击奖品列表预测场景正常显示奖品列表1.6创建奖品页面测试测试场景1所有信息均为空预期结果提示创建失败测试场景2只填写奖品名称预期结果提示创建失败测试场景3所有信息填写均正确预期结果创建成功1.7活动列表页面测试测试场景1点击活动列表预期结果正常显示活动列表1.8创建抽奖活动测试测试场景1所有信息均未空预期结果系统提示信息为空测试场景2填写活动名称和奖品描述未圈选奖品和人员预测场景系统提示请至少选择一个奖品测试场景3填写活动名称和奖品描述奖品圈选数量大于人员数量预期结果系统提示活动关联的奖品及人员数量异常测试场景4所有信息均填写正确预期结果系统提示创建成功并跳转活动列表页1.9抽奖页面测试测试场景1正常抽奖流程预期结果展示中奖者名单2.自动化测试2.1工具类package com.springboot; import io.github.bonigarcia.wdm.WebDriverManager; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.ObjectUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.PageLoadStrategy; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.support.ui.WebDriverWait; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.Duration; public class Utils { public static WebDriver driver null; public WebDriverWait driverWait null; public Utils(String url){ createDriver(); driver.get(url); driverWait new WebDriverWait(driver, Duration.ofSeconds(3)); } public static WebDriver createDriver() { if (driver null) { String proxyHost 127.0.0.1; int proxyPort 7897; //创建谷歌驱动 WebDriverManager.chromedriver() .proxy(proxyHost : proxyPort) // 设置代理 .setup(); ChromeOptions options new ChromeOptions(); //允许访问所有的链接 options.addArguments(--remote-allow-origins*); //设置加载模式 EAGER为等待部分元素加载完成 options.setPageLoadStrategy(PageLoadStrategy.EAGER); driver new ChromeDriver(options); //2s隐式等待 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2)); } return driver; } public void getShot(String str) throws IOException { // ./src/test/img/ // /2026-04-12/ // /test01-152420.png SimpleDateFormat sim1 new SimpleDateFormat(yyyy-MM-dd); SimpleDateFormat sim2 new SimpleDateFormat(HHmmssSS); String dirTime sim1.format(System.currentTimeMillis()); String fileTime sim2.format(System.currentTimeMillis()); String filename ./src/main/java/img/test-dirTime/str-fileTime.png; File file ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(file,new File(filename)); } public static void main(String[] args) throws IOException { Utils utils new Utils(https://www.baidu.com); utils.getShot(test); driver.quit(); } }2.2登录页面测试类package com.springboot.tests; import com.springboot.Utils; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import java.io.IOException; public class LoginPage extends Utils { public static String url http://127.0.0.1:8080/login.html; public LoginPage(){ super(url); } //检查页面元素 public void checkPage() throws IOException { driver.findElement(By.cssSelector(#phoneNumber)); driver.findElement(By.cssSelector(#password)); driver.findElement(By.cssSelector(#loginForm button)); driver.findElement(By.cssSelector(body div div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 div a)); getShot(checkPage); } //错误登录 public void loginFail(){ //清空输入框 driver.findElement(By.cssSelector(#phoneNumber)).clear(); driver.findElement(By.cssSelector(#password)).clear(); //输入错误的账号或密码 driver.findElement(By.cssSelector(#phoneNumber)).sendKeys(17830792041); driver.findElement(By.cssSelector(#password)).sendKeys(1234567); driver.findElement(By.cssSelector(#loginForm button)).click(); //处理弹窗 Alert alert driver.switchTo().alert(); alert.accept(); } //正确登录 public void loginSuccess(){ //清空输入框 driver.findElement(By.cssSelector(#phoneNumber)).clear(); driver.findElement(By.cssSelector(#password)).clear(); driver.findElement(By.cssSelector(#phoneNumber)).sendKeys(17830792041); driver.findElement(By.cssSelector(#password)).sendKeys(123456); driver.findElement(By.cssSelector(#loginForm button)).click(); } }2.3注册页面测试类package com.springboot.tests; import com.springboot.Utils; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import java.io.IOException; public class RegisterPage extends Utils { public static String url http://127.0.0.1:8080/register.html?admintrue; public RegisterPage() { super(url); } //检查页面元素 public void checkPage() throws IOException { String title driver.findElement(By.cssSelector(body div h2)).getText(); assert title.equals(填写注册信息); driver.findElement(By.cssSelector(#name)); driver.findElement(By.cssSelector(#mail)); driver.findElement(By.cssSelector(#phoneNumber)); driver.findElement(By.cssSelector(#password)); driver.findElement(By.cssSelector(#registerForm button)); getShot(checkPage); } //错误注册 public void registerFail() { //清空输入框 driver.findElement(By.cssSelector(#name)).clear(); driver.findElement(By.cssSelector(#mail)).clear(); driver.findElement(By.cssSelector(#phoneNumber)).clear(); driver.findElement(By.cssSelector(#password)).clear(); driver.findElement(By.cssSelector(#name)).sendKeys(teests); //不符合格式的邮箱 driver.findElement(By.cssSelector(#mail)).sendKeys(123456); driver.findElement(By.cssSelector(#phoneNumber)).sendKeys(17830745120); driver.findElement(By.cssSelector(#password)).sendKeys(123456); Alert alert driver.switchTo().alert(); alert.accept(); } //正确注册 public void registerSuccess() { //清空输入框 driver.findElement(By.cssSelector(#name)).clear(); driver.findElement(By.cssSelector(#mail)).clear(); driver.findElement(By.cssSelector(#phoneNumber)).clear(); driver.findElement(By.cssSelector(#password)).clear(); driver.findElement(By.cssSelector(#name)).sendKeys(teests); driver.findElement(By.cssSelector(#mail)).sendKeys(123xxqq.com); driver.findElement(By.cssSelector(#phoneNumber)).sendKeys(17830745120); driver.findElement(By.cssSelector(#password)).sendKeys(123456); } }2.4活动中心测试类package com.springboot.tests; import com.springboot.Utils; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; import java.io.IOException; import java.util.List; import java.util.Set; public class ActivePage extends Utils { public static String url http://127.0.0.1:8080/admin.html; public ActivePage() { super(url); } public void checkPage() throws IOException { // 检查元素 String title driver.findElement(By.cssSelector(body div.header-box div.user-box div span)).getText(); assert title.equals(退出); driver.findElement(By.cssSelector(#activitiesList)); driver.findElement(By.cssSelector(#createActivity)); driver.findElement(By.cssSelector(body div.cont-box div.sidebar ul li:nth-child(2) ul li:nth-child(1) a)); driver.findElement(By.cssSelector(body div.cont-box div.sidebar ul li:nth-child(2) ul li:nth-child(2) a)); driver.findElement(By.cssSelector(#userList)); driver.findElement(By.cssSelector(#register)); getShot(checkPage); } public void checkCreatePrizePage(){ //点击进入创建页面 driver.findElement( By.cssSelector( body div.cont-box div.sidebar ul li:nth-child(2) ul li:nth-child(2) a)) .click(); //切换到子页面 WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); // 检查元素 String title driver.findElement(By.cssSelector(body div h2)).getText(); assert title.equals(开始创建奖品); driver.findElement(By.cssSelector(#prizeName)); driver.findElement(By.cssSelector(#prizeImageUrl)); driver.findElement(By.cssSelector(#price)); driver.findElement(By.cssSelector(#description)); driver.findElement(By.cssSelector(body div button)); //切换回主页面 driver.switchTo().defaultContent(); } public void createPrizeFail(){ driver.findElement( By.cssSelector( body div.cont-box div.sidebar ul li:nth-child(2) ul li:nth-child(2) a)) .click(); //切换到子页面 WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); driver.findElement(By.cssSelector(#prizeName)).clear(); driver.findElement(By.cssSelector(#prizeImageUrl)).clear(); driver.findElement(By.cssSelector(#price)).clear(); driver.findElement(By.cssSelector(#description)).clear(); driver.findElement(By.cssSelector(#prizeName)).sendKeys(手机); driver.findElement(By.cssSelector(#prizeImageUrl)); driver.findElement(By.cssSelector(#price)).sendKeys(6000); driver.findElement(By.cssSelector(#description)).sendKeys(一部手机); driver.findElement(By.cssSelector(body div button)).click(); Alert alert driver.switchTo().alert(); alert.accept(); //切换回主页面 driver.switchTo().defaultContent(); } public void createPrizeSuccess(){ driver.findElement(By.cssSelector( body div.cont-box div.sidebar ul li:nth-child(2) ul li:nth-child(2) a)) .click(); //切换到子页面 WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); driver.findElement(By.cssSelector(#prizeName)).clear(); driver.findElement(By.cssSelector(#prizeImageUrl)).clear(); driver.findElement(By.cssSelector(#price)).clear(); driver.findElement(By.cssSelector(#description)).clear(); driver.findElement(By.cssSelector(#prizeName)).sendKeys(手机); driver.findElement(By.cssSelector(#prizeImageUrl)) .sendKeys(D:\\)_8}0GPBF[{79NWD$Z7C(P.png); driver.findElement(By.cssSelector(#price)).sendKeys(6000); driver.findElement(By.cssSelector(#description)).sendKeys(一部手机); driver.findElement(By.cssSelector(body div button)).click(); Alert alert driver.switchTo().alert(); alert.accept(); //切换回主页面 driver.switchTo().defaultContent(); } public void checkPricePage(){ driver.findElement(By.cssSelector( body div.cont-box div.sidebar ul li:nth-child(2) ul li:nth-child(1) a)) .click(); //切换到子页面 WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); String title driver.findElement(By.cssSelector(body div h2)).getText(); assert title.equals(奖品列表); String id driver.findElement(By.cssSelector(body div div.table-box table thead tr th:nth-child(1))).getText(); assert id.equals(奖品id); String prizePic driver.findElement(By.cssSelector(body div div.table-box table thead tr th:nth-child(2))).getText(); assert prizePic.equals(奖品图); String prizeName driver.findElement(By.cssSelector(body div div.table-box table thead tr th:nth-child(3))).getText(); assert prizeName.equals(奖品名); String prizeDesc driver.findElement(By.cssSelector(body div div.table-box table thead tr th:nth-child(4))).getText(); assert prizeDesc.equals(奖品描述); String price driver.findElement(By.cssSelector(body div div.table-box table thead tr th:nth-child(5))).getText(); assert price.equals(奖品价值); driver.switchTo().defaultContent(); } public void checkRegisterPage(){ driver.findElement(By.cssSelector(#register)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); String title driver.findElement(By.cssSelector(body div h2)).getText(); assert title.equals(填写注册信息); driver.findElement(By.cssSelector(#name)); driver.findElement(By.cssSelector(#mail)); driver.findElement(By.cssSelector(#phoneNumber)); driver.findElement(By.cssSelector(#registerForm button)); driver.switchTo().defaultContent(); } public void registerFail(){ driver.findElement(By.cssSelector(#register)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); driver.findElement(By.cssSelector(#name)).clear(); driver.findElement(By.cssSelector(#mail)).clear(); driver.findElement(By.cssSelector(#phoneNumber)).clear(); driver.findElement(By.cssSelector(#name)).sendKeys(test002); driver.findElement(By.cssSelector(#mail)); driver.findElement(By.cssSelector(#phoneNumber)).sendKeys(17830115412); driver.findElement(By.cssSelector(#registerForm button)).click(); Alert alert driver.switchTo().alert(); alert.accept(); driver.switchTo().defaultContent(); } public void registerSuccess(){ driver.findElement(By.cssSelector(#register)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); driver.findElement(By.cssSelector(#name)).clear(); driver.findElement(By.cssSelector(#mail)).clear(); driver.findElement(By.cssSelector(#phoneNumber)).clear(); driver.findElement(By.cssSelector(#name)).sendKeys(test002); driver.findElement(By.cssSelector(#mail)).sendKeys(test002qq.com); driver.findElement(By.cssSelector(#phoneNumber)).sendKeys(17830115412); driver.findElement(By.cssSelector(#registerForm button)).click(); driver.switchTo().defaultContent(); } public void checkUserPage(){ driver.findElement(By.cssSelector(#userList)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); String title driver.findElement(By.cssSelector(body div h2)).getText(); assert title.equals(人员列表); String userId driver.findElement(By.cssSelector(body div div table thead tr th:nth-child(1))).getText(); assert userId.equals(人员id); String username driver.findElement(By.cssSelector(body div div table thead tr th:nth-child(2))).getText(); assert username.equals(姓名); String identity driver.findElement(By.cssSelector(body div div table thead tr th:nth-child(3))).getText(); assert identity.equals(身份); driver.switchTo().defaultContent(); } public void checkCreateActivityPage(){ driver.findElement(By.cssSelector(#createActivity)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); String title driver.findElement(By.cssSelector(body div.container h2)).getText(); assert title.equals(创建抽奖活动); driver.findElement(By.cssSelector(#activityName)); driver.findElement(By.cssSelector(#description)); driver.findElement(By.cssSelector(#buttonPrizes)); driver.findElement(By.cssSelector(#buttonUsers)); driver.findElement(By.cssSelector(#createActivity)); driver.switchTo().defaultContent(); } public void createActivityFail(){ driver.findElement(By.cssSelector(#createActivity)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); driver.findElement(By.cssSelector(#activityName)).clear(); driver.findElement(By.cssSelector(#description)).clear(); driver.findElement(By.cssSelector(#activityName)).sendKeys(test118); driver.findElement(By.cssSelector(#description)).sendKeys(test118); driver.findElement(By.cssSelector(#buttonPrizes)).click(); ListWebElement prizes (ListWebElement) driver.findElement(By.xpath(//*[id\prizesContainer\]//input)); prizes.get(0).click(); prizes.get(1).clear(); prizes.get(1).sendKeys(3); driver.findElement(By.cssSelector(#prizesModal div div.form-btn-box button.btn.btn-primary)).click(); driver.findElement(By.cssSelector(#buttonUsers)).click(); ListWebElement users (ListWebElement) driver.findElement(By.xpath(//*[id\usersContainer\]//input)); users.get(0).click(); users.get(1).click(); driver.findElement(By.cssSelector(#usersModal div div.form-btn-box button.btn.btn-primary)).click(); driver.findElement(By.cssSelector(#createActivity)).click(); Alert alert driver.switchTo().alert(); alert.accept(); driver.switchTo().defaultContent(); } public void createActivitySuccess(){ driver.findElement(By.cssSelector(#createActivity)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); driver.findElement(By.cssSelector(#activityName)).clear(); driver.findElement(By.cssSelector(#description)).clear(); driver.findElement(By.cssSelector(#activityName)).sendKeys(test118); driver.findElement(By.cssSelector(#description)).sendKeys(test118); driver.findElement(By.cssSelector(#buttonPrizes)).click(); ListWebElement prizes driver.findElements(By.xpath(//*[id\prizesContainer\]//input)); prizes.get(0).click(); prizes.get(1).clear(); prizes.get(1).sendKeys(3); driver.findElement(By.cssSelector(#prizesModal div div.form-btn-box button.btn.btn-primary)).click(); driver.findElement(By.cssSelector(#buttonUsers)).click(); ListWebElement users driver.findElements(By.xpath(//*[id\usersContainer\]//input)); users.get(0).click(); users.get(1).click(); users.get(2).click(); users.get(3).click(); driver.findElement(By.cssSelector(#usersModal div div.form-btn-box button.btn.btn-primary)).click(); driver.findElement(By.cssSelector(#createActivity)).click(); //创建成功也会有弹窗 Alert alert driver.switchTo().alert(); alert.accept(); driver.switchTo().defaultContent(); } public void checkActivityPage(){ driver.findElement(By.cssSelector(#activitiesList)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); String title driver.findElement(By.cssSelector(body div h2)).getText(); assert title.equals(活动列表); driver.findElement(By.cssSelector(#activities div:nth-child(1) div.activity-info h4)); driver.findElement(By.cssSelector(#activities div:nth-child(1) div.activity-info p)); driver.findElement(By.cssSelector(#activities div:nth-child(1) div.active p a)); driver.switchTo().defaultContent(); } public void checkDrawPage() { driver.findElement(By.cssSelector(#activitiesList)).click(); WebElement iframe driver.findElement(By.cssSelector(#contentFrame)); driver.switchTo().frame(iframe); driver.findElement(By.cssSelector(#activities div:nth-child(1) div.active p a)).click(); driver.switchTo().defaultContent(); //切换至抽奖页面 String curHandle driver.getWindowHandle(); SetString handles driver.getWindowHandles(); for(String handle : handles) { if (!handle.equals(curHandle)) { driver.switchTo().window(handle); } } //等待页面加载完成 driverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(#container))); driver.findElement(By.cssSelector(#title)); driver.findElement(By.cssSelector(#disc)); driver.findElement(By.cssSelector(#image)); String preBtn driver.findElement(By.cssSelector(#container div.opt-box span.btn.pre-btn)).getText(); assert preBtn.equals(查看上一奖项); String nestBtn driver.findElement(By.cssSelector(#container div.opt-box span.btn.next-btn)).getText(); assert nestBtn.equals(开始抽奖); } public void draw(){ while(driver.findElement(By.cssSelector(#container div.opt-box span.btn.next-btn)).getText().equals(开始抽奖)){ //开始抽奖 driver.findElement(By.cssSelector(#container div.opt-box span.btn.next-btn)).click(); //点我确定 driver.findElement(By.cssSelector(#container div.opt-box span.btn.next-btn)).click(); //下一步 driver.findElement(By.cssSelector(#container div.opt-box span.btn.next-btn)).click(); } String share driver.findElement(By.cssSelector(#container div.opt-box span.btn.copy-btn)).getText(); assert share.contains(分享结果); } }四、兼容性测试测试场景1使用edge浏览器进入活动抽奖系统预期结果无异常且布局显示功能与预期一致测试场景2使用谷歌浏览器进入活动抽奖系统预期结果无异常且布局显示功能与预期一致测试场景3使用手机端进入活动抽奖系统预期结果无异常且布局显示功能与预期一致五、易用性测试1.错误信息有引导且反馈清晰2.功能易用主页面左侧包含功能标签点击标签后进入功能子页面逻辑易用。六、测试总结1.潜在问题1.1部分错误信息不够完善2.总结本次测试覆盖的功能、易用性、兼容性、安全性等核心指标均满足上线标准建议项目可按计划上线。