星璇抽奖测试报告

一、项目背景
基于 Spring Boot 实现的前后端分离的星璇抽奖系统旨在为企业或组织提供一个高效、便捷的在线抽奖解决方案。该系统有管理员和普通用户两个角色,支持管理员创建普通用户、新建活动奖品、创建抽奖活动、进行抽奖等功能。用户参与抽奖活动,通过随机算法产生中奖结果,并能对抽奖活动进行管理,包括设置奖项、控制参与人数等。它具有良好的可扩展性和可维护性,能够适应不同规模的抽奖需求。
二、项目功能
该抽奖项目主要实现了登录或注册管理员、新建活动奖品、创建抽奖活动、进行抽奖以及创建普通用户进行人员管理等功能。
1.登录或注册管理员
- 用户已有账号:输入手机号密码或手机号验证码,经后端校验通过以后成功登录系统,进入抽奖首页。
- 用户没有账号:点击注册按钮,跳转注册页面填写信息进行注册,注册完毕跳转回登录页面。
2.新建活动奖品
在后台管理中找到奖品管理-创建奖品,输入奖品名称、价格和描述并上传奖品图片,点击“创建奖品”按钮,成功创建奖品。
3.创建抽奖活动
在后台管理中找到活动管理-新建抽奖活动,输入活动名称和活动描述,并圈选奖品和人员,点击“创建活动”按钮,成功创建活动。
4.抽奖
在后台管理中找到活动列表,点击活动进行抽奖。
5.创建普通用户
在后台管理中找到人员管理-注册用户,输入姓名、邮箱和手机号,点击“注册”按钮,成功创建普通用户。
三、测试计划
- 根据抽奖的每个页面和不同页面对应的功能编写测试用例。
- 根据测试用例执行相关测试,对不符合要求的地方进行记录,并提bug。
- 编写自动化测试代码,执行自动化测试。
- 对本次测试进行总结。
四、功能测试
1.测试用例
2.执行功能测试
2.1 登录成功
2.2 新建活动奖品
弹出弹窗,提示“奖品创建成功”。
2.3 创建抽奖活动
填写完活动名称和描述后,设置奖品数量和等级,并将要抽取的奖品勾选上。
勾选要参与抽奖的人员。
点击“创建活动”,弹出弹窗显示“创建成功”
2.4 抽奖
在活动列表中选择要进行的抽奖活动,点击“活动进行中,去抽奖”按钮。
开始一等奖的抽取,奖品为拍立得1份。
一等奖抽取完毕,中奖者为朱伯丞。
点击“已抽完,下一步”按钮,进行二等奖的抽取。
开始二等奖的抽取,奖品为小卡1份。
二等奖抽取完毕,中奖者为周诣涛。
点击“已抽完,下一步”按钮,进行三等奖的抽取。
开始三等奖的抽取,奖品为贴纸1份。
三等奖抽取完毕,中奖者为钟鸿森。
点击“点我确定”按钮,查看中奖名单。
2.5 中奖结果分享
点击“分享结果”按钮,弹出弹窗显示“链接已复制到粘贴板”。
2.6 创建普通用户
输入未被使用过并且为合法字符的姓名、邮箱和手机号,点击“注册”按钮,注册成功。
在人员管理-人员列表中可以看到刚刚注册的普通用户。
五、自动化测试
1. 测试用例
2. 代码编写
- 根据测试用例进行UI自动化测试。
- 公共属性单独放一个类,方便进行代码复用。
- 注意添加隐式等待,确保页面正确加载显示。
2.1 添加依赖pom.xml
2.2 代码封装
package common;import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;public class Utils {public static WebDriver driver;public static WebDriver createDriver() {if (driver == null) {// 1、打开浏览器// 使用驱动管理程序,打开对应的浏览器驱动// 这边使用谷歌浏览器进行自动化测试WebDriverManager.chromedriver().setup();// 增加浏览器配置,创建驱动对象时要强制允许访问所有的链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");// 创建一个浏览器驱动对象 (在这里会打开一个网页)driver = new ChromeDriver(options);// 隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));}return driver;}public Utils(String url) {// 调用 driver 对象driver = createDriver();// 访问指定的urldriver.get(url);}// 屏幕截图public void getScreenShot(String str) throws IOException {// 屏幕截图SimpleDateFormat sim1 = new SimpleDateFormat("yyyy_MM_dd");SimpleDateFormat sim2 = new SimpleDateFormat("HH_mm_ss_SSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());// 设置文件名称String fileName = "./src/test/image/" + dirTime + "/" + str + "_" + fileTime + ".png";File file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);// 存放至对应路径FileUtils.copyFile(file,new File(fileName));}// 登录public void base_login() {// 登录页面跳转至添加奖品页面driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("18799999999");driver.findElement(By.cssSelector("#password")).sendKeys("123456789");driver.findElement(By.cssSelector("#loginForm > button")).click();driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}
}
2.3 登录测试
验证登录成功和登录失败的情况。
登录成功:
- 使用 WebDriver 打开登录页面
- 输入正确手机号和正确密码
- 点击登录按钮,登录成功跳转到主页面
登录失败:
- 输入正确手机号和错误密码 / 输入错误手机号和正确密码
- 点击登录按钮,处理弹窗
- 看程序是否正常结束,若正常,则符合预期
/*** 测试登录* 1、创建驱动,并打开页面* 2、测试页面是否正常打开* 3、测试正常登录:多参数测试* 4、测试异常登录:用户名/密码错误*/public void login() throws InterruptedException {/*** 正常登录* 1、输入正确手机号* 2、输入正确密码* 3、点击登录按钮*/driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("18799999999");driver.findElement(By.cssSelector("#password")).sendKeys("123456789");driver.findElement(By.cssSelector("#loginForm > button")).click();/*** 登录失败* 1、回退到登录页面* 2、输入正确/错误手机号* 3、输入正确/错误密码* 4、点击登录按钮*/// 回退到登录页面driver.findElement(By.cssSelector("body > div.header-box > div.user-box > div > span")).click();// 手机号未注册、密码正确driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("18712345678");driver.findElement(By.cssSelector("#password")).sendKeys("123456789");driver.findElement(By.cssSelector("#loginForm > button")).click();// 此时会有弹窗显示登录失败 点击确定Alert alert = driver.switchTo().alert();alert.accept();// 手机号已注册、密码错误driver.findElement(By.cssSelector("#phoneNumber")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("18799999999");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#loginForm > button")).click();// 此时会有弹窗显示登录失败 点击确定alert = driver.switchTo().alert();alert.accept();}
与预期结果一致,登录测试通过。
2.4 注册测试
- 使用 WebDriver 打开登录页面
- 点击页面中的注册按钮,跳转至注册页面
- 填写正确格式的属性值
- 点击注册按钮进行注册
- 在登录页面使用注册的信息进行登录,验证是否注册成功
- 如果成功登录,就说明注册成功,程序正常执行完毕
/*** 注册测试* 1、刷新页面* 2、跳转至注册页面* 3、填写注册信息* 4、点击注册按钮* 5、回到登录页面测试是否可以登录*/public void register() throws InterruptedException {// 刷新页面driver.navigate().refresh();// 在登录界面点击跳转注册driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.register-link > a")).click();// 填写信息driver.findElement(By.cssSelector("#name")).sendKeys("周诣涛");driver.findElement(By.cssSelector("#mail")).sendKeys("18720020207@qq.com");driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("18720020207");driver.findElement(By.cssSelector("#password")).sendKeys("123456789");driver.findElement(By.cssSelector("#registerForm > button")).click();// 注册完有弹窗显示注册成功,点击确认。点击完跳转回登录界面Thread.sleep(100);Alert alert = driver.switchTo().alert();alert.accept();// 测试注册成功driver.findElement(By.cssSelector("#phoneNumber")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("18720020207");driver.findElement(By.cssSelector("#password")).sendKeys("123456789");driver.findElement(By.cssSelector("#loginForm > button")).click();driver.close();}
与预期结果一致,注册测试通过。
2.5 人员管理测试
验证人员管理栏的创建普通用户功能以及用户列表显示功能。
- 在主页面点击进入注册普通用户界面
- 输入用户名、手机号、邮箱
- 点击注册按钮
- 注册成功自动跳转至人员列表页(逆序排列)
- 校验首个人员用户名是否与新注册的一致
- 若一致,则说明注册成功,程序正常执行完毕
public void createUser() throws InterruptedException {// 进入注册普通用户界面driver.findElement(By.cssSelector("#register")).click();// 显示等待,直到输入框出来driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));// 找到输入框,输入信息,点击注册按键driver.findElement(By.cssSelector("#name")).sendKeys("吴亚飞");driver.findElement(By.cssSelector("#mail")).sendKeys("18720050107@qq.com");driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("18720050107");// 注册成功弹出弹窗 点击确定 自动跳转到人员列表页Thread.sleep(100);Alert alert = driver.switchTo().alert();alert.accept();// 注册成功的用户会显示在首行 测试名称是否与要求的一致String name = driver.findElement(By.cssSelector("#userList > tr:nth-child(1) > td:nth-child(2)")).getText();System.out.println("自动化测试创建普通用户是否成功 -> " + name.equals("吴亚飞"));}
与预期结果一致,人员管理测试通过。
2.6 奖品管理测试
验证创建奖品和奖品列表显示功能。
- 在主页面点击进入创建奖品界面
- 输入奖品属性值,上传奖品图片
- 点击创建按钮
- 创建成功自动跳转至奖品列表页(逆序排列)
- 校验首个奖品属性值是否与新创建的一致
- 若一致,则说明创建成功,程序正常执行完毕
// 测试添加奖品public void addPrize() throws InterruptedException {base_login();// 登录页面跳转至添加奖品页面driver.findElement(By.cssSelector("body>div.cont-box>div.sidebar>ul>li:nth-child(2)>ul>li:nth-child(2)>a")).click();System.out.println(driver.getCurrentUrl());// 目标元素可能位于一个 iframe 中,若未先切换到该 iframe,Selenium 就无法定位到元素WebElement iframe = driver.findElement(By.id("contentFrame"));driver.switchTo().frame(iframe);// 设置奖品名称driver.findElement(By.cssSelector("#prizeName.form-control")).sendKeys("海报");// 定位文件输入框元素WebElement uploadElement = driver.findElement(By.cssSelector("#prizeImageUrl"));// 上传奖品图片uploadElement.sendKeys("E:\\LotterySystem\\LotteryAutoTest\\src\\test\\robot.png");// 设置奖品价格driver.findElement(By.cssSelector("#price.form-control")).sendKeys("85");// 设置奖品描述driver.findElement(By.cssSelector("#description.form-control")).sendKeys("33Svan海报");// 点击创建按钮,显示弹窗提示创建成功Thread.sleep(1000);driver.findElement(By.xpath("/html/body/div/button")).click();Thread.sleep(200); // 等待弹窗出现Alert alert = driver.switchTo().alert();alert.accept();// 跳转至奖品列表页面 测试第一个是不是设置的奖品String prizeName = driver.findElement(By.cssSelector("#prizeList > tr:nth-child(1) > td:nth-child(3)")).getText();System.out.println(prizeName);System.out.println("自动化添加的奖品是否成功 -> " + prizeName.equals("海报"));driver.close();}
与预期结果一致,奖品管理测试通过。
2.7 活动管理测试
验证创建活动和活动列表显示功能。
- 在主页面点击进入创建活动界面
- 输入活动属性值,圈选奖品、人员
- 点击创建按钮
- 创建成功自动跳转至活动列表页
- 校验首个活动属性值是否与新创建的一致,是否为未执行状态
- 若一致,则说明创建成功,开始执行活动
- 点击执行活动,页面跳转,需切换句柄
- 执行活动,若程序正常运行完毕,则说明符合需求
public void createActivity() throws InterruptedException {base_login();// 进入创建抽奖活动界面driver.findElement(By.cssSelector("#createActivity")).click();// 进入iframeWebElement iframe = driver.findElement(By.id("contentFrame"));driver.switchTo().frame(iframe);// 输入活动名称、活动描述driver.findElement(By.cssSelector("#activityName")).sendKeys("生日会");driver.findElement(By.cssSelector("#description")).sendKeys("33Svan生日会");Thread.sleep(1000);// 圈选奖品// 点击圈选按钮、圈选人员、点击确定、看圈选按钮是否显示已圈选driver.findElement(By.cssSelector("#buttonPrizes")).click();driver.findElement(By.cssSelector("#prize-30")).click();driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-primary")).click();String putPrize = driver.findElement(By.cssSelector("#buttonPrizes")).getText();if (putPrize.equals("圈选奖品(已选)")) {System.out.println("圈选奖品成功");
}// 圈选人员// 点击圈选按钮、圈选人员、点击确定、看圈选按钮是否显示已圈选driver.findElement(By.cssSelector("#buttonUsers")).click();driver.findElement(By.cssSelector("#user-42")).click();driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();String putUser = driver.findElement(By.cssSelector("#buttonUsers")).getText();if (putUser.equals("圈选人员(已选)")) {System.out.println("圈选人员成功");}// 创建活动driver.findElement(By.cssSelector("#createActivity")).click();// 处理弹窗Thread.sleep(200);Alert alert = driver.switchTo().alert();alert.accept();// 校验活动是否创建成功String activityName = driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.activity-info > h4")).getText();if (activityName.equals("生日会")) {System.out.println("活动创建成功");}// 此时页面在奖品列表页// 测试执行抽奖活动driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a")).click();// 跳转至新标签页 需要切换句柄// 获取当前页面句柄String currentHandle = driver.getWindowHandle();Set<String> allHandles = driver.getWindowHandles();for (String handle : allHandles) {// 如果句柄和当前的不一样,就切换if (!handle.equals(currentHandle)) {driver.switchTo().window(handle);}}// 点击抽奖driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));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();driver.close();}
与预期结果一致,活动管理测试通过。
六、测试结果评估
主线功能测试通过,项目可以上线。