目录
一、项目简介
1.1项目背景
1.2功能模块
二、测试
一)功能测试
二)自动化测试
1.准备工作
2.登录模块测试
3.人员模块测试
4.奖品模块测试
5.活动模块测试
6.测试的结果
编辑
(1)异步抽奖系统是基于Spring Boot框架开发的一个轻量级抽奖管理系统,部署于云服务器以实现远程访问与高效运行。系统通过前后端分离架构,支持快速配置抽奖活动、管理奖品及用户信息,并提供抽奖结果公示功能,旨在为用户提供一个灵活、可靠的活动管理工具。
(2)但是该项目用户信息,奖品图片等信息配置为静态数据,无法动态上传或修改;并且缺乏动态抽奖策略(如实时概率调整)、删除抽奖活动等功能;而奖品剩余数量、用户参与次数等关键数据未与前端实时同步,以静态文本展示。
(3)该抽奖系统支持用户和奖品的管理、活动创建和配置、抽奖逻辑、数据库存储和部署等功能。
(1)人员业务模块:管理员注册、登录,以及普通用户的创建。
(2)活动业务模块:活动管理及活动状态管理。
(3)奖品业务模块:奖品管理与奖品分配,还包括奖品图的上传。
(4)通知业务模块:发送短信、邮件等业务,例如验证码发送,中奖通知。
(5)抽奖业务模块:完成抽奖动作,以及抽奖后的结果展示。
1.测试用例
2.测试界面
管理员登录注册页面:
系统主界面:
中奖页面:
功能测试结果:测试用例100%通过
(1)在IDEA创建Maven项目,安装驱动管理,导入pom.xml相关依赖
4.0.0
org.example
seleniumAutoTest
1.0-SNAPSHOT
io.github.bonigarcia
webdrivermanager
5.8.0
test
org.seleniumhq.selenium
selenium-java
4.0.0
org.junit.platform
junit-platform-suite
1.9.1
org.junit.jupiter
junit-jupiter-engine
5.9.1
test
org.junit.jupiter
junit-jupiter-params
5.9.1
org.junit.jupiter
junit-jupiter-api
5.9.1
17
17
(2)创建一个类来初始化和释放浏览器驱动
package LotteryTest;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class InitAndEnd {
protected static WebDriver webDriver = null;
//初始化
@BeforeAll
static void init() {
WebDriverManager.chromedriver().setup();
//增加浏览器配置,创建驱动对象要强制指定允许访问所有的链接
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
webDriver = new ChromeDriver(options);
}
//结束
@AfterAll
static void end() {
webDriver.quit();
}
}
(1)登录成功测试:输入正确的账号和密码,判断页面是否进行了跳转
(2)登录失败测试:输入错误的账号密码,判断提示框是否提示“登录失败!密码错误”
(3)登录异常测试:不输入账号密码,点击登录,判断是否会提示“请输入账号"/”请输入密码"
package LotteryTest;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import static java.lang.Thread.sleep;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Login extends InitAndEnd {
@Order(1)
@ParameterizedTest
@CsvSource(value = {"15111111111,123456789"})
//登录成功界面测试
void loginSuccess(String phone, String password) throws InterruptedException {
//进入登录页面
InitAndEnd.webDriver.get("http://116.205.190.134:8080/blogin.html");
sleep(1000);
//输入账号(手机号/邮箱号)
InitAndEnd.webDriver.findElement(By.cssSelector("#phoneNumber")).sendKeys(phone);
//输入密码
InitAndEnd.webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
sleep(1000);
//点击登录
InitAndEnd.webDriver.findElement(By.cssSelector("#loginForm > button")).click();
sleep(1000);
//获取当前页面的url
String currentUrl = InitAndEnd.webDriver.getCurrentUrl();
//判断当前页面的url是否为登录完成后的主界面
Assertions.assertEquals("http://116.205.190.134:8080/admin.html",currentUrl);
sleep(1000);
}
@Order(2)
@ParameterizedTest
@CsvSource(value = {"15111111111,123455789"})
//登录失败
void loginFailed(String phone, String password) throws InterruptedException {
//进入登录页面
webDriver.get("http://116.205.190.134:8080/blogin.html");
sleep(1000);
//填写手机号与密码
webDriver.findElement(By.cssSelector("#phoneNumber")).sendKeys(phone);
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
sleep(1000);
//点击登录
webDriver.findElement(By.cssSelector("#loginForm > button")).click();
sleep(1000);
//获取提示框内容
String text = webDriver.switchTo().alert().getText();
System.out.println("alertText: " + text);
//断言提示框内容是
Assertions.assertEquals("登录失败!密码错误",text);
//确定提示框
webDriver.switchTo().alert().accept();
sleep(1000);
}
@Order(3)
@Test //无参数
void loginError() throws InterruptedException {
//进入登录页面
webDriver.get("http://116.205.190.134:8080/blogin.html");
sleep(1000);
//点击登录
webDriver.findElement(By.cssSelector("#loginForm > button")).click();
sleep(1000);
//获取手机号提示
String phoneError = webDriver
.findElement(By.cssSelector("#phoneNumber-error")).getText();
System.out.println("phoneError: " + phoneError);
Assertions.assertEquals("请输入您的手机号",phoneError);
//获取密码提示
String passwordError = webDriver
.findElement(By.cssSelector("#password-error")).getText();
System.out.println("passwordError: " + passwordError);
Assertions.assertEquals("请输入密码",passwordError);
}
}
(1)用户的注册的测试:判断是否是注册页面,如果是输入注册的用户信息,点击注册,看跳转的用户列表的第一个是不是新注册的用户
注意:
<1>需要提前登录以后才能进行测试
<2>如果要操作 iframe 内部的元素,必须先切换到该 iframe
<3>sleep(1000)可能不太够,页面还没加载出来,可以设置为3s
package LotteryTest;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import static java.lang.Thread.sleep;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class User extends InitAndEnd {
@BeforeEach
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("15111111111","123456789");
}
@ParameterizedTest
@CsvSource(value = {"王五,17770654922,[email protected]"})
void registerSuccess(String name,String phone,String mail) throws InterruptedException {
//点击注册用户按钮
webDriver.findElement(By.cssSelector("#register")).click();
sleep(3000);//时间不够加载不出来
//进入iFrame
inIFrame("contentFrame");
//获取标题
String title = webDriver.findElement(By.cssSelector("body > div > h2")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("填写注册信息",title);
//填写注册信息
webDriver.findElement(By.cssSelector("#name")).sendKeys(name);
webDriver.findElement(By.cssSelector("#phoneNumber")).sendKeys(phone);
webDriver.findElement(By.cssSelector("#mail")).sendKeys(mail);
//点击注册
webDriver.findElement(By.cssSelector("#registerForm > button")).click();
sleep(1000);
//获取标题
String newTitle = webDriver.findElement(By.cssSelector("body > div > h2")).getText();
System.out.println("title: " + newTitle);
Assertions.assertEquals("人员列表",newTitle);
//获取第一个用户的名字,并进行判断
String getName = webDriver.findElement(By
.cssSelector("#userList > tr:nth-child(1) > td:nth-child(2)"))
.getText();
System.out.println("userName: " + getName);
Assertions.assertEquals("王五",getName);
//退出iFrame
outIFrame();
}
//如果要操作 iframe 内部的元素,必须先切换到该 iframe
private void inIFrame(String id){
webDriver.switchTo().frame(id);
}
private void outIFrame(){
webDriver.switchTo().defaultContent();
}
}
(1)创建奖品测试:点击创建奖品按钮,判断当前页面是否是创建奖品的页面;然后填写奖品信息,创建奖品,判断提示框是否有“奖品创建成功"的提示,然后点击提示框的确定
package LotteryTest;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import static java.lang.Thread.sleep;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Prize extends InitAndEnd {
@BeforeEach
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("15111111111","123456789");
}
@ParameterizedTest
@CsvSource(value = {"企鹅,C:\\Users\\刘翼\\Pictures\\Saved Pictures\\OIP-C (1).jpg,87,企鹅玩偶"})
void createPrizeSuccess(String name,String pwd,String value,String desc) throws InterruptedException {
//点击创建奖品按钮
webDriver.findElement(By.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(2) > a")).click();
sleep(1000);
inIFrame("contentFrame");
sleep(1000);
//获取标题
String title = webDriver.findElement(By.cssSelector("body > div > h2")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("开始创建奖品",title);
//填写信息
webDriver.findElement(By.cssSelector("#prizeName")).sendKeys(name);
webDriver.findElement(By.cssSelector("#prizeImageUrl")).sendKeys(pwd);
webDriver.findElement(By.cssSelector("#price")).sendKeys(value);
webDriver.findElement(By.cssSelector("#description")).sendKeys(desc);
sleep(1000);
//点击创建奖品
webDriver.findElement(By.cssSelector("body > div > button")).click();
sleep(1000);
//获取提示信息,并进行判断
String text = webDriver.switchTo().alert().getText();
System.out.println("alertText: " + text);
Assertions.assertEquals("奖品创建成功!",text);
webDriver.switchTo().alert().accept();
sleep(1000);
outIFrame();
}
//如果要操作 iframe 内部的元素,必须先切换到该 iframe
private void inIFrame(String id){
webDriver.switchTo().frame(id);
}
private void outIFrame(){
webDriver.switchTo().defaultContent();
}
}
(1)创建活动测试:点击创建活动,填写活动信息,接着圈选奖品(个数,等级),圈选人员,点击创建,看提示框是否出现”创建成功“
(2)查看活动列表测试:点击活动列表,先判断标题是否是活动列表,再判断第一个活动名称是否匹配
(3)查看获奖列表测试:点击进入活动列表界面,点击查看中奖名单,切换句柄到中奖列表页,判断是否有“中奖名单”字样,最后回到主页面
(4)分享抽奖结果测试:进入分享结果都界面,判断是否有中奖名单,然后点击分享按钮,判断是否出现”链接已复制到粘贴板"
package LotteryTest;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.Select;
import java.util.Set;
import static java.lang.Thread.sleep;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Activity extends InitAndEnd {
//分享结果是无需登录的,所以这里不需要加注解
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("15111111111","123456789");
}
@Order(1)
@Test
void createActivity() throws InterruptedException {
login();
//点击新建抽奖活动按钮
webDriver.findElement(By.cssSelector("#createActivity")).click();
sleep(1000);
inIFrame("contentFrame");
sleep(1000);
//填写信息
webDriver.findElement(By.cssSelector("#activityName")).sendKeys("年度晚会");
webDriver.findElement(By.cssSelector("#description")).sendKeys("星光璀璨夜,共襄年度盛宴");
//圈选奖品
webDriver.findElement(By.cssSelector("#buttonPrizes")).click();
webDriver.findElement(By.cssSelector("#prize-19")).click();
Select select1 = new Select(webDriver.findElement(By.cssSelector("#prizesContainer > div:nth-child(1) > select")));
select1.selectByValue("FIRST_PRIZE");
webDriver.findElement(By.cssSelector("#prize-22")).click();
Select select2 = new Select(webDriver.findElement(By.cssSelector("#prizesContainer > div:nth-child(2) > select")));
select2.selectByValue("SECOND_PRIZE");
//点击确定
webDriver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-primary")).click();
//圈选人员
webDriver.findElement(By.cssSelector("#buttonUsers")).click();
webDriver.findElement(By.cssSelector("#user-45")).click();
webDriver.findElement(By.cssSelector("#user-43")).click();
webDriver.findElement(By.cssSelector("#user-41")).click();
//点击确定
webDriver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();
//点击创建
webDriver.findElement(By.cssSelector("#createActivity")).click();
sleep(1000);
//获取提示框内容,并进行断言
String tip = webDriver.switchTo().alert().getText();
System.out.println("alertText: " + tip);
Assertions.assertEquals("创建成功!",tip);
webDriver.switchTo().alert().accept();
sleep(3000);
outIFrame();
}
@Order(2)
@Test
void checkActivityList() throws InterruptedException {
login();
webDriver.findElement(By.cssSelector("#activitiesList")).click();
sleep(1000);
inIFrame("contentFrame");
sleep(1000);
//获取标题
String title = webDriver.findElement(By.cssSelector("body > div > h2")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("活动列表",title);
//获取第一个活动标题
String activity = webDriver.findElement(By
.cssSelector("#activities > div:nth-child(1) > div.activity-info > h4")).getText();
System.out.println("activity: " + activity);
Assertions.assertEquals("年度晚会",activity);
outIFrame();
}
@Order(3)
@Test
void checkWinnerList() throws InterruptedException {
//进入活动列表页面
Activity activity = new Activity();
activity.checkActivityList();
inIFrame("contentFrame");
//点击查看中奖名单
webDriver.findElement(By
.cssSelector("#activities > div:nth-child(2) > div.inactive > p > a")).click();
//切换到中奖列表页
Set windowHandles = webDriver.getWindowHandles();
String handle = webDriver.getWindowHandle();
for (String w:windowHandles) {
if (!w.equals(handle)){
webDriver.switchTo().window(w);
break;
}
}
sleep(1000);
String title = webDriver.findElement(By.cssSelector("#disc")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("中奖名单",title);
//切换回主页面
webDriver.switchTo().window(handle);
outIFrame();
}
@Order(4)
@Test
//分享中奖名单测试
void shareWinnerList() throws InterruptedException {
webDriver.get("http://116.205.190.134:8080/draw.html?activityName=%E5%B9%B4%E4%BC%9A%E6%8A%BD%E5%A5%96&activityId=25&valid=false");
sleep(1000);
String title = webDriver.findElement(By.cssSelector("#disc")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("中奖名单",title);
//点击分享结果按钮
webDriver.findElement(By.cssSelector("#container > div.opt-box > span.btn.copy-btn")).click();
sleep(1000);
String tip = webDriver.switchTo().alert().getText();
System.out.println("alertText: " + tip);
Assertions.assertEquals("链接已复制到剪贴板",tip);
webDriver.switchTo().alert().accept();
}
}
(1)登录模块
(2)人员模块
(3)奖品模块
(4)活动模块