
一:项目概述
1.项目背景
为解决现有抽奖形式的诸多痛点,适配企业数字化运营需求,因此开发了以抽奖活动为核心场景的Spring Boot项目,旨在通过该项目提供一个全面、可靠、易于维护的专业抽奖平台。
2.项目结构
- 管理员模块:登录、注册
- 普通用户模块:用户列表、普通用户注册
- 奖品模块:奖品列表、奖品创建
- 活动模块:活动列表、创建活动
- 抽奖模块:抽奖活动、中奖者页面展示
3.采用技术
项目采用Spring Boot框架,基于Java语言开发,使用MyBatis作为持久层框架,MySQL存储业务数据,Redis实现缓存服务,RabbitMQ处理异步消息队列,JWT进行身份认证,前端采用HTML/CSS/JavaScript实现,整体构建高并发抽奖系统。
4.测试环境
- 操作系统:Windows 11
- 浏览器:Chrome
- 测试工具:Selenium、JMeter、postman
二:测试用例

三:功能测试
1:手动测试
1.1登录页面测试
1.1.1密码登录
测试场景一:手机号和密码都为不填
预期结果:系统提示手机号、密码为空

测试场景二:手机号格式不正确和密码填写正确
预期结果:弹窗提醒"登录失败登录方式不存在"

测试场景三:手机号填写错误格式正确和密码填写正确
预期结果:弹窗提醒"登录失败身份错误"

测试场景四:手机号正确,密码格式错)
预期结果:系统提醒"密码长度至少为6个字符"

测试场景五:手机号正确,密码错误(密码格式正确)
预期结果:弹窗提醒"登录失败密码错误"

测试场景六:手机号正确,密码正确
预期结果:跳转到活动中心页

1.1.2验证码登录
测试场景一:手机号和验证码都为空
预期结果:系统提示"请输入手机、验证码"

测试场景二:手机号错误和验证码正确
预期结果:弹窗提醒"登录失败身份错误"

测试场景三:手机号格式错误和验证码正确
预期结果:弹窗提醒"登录失败手机号格式错误"
测试场景四:手机号正确和验证码不正确
预期结果:弹窗提醒"登录失败验证码校验失败"

1.2 人员管理测试
1.2.1 人员管理列表测试
测试场景:打开人员管理列表页面,后显示所有的人员信息(包括管理员和非管理员信息)
1.2.2 普通人员创建测试
测试场景一:所有都为空时候
预期结果:系统提示请输入相关的信息

测试场景二:邮箱格式错误,其他正确
预期结果:系统提示请输入有效的邮箱地址

测试场景三:手机号格式错误,其他正确
预期结果:弹窗提示"注册失败!手机号格式错误"

测试场景五:全部正确
预期结果:创建成功最终跳转人员列表页面

1.2.3 管理员人员注册测试
测试场景一:当输入的密码不符合要求时候
预期结果:系统提示:密码长度至少6位的字符

测试场景二:输入的手机号码已存在时候
预期结果:系统提示:注册失败!手机号已存在

测试场景三:输入的都符合要求
预期结果:系统提示:注册成功去登陆,点击确定跳转到活动列表页面

1.3 奖品管理测试
1.3.1 奖品列表测试
测试场景一:点击奖品列表
预期结果:正常显示奖品列表

1.3.2 奖品创建测试
测试场景一:全部空着提交
预期结果:弹窗"创建奖品失败"

测试场景二:奖品名称不填其它都填
预期结果:系统提示:创建奖品失败

测试场景三:所有都正常填写
预期结果:弹窗提示:奖品创建成功

1.4活动页面测试
1.4.1活动列表测试
测试场景一:点击活动列表,显示所有活动信息
预期结果: 点击已完成的活动后可以查看中奖名单。

测试场景二:点击活动列表,显示所有活动信息
预期结果: 点击未完成的活动后,可以继续进行抽奖。


1.4.2 新建活动测试
测试场景一:当所有信息都不填写的时候
预期结果:系统会提示要输入相关的信息

测试场景二:填写了活动名称和奖品描述,但未圈选奖品和人员
预期结果:弹窗提示"请至少选择一个奖品"

测试场景三:填写活动名称和奖品描述,圈选奖品,未圈选人员
预期结果:弹窗提醒"请至少选择一个人员",人员数量大于等于奖品数量

测试场景四:填写活动名称和奖品描述,圈选奖品,圈选人员但圈选的人员数量小于奖品数量。
预期结果:弹窗提醒"创建失败!活动关联奖品及人员数量设置异常

测试场景五:填写活动名称和奖品描述,圈选奖品,圈选人员(且圈选人员人数比奖品多) 预期结果:弹窗提示创建成功,跳转活动列表

1.4.3 抽奖页面测试
测试场景:正常抽奖流程
预期结果:最终展示中奖者名单

2:自动化测试
2.1驱动类
java
package common;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
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 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 wait = null;
public static String lotteryUrl = null;
public Utils(String url) {
WebDriver webDriver = createDriver();
webDriver.get(url);
wait = new WebDriverWait(driver , Duration.ofSeconds(30));
}
/**
* 获取驱动,打开浏览器
* @return
*/
public WebDriver createDriver(){
if(driver == null){
ChromeOptions options = new ChromeOptions();
// 允许访问所有链接
options.addArguments("--remote-allow-origins=*");
// 禁用一些可能导致问题的功能
options.addArguments("--disable-blink-features=AutomationControlled");
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
try {
// 优先使用 WebDriverManager,但指定使用缓存版本避免解析错误
WebDriverManager.chromedriver().clearResolutionCache().setup();
} catch (Exception e) {
// 如果 WebDriverManager 失败,Selenium 4.6+ 会自动使用内置的 Selenium Manager
System.out.println("WebDriverManager 失败,使用 Selenium 内置驱动管理: " + e.getMessage());
}
driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
/**
* 保存截图
* @param str
* @throws IOException
*/
public void ScreenShot(String str) throws IOException {
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/test/java/images/"+dirTime+"/"+str+"-"+fileTime+".png";
File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file , new File(filename));
}
/**
* 退出浏览器
*/
public static void quit(){
if (driver != null) {
driver.quit();
driver = null;
}
}
}
2.2 注册测试类
java
import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
public class RegisterTest extends Utils {
public static String url = "http://127.0.0.1:8080/register.html?admin=true";
public RegisterTest() {
super(url);
}
public void checkRegisterPage() throws InterruptedException {
// 检验元素
checkRegisterElement();
// 异常注册
checkAbnormalRegister("" ,"666@qq.com" , "16166666666" , "12345678");
checkAbnormalRegister("mq" ,"" , "16166666666" , "12345678");
checkAbnormalRegister("mq" ,"666@qq.com" , "" , "12345678");
checkAbnormalRegister("mq" ,"666@qq.com" , "16166666666" , "");
// 错误注册
checkErrorRegister("mq" ,"666" , "16166666666" , "12345678");
checkErrorRegister("mq" ,"666@qq.com" , "1616666666" , "12345678");
checkErrorRegister("mq" ,"666@qq.com" , "16166666666" , "1234");
// 正常注册
clearText();
driver.findElement(By.xpath("//*[@id=\"name\"]")).sendKeys("mq");
driver.findElement(By.xpath("//*[@id=\"mail\"]")).sendKeys("654@qq.com");
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys("16166666666");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");
driver.findElement(By.xpath("//*[@id=\"registerForm\"]/button")).click();
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
private void checkErrorRegister(String username , String email , String phone , String password) throws InterruptedException {
clearText();
driver.findElement(By.xpath("//*[@id=\"name\"]")).sendKeys(username);
driver.findElement(By.xpath("//*[@id=\"mail\"]")).sendKeys(email);
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys(phone);
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys(password);
driver.findElement(By.xpath("//*[@id=\"registerForm\"]/button")).click();
if(phone.length() < 11){
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
}
private void checkAbnormalRegister(String username , String email , String phone , String password) {
clearText();
if(!username.equals("")){
driver.findElement(By.xpath("//*[@id=\"name\"]")).sendKeys(username);
}
if(!email.equals("")){
driver.findElement(By.xpath("//*[@id=\"mail\"]")).sendKeys(email);
}
if(!phone.equals("")){
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys(phone);
}
if(!password.equals("")){
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys(password);
}
driver.findElement(By.xpath("//*[@id=\"registerForm\"]/button")).click();
}
private void checkRegisterElement() {
// 姓名
driver.findElement(By.xpath("//*[@id=\"name\"]"));
// 邮箱
driver.findElement(By.xpath("//*[@id=\"mail\"]"));
// 手机号
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]"));
// 密码
driver.findElement(By.xpath("//*[@id=\"password\"]"));
// 注册
driver.findElement(By.xpath("//*[@id=\"registerForm\"]/button"));
}
public void clearText(){
// 姓名
driver.findElement(By.xpath("//*[@id=\"name\"]")).clear();
// 邮箱
driver.findElement(By.xpath("//*[@id=\"mail\"]")).clear();
// 手机号
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).clear();
// 密码
driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
}
}
2.3 登陆测试
java
import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
public class LoginTest extends Utils {
public static String url = "http://127.0.0.1:8080/blogin.html";
public LoginTest() {
super(url);
}
/**
* 检验密码登录
*/
public void checkPasswordLogin() throws InterruptedException {
wait.until(webDriver ->{
JavascriptExecutor js = (JavascriptExecutor) webDriver;
return "complete".equals(js.executeScript("return document.readyState"));
});
// 检验密码登录页面元素
checkPasswordLoginElement();
// ----------异常密码登录方式--------
checkPasswordAbnormalLogin();
// ----------错误密码登录方式--------
// 手机号密码都错误
// ----手机号格式不对
checkPassWordErrorLogin("1234567890" , "123456");
// ----手机号格式正确
checkPassWordErrorLogin("12345678901" , "123456");
// 账号错误,密码正确
// ----手机号格式不对
checkPassWordErrorLogin("1234567890" , "12345678");
// ----手机号格式正确
checkPassWordErrorLogin("12345678901" , "12345678");
// 账号正确,密码错误
// --- 密码格式不正确
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys("17347303966");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("1234");
driver.findElement(By.xpath("//*[@id=\"loginForm\"]/button")).click();
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
// ---- 密码格式正确
checkPassWordErrorLogin("17347303966" , "111111");
// ----------正确密码登录方式--------
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys("16166666666");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");
driver.findElement(By.xpath("//*[@id=\"loginForm\"]/button")).click();
driver.findElement(By.xpath("/html/body/div[1]/div[2]/div/span"));
}
public void checkMessageLogin() throws InterruptedException {
wait.until(webDriver ->{
JavascriptExecutor js = (JavascriptExecutor) webDriver;
return "complete".equals(js.executeScript("return document.readyState"));
});
// 校验元素
checkMessageLoginElement();
// 异常登录
checkMessageAbnormalLogin();
// 错误登录
checkMessageErrorLogin();
// 正确登录
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]")).sendKeys("16166666666");
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]")).sendKeys("12345678");
driver.findElement(By.xpath("//*[@id=\"codeForm\"]/button")).click();
Thread.sleep(2000);
}
private void checkMessageErrorLogin() throws InterruptedException {
// 手机号格式不对
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]")).sendKeys("1301443803");
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]")).sendKeys("123456");
driver.findElement(By.xpath("//*[@id=\"codeForm\"]/button")).click();
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]")).clear();
// 手机号格式对,验证码不对
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]")).sendKeys("17347303966");
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]")).sendKeys("12345");
driver.findElement(By.xpath("//*[@id=\"codeForm\"]/button")).click();
Thread.sleep(1000);
alert = driver.switchTo().alert();
alert.accept();
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]")).clear();
}
private void checkMessageAbnormalLogin() {
// 都空
driver.findElement(By.xpath("//*[@id=\"codeForm\"]/button")).click();
// 验证码不空。手机号空
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]")).sendKeys("123456");
driver.findElement(By.xpath("//*[@id=\"codeForm\"]/button")).click();
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]")).clear();
// 验证码空。手机号不为空
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]")).sendKeys("17347303966");
driver.findElement(By.xpath("//*[@id=\"codeForm\"]/button")).click();
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]")).clear();
}
public void checkPasswordLoginElement(){
// 密码登录
driver.findElement(By.xpath("/html/body/div[1]/div[2]/div[1]/span[1]"));
// 验证码登录
driver.findElement(By.xpath("/html/body/div[1]/div[2]/div[1]/span[2]"));
// 手机号
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]"));
// 密码
driver.findElement(By.xpath("//*[@id=\"password\"]"));
// 登录
driver.findElement(By.xpath("//*[@id=\"loginForm\"]/button"));
// 注册
driver.findElement(By.xpath("/html/body/div[1]/div[2]/div[2]/a"));
}
public void checkMessageLoginElement() throws InterruptedException {
// 跳转到验证码登录页
driver.findElement(By.xpath("/html/body/div/div[2]/div[1]/span[2]")).click();
Thread.sleep(1000);
// 校验页面元素
// 手机号
driver.findElement(By.xpath("//*[@id=\"loginMobile\"]"));
// 验证码框和获取验证码
driver.findElement(By.xpath("//*[@id=\"verificationCode\"]"));
driver.findElement(By.xpath("//*[@id=\"getVerificationCode\"]"));
// 登录按钮
driver.findElement(By.xpath("//*[@id=\"codeForm\"]/button"));
// 注册按钮
driver.findElement(By.xpath("/html/body/div[1]/div[2]/div[2]/a"));
Thread.sleep(1000);
}
public void checkPasswordAbnormalLogin() throws InterruptedException {
driver.findElement(By.xpath("//*[@id=\"loginForm\"]/button")).click();
// 手机号为空,密码不为空
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");
driver.findElement(By.xpath("//*[@id=\"loginForm\"]/button")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
//手机号不为空,密码为空
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys("12345678901");
driver.findElement(By.xpath("//*[@id=\"loginForm\"]/button")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).clear();
}
public void checkPassWordErrorLogin(String phoneNumber , String password) throws InterruptedException {
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys(phoneNumber);
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys(password);
driver.findElement(By.xpath("//*[@id=\"loginForm\"]/button")).click();
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
Thread.sleep(1000);
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
}
}
2.4 活动中心测试
java
import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import java.util.Set;
public class ActivityCenterTest extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public ActivityCenterTest() {
super(url);
}
public void checkActivityCenterPage() throws InterruptedException {
// 校验人员管理
checkUserRegister();
// 校验奖品管理
checkPrizeRegister();
// 校验活动管理
checkActivityRegister();
private void checkActivityRegister() throws InterruptedException {
waitPage();
driver.findElement(By.xpath("//*[@id=\"createActivity\"]")).click();
checkActivityElement();
// 异常创建
checkAbnormalActivityCreation("" , "第二个测试" , "奖品" , "人员1");
checkAbnormalActivityCreation("测试2" , "" , "奖品" , "人员1");
checkAbnormalActivityCreation("测试2" , "第二个测试" , "" , "人员1");
checkAbnormalActivityCreation("测试2" , "第二个测试" , "奖品" , "");
// 正常创建
clearActivityTest();
driver.findElement(By.xpath("//*[@id=\"activityName\"]")).sendKeys("测试2");
// 活动描述
driver.findElement(By.xpath("//*[@id=\"description\"]")).sendKeys("第二个测试");
driver.findElement(By.xpath("//*[@id=\"buttonPrizes\"]")).click();
driver.findElement(By.xpath("//*[@id=\"prize-20\"]")).click();
driver.findElement(By.xpath("//*[@id=\"prizesModal\"]/div/div[3]/button[2]")).click();
driver.findElement(By.xpath("//*[@id=\"buttonUsers\"]")).click();
driver.findElement(By.xpath("//*[@id=\"user-45\"]")).click();
driver.findElement(By.xpath("//*[@id=\"usersModal\"]/div/div[2]/button[2]")).click();
driver.findElement(By.xpath("//*[@id=\"createActivity\"]")).click();
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
driver.switchTo().defaultContent();
}
private void checkAbnormalActivityCreation(String activityName , String activityDescribe , String prize , String user) throws InterruptedException {
clearActivityTest();
// 活动名称
driver.findElement(By.xpath("//*[@id=\"activityName\"]")).sendKeys(activityName);
// 活动描述
driver.findElement(By.xpath("//*[@id=\"description\"]")).sendKeys(activityDescribe);
// 圈选奖品
if(!prize.isEmpty()){
driver.findElement(By.xpath("//*[@id=\"buttonPrizes\"]")).click();
driver.findElement(By.xpath("//*[@id=\"prize-20\"]")).click();
driver.findElement(By.xpath("//*[@id=\"prizesModal\"]/div/div[3]/button[2]")).click();
}
// 圈选人员
if(!user.isEmpty()){
driver.findElement(By.xpath("//*[@id=\"buttonUsers\"]")).click();
driver.findElement(By.xpath("//*[@id=\"user-45\"]")).click();
driver.findElement(By.xpath("//*[@id=\"usersModal\"]/div/div[2]/button[2]")).click();
}
// 创建活动
driver.findElement(By.xpath("//*[@id=\"createActivity\"]")).click();
if(!activityName.isEmpty() && !activityDescribe.isEmpty()){
if(prize.isEmpty() || user.isEmpty()){
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
}
}
private void checkActivityElement() {
driver.switchTo().frame("contentFrame");
// 活动名称
driver.findElement(By.xpath("//*[@id=\"activityName\"]"));
// 活动描述
driver.findElement(By.xpath("//*[@id=\"description\"]"));
// 圈选奖品
driver.findElement(By.xpath("//*[@id=\"buttonPrizes\"]"));
// 圈选人员
driver.findElement(By.xpath("//*[@id=\"buttonUsers\"]"));
// 创建活动
driver.findElement(By.xpath("//*[@id=\"createActivity\"]"));
}
private void checkPrizeRegister() throws InterruptedException {
waitPage();
driver.findElement(By.xpath("/html/body/div[2]/div[1]/ul/li[2]/ul/li[1]/a")).click();
driver.findElement(By.xpath("/html/body/div[2]/div[1]/ul/li[2]/ul/li[2]/a")).click();
waitPage();
// 检查元素
checkPrizeElement();
// 异常创建
checkAbnormalCreation("手机","" , "" , "");
checkAbnormalCreation("","" , "13999" , "");
checkAbnormalCreation("手机","" , "" , "一部手机");
checkAbnormalCreation("手机","" , "13999" , "");
checkAbnormalCreation("","D:\\PIC\\725ea4c5-9c88-4f3e-8897-47ba39da03c6.jpg" , "" , "");
// 正常创建
clearPrizeTest();
driver.findElement(By.xpath("//*[@id=\"prizeName\"]")).sendKeys("手机");
// 奖品图片
driver.findElement(By.xpath("//*[@id=\"prizeImageUrl\"]")).sendKeys("D:\\PIC\\725ea4c5-9c88-4f3e-8897-47ba39da03c6.jpg");
// 奖品价格
driver.findElement(By.xpath("//*[@id=\"price\"]")).sendKeys("13999");
// 奖品描述
driver.findElement(By.xpath("//*[@id=\"description\"]")).sendKeys("一部手机");
// 创建奖品
driver.findElement(By.xpath("/html/body/div/button")).click();
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
private void checkAbnormalCreation(String prizeName , String picUrl , String prizePrice , String prizeDescribe) throws InterruptedException {
clearPrizeTest();
driver.findElement(By.xpath("//*[@id=\"prizeName\"]")).sendKeys(prizeName);
// 奖品图片
if(picUrl != ""){
driver.findElement(By.xpath("//*[@id=\"prizeImageUrl\"]")).sendKeys(picUrl);
}
// 奖品价格
driver.findElement(By.xpath("//*[@id=\"price\"]")).sendKeys(prizePrice);
// 奖品描述
driver.findElement(By.xpath("//*[@id=\"description\"]")).sendKeys(prizeDescribe);
// 创建奖品
driver.findElement(By.xpath("/html/body/div/button")).click();
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
private void checkPrizeElement() {
driver.switchTo().frame("contentFrame");
// 奖品名称
driver.findElement(By.xpath("//*[@id=\"prizeName\"]"));
// 奖品图片
driver.findElement(By.xpath("//*[@id=\"prizeImageUrl\"]"));
// 奖品价格
driver.findElement(By.xpath("//*[@id=\"price\"]"));
// 奖品描述
driver.findElement(By.xpath("//*[@id=\"description\"]"));
// 创建奖品
driver.findElement(By.xpath("/html/body/div/button"));
}
private void checkUserRegister() throws InterruptedException {
waitPage();
driver.findElement(By.xpath("//*[@id=\"userList\"]")).click();
driver.findElement(By.xpath("//*[@id=\"register\"]")).click();
waitPage();
// 校验元素
checkUserElement();
// 异常创建
checkAbnormalRegister("人员3", "" , "");
checkAbnormalRegister("", "2341@qq.com" , "");
checkAbnormalRegister("", "" , "13012312312");
// 错误注册
checkErrorRegister("人员3", "2341" , "13012312312");
checkErrorRegister("人员3", "2341@qq.com" , "1301231231");
// 正确注册
clearUserTest();
driver.findElement(By.xpath("//*[@id=\"name\"]")).sendKeys("人员4");
// 邮箱
driver.findElement(By.xpath("//*[@id=\"mail\"]")).sendKeys("23412@qq.com");
// 手机号
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys("13012312312");
// 注册
driver.findElement(By.xpath("//*[@id=\"registerForm\"]/button")).click();
driver.switchTo().defaultContent();
}
private void checkErrorRegister(String name , String email , String phone ) throws InterruptedException {
clearUserTest();
// 姓名
driver.findElement(By.xpath("//*[@id=\"name\"]")).sendKeys(name);
// 邮箱
driver.findElement(By.xpath("//*[@id=\"mail\"]")).sendKeys(email);
// 手机号
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys(phone);
// 注册
driver.findElement(By.xpath("//*[@id=\"registerForm\"]/button")).click();
if(phone.length() < 11 && phone.length() > 0){
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
}
private void checkAbnormalRegister(String name , String email , String phone) {
clearUserTest();
// 姓名
driver.findElement(By.xpath("//*[@id=\"name\"]")).sendKeys(name);
// 邮箱
driver.findElement(By.xpath("//*[@id=\"mail\"]")).sendKeys(email);
// 手机号
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).sendKeys(phone);
// 注册
driver.findElement(By.xpath("//*[@id=\"registerForm\"]/button")).click();
}
private void checkUserElement() throws InterruptedException {
waitPage();
// 姓名
// //*[@id="name"]
driver.switchTo().frame("contentFrame");
driver.findElement(By.xpath("//*[@id=\"name\"]"));
// 邮箱
driver.findElement(By.xpath("//*[@id=\"mail\"]"));
// 手机号
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]"));
// 注册
driver.findElement(By.xpath("//*[@id=\"registerForm\"]/button"));
}
public void waitPage(){
wait.until(webDriver ->{
JavascriptExecutor js = (JavascriptExecutor) webDriver;
return "complete".equals(js.executeScript("return document.readyState"));
});
}
public void clearActivityTest(){
driver.findElement(By.xpath("//*[@id=\"activityName\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"description\"]")).clear();
String prizeText = driver.findElement(By.xpath("//*[@id=\"buttonPrizes\"]")).getText();
if(prizeText.equals("圈选奖品(已选)")){
driver.findElement(By.xpath("//*[@id=\"buttonPrizes\"]")).click();
driver.findElement(By.xpath("//*[@id=\"prize-20\"]")).click();
driver.findElement(By.xpath("//*[@id=\"prizesModal\"]/div/div[3]/button[2]")).click();
}
String userText = driver.findElement(By.xpath("//*[@id=\"buttonUsers\"]")).getText();
if(userText.equals("圈选人员(已选)")){
driver.findElement(By.xpath("//*[@id=\"buttonUsers\"]")).click();
driver.findElement(By.xpath("//*[@id=\"user-45\"]")).click();
driver.findElement(By.xpath("//*[@id=\"usersModal\"]/div/div[2]/button[2]")).click();
}
}
// 清空注册人员文本框
public void clearUserTest(){
driver.findElement(By.xpath("//*[@id=\"name\"]")).clear();
// 邮箱
driver.findElement(By.xpath("//*[@id=\"mail\"]")).clear();
// 手机号
driver.findElement(By.xpath("//*[@id=\"phoneNumber\"]")).clear();
}
// 清除奖品文本框
public void clearPrizeTest(){
driver.findElement(By.xpath("//*[@id=\"prizeName\"]")).clear();
// 奖品图片
driver.findElement(By.xpath("//*[@id=\"prizeImageUrl\"]")).clear();
// 奖品价格
driver.findElement(By.xpath("//*[@id=\"price\"]")).clear();
// 奖品描述
driver.findElement(By.xpath("//*[@id=\"description\"]")).clear();
}
// 退出活动中心页
public void exit(){
driver.findElement(By.xpath("/html/body/div[1]/div[2]/div/span")).click();
}
}
三:性能测试
3.1接口测试
3.1.1管理员用户接口测试

3.1.2普通用户注册接口测试

3.1.3登录接口测试

3.1.4获取活动列表接口测试

3.1.5获取奖品列表接口测试

3.1.6获取人员列表接口测试

3.1.7获取抽奖活动信息接口测试

3.1.8获取抽奖信息接口

3.2负载测试
3.2.1聚合测试

3.2.2每秒事务数

3.2.3响应时间可视化

3.2.4活跃线程数

四:兼容测试
在Edge和chrome浏览器均可以正常打开页面
五:安全测试
1.长时间未操作,会叫你登录。
2.对数据库敏感信息内容进行了加密
六:易用性测试
出现错误时都有弹窗提示
七:总结
在这个项目中需要注意的:邮箱注册必须为qq邮箱,以及短信服务实现不了(阿里云申请个人自用的申请不了现在),后续改进项目用qq邮箱来实现模拟短信接受。以及图片传入的格式种类比较少。以及还缺少可以管理员可以直接删除活动/人员/奖品的功能实现。
