目录
一:项目背景
在市场竞争白热化的当下,企业与商家亟需不断推陈出新,打造新颖的营销手段,以此抓住消费者的目光。传统营销模式渐显疲态,消费者对千篇一律的促销活动已然产生审美疲劳。抽奖作为一种极具吸引力的营销手段,能够迅速激发消费者的参与热情。通过设置丰富多样的奖品,如现金红包、优惠券、实物礼品等,不仅能提升消费者在购物过程中的乐趣,增强其对品牌的好感度,还能显着促进销售额的增长。以电商平台的促销活动为例,抽奖系统作为关键的互动环节,能吸引用户浏览商品页面,延长用户在平台的停留时长,有效提高商品的曝光率与销售量
二:项目功能
(1) 注册功能
输入信息:
姓名:必填项,支持中文、英文及常见符号,长度限制在 1-50 个字符。
邮箱:必填项,需符合邮箱地址格式规范,系统将对输入邮箱进行格式校验,确保其有效性。
手机号:必填项,仅支持中国大陆手机号码,格式为 11 位数字,系统需对输入的手机号码进行格式验证。
密码:必填项,密码强度要求为 8-20 位,至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符(如!@#$%^&* 等)。系统需对密码复杂度进行实时校验,并提示用户密码强度是否符合要求。
注册流程:
管理员在注册页面依次输入姓名、邮箱、手机号和密码。
系统验证输入信息的格式和完整性。若存在格式错误或必填项未填写,系统在相应输入框旁提示错误信息,引导管理员更正。
当所有信息输入正确且格式无误后,管理员点击 “注册” 按钮。
系统检查输入的手机号和邮箱是否已在系统中注册。若已注册,提示管理员该手机号或邮箱已被使用,需更换后重新注册。
若手机号和邮箱未被注册,系统将管理员信息存储至数据库,并向管理员注册邮箱发送注册成功通知邮件,邮件内容包含账号信息及系统登录指引。
(2) 登录功能
电话 + 密码登录
输入信息:
手机号:必填项,格式同注册时要求,为 11 位中国大陆手机号码。
密码:必填项,输入注册时设置的密码。
登录流程:
管理员在登录页面选择 “电话 + 密码登录” 方式。
依次输入手机号和密码。
系统对输入的手机号和密码进行格式校验。若格式错误,提示管理员重新输入。
系统在数据库中查询匹配的管理员账号信息。若手机号和密码匹配成功,且该账号为管理员身份,则登录成功,进入抽奖系统管理后台;若匹配失败,提示管理员 “手机号或密码错误,请重新输入”。
电话 + 短信登录
输入信息:
手机号:必填项,格式同注册要求。
登录流程:
管理员在登录页面选择 “电话 + 短信登录” 方式。
输入手机号后,点击 “获取验证码” 按钮。
系统校验手机号格式是否正确。若格式错误,提示管理员更正。
若手机号格式正确,系统向该手机号发送一条包含 6 位数字验证码的短信。短信内容应明确告知该验证码用于抽奖系统登录,有效期为 5 分钟。
管理员在收到短信后,在登录页面输入收到的验证码。
系统验证验证码的有效性及准确性。若验证码正确且在有效期内,系统在数据库中查询该手机号对应的账号信息,若为管理员身份,则登录成功,进入抽奖系统管理后台;若验证码错误或已过期,提示管理员 “验证码错误或已过期,请重新获取”。同一手机号在 1 小时内获取验证码次数限制为 5 次,超过次数则提示 “获取验证码次数过多,请稍后再试”。
三:设计测试用例
四:功能测试
部分测试界面截图
正常登录
密码格式不正确能进行提示
a'd
五:自动化测试代码
项目目录结构
ChromeBrowser代码
package browserManager;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.time.Duration;
public class ChromeBrowser {
//创建浏览器驱动
public static ChromeDriver getChromeDriver(){
//设置谷歌浏览器驱动
WebDriverManager.chromedriver().setup();
//添加浏览器配置
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--remote-allow-origins=*");//允许任何来源的远程连接
ChromeDriver chromeDriver = new ChromeDriver(chromeOptions);
//添加隐式等待
chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
return chromeDriver;
}
}
CutScreen代码
package browserManager.screenManager;
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.remote.RemoteWebDriver;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
public class CutScreen {//屏幕截图
public static void saveScreen(String methodName , RemoteWebDriver driver) throws IOException {
//设置时间格式
SimpleDateFormat sim1 = new SimpleDateFormat("yyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HH-mm-ss");
String dirTime = sim1.format(System.currentTimeMillis());
String fileTime = sim2.format(System.currentTimeMillis());
String fileName = "./src/test/image/"+dirTime+"/"+methodName+"-"+fileTime+".png";
//截屏
System.out.println("截图路径:"+fileName);
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcFile,new File(fileName));
}
}
RegistSuccess代码
package lotteryRegisty;
import browserManager.ChromeBrowser;
import browserManager.screenManager.CutScreen;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.io.IOException;
import java.time.Duration;
public class RegistSuccess {
//打开浏览器
public static void regist(RemoteWebDriver chromeDriver,String userName,
String mail,String phoneNumber,String password) throws InterruptedException, IOException {
try{
//输入登录网址
chromeDriver.get("http://47.93.243.4:9090/blogin.html");
//找到注册按钮点击
chromeDriver.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();
//在新页面找到姓名输入信息
chromeDriver.findElement(By.cssSelector("#name")).sendKeys(userName);
// ,邮箱,输入信息,
chromeDriver.findElement(By.cssSelector("#mail")).sendKeys(mail);
// 手机号,输入信息,
chromeDriver.findElement(By.cssSelector("#phoneNumber")).sendKeys(phoneNumber);
// 密码,输入信息,
chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
//点击注册按钮
chromeDriver.findElement(By.cssSelector("#registerForm > button")).click();
//注册成功点击弹窗确认按钮
Thread.sleep(2000);
Alert alert = chromeDriver.switchTo().alert();
String alertText = alert.getText();
alert.accept();
if(alertText.contains("注册失败")){
throw new Exception("正常情况下注册失败");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("RegistSuccess/regist", chromeDriver);//传入方法名与驱动
e.printStackTrace();
}
}
}
RegistFail代码
package lotteryRegisty;
import browserManager.screenManager.CutScreen;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.io.IOException;
import java.time.Duration;
public class RegistFail {
private static void commonInput(RemoteWebDriver driver,String userName,
String mail,String phoneNumber,String password){
//在新页面找到姓名输入信息
driver.findElement(By.cssSelector("#name")).sendKeys(userName);
// ,邮箱,输入信息,
driver.findElement(By.cssSelector("#mail")).sendKeys(mail);
// 手机号,输入信息,
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys(phoneNumber);
// 密码,输入信息,
driver.findElement(By.cssSelector("#password")).sendKeys(password);
}
//姓名异常
public static void registNameError(RemoteWebDriver driver,String userName,
String mail,String phoneNumber,String password) throws InterruptedException, IOException {
try{
//输入登录网址
driver.get("http://47.93.243.4:9090/blogin.html");
//点击注册跳转按钮
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();
//输入信息
commonInput(driver,userName,mail,phoneNumber,password);
//点击注册按钮
driver.findElement(By.cssSelector("#registerForm > button")).click();
Thread.sleep(2000);
//注册成功点击弹窗确认按钮
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
alert.accept();
if(alertText.contains("注册成功")){
throw new Exception("用户名格式错误时注册成功");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("RegistFail/registNameError", driver);//传入方法名与驱动
e.printStackTrace();
}
}
//邮箱异常
public static void registMailError(RemoteWebDriver driver,String userName,
String mail,String phoneNumber,String password) throws InterruptedException, IOException {
try{
//输入登录网址
driver.get("http://47.93.243.4:9090/blogin.html");
//点击注册跳转按钮
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();
//输入信息
commonInput(driver,userName,mail,phoneNumber,password);
//点击注册按钮
driver.findElement(By.cssSelector("#registerForm > button")).click();
Thread.sleep(2000);
//注册成功点击弹窗确认按钮
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
alert.accept();
if(alertText.contains("注册成功")){
throw new Exception("邮箱格式错误时注册成功");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("RegistFail/registMailError", driver);//传入方法名与驱动
e.printStackTrace();
}
}
//手机号异常
public static void registPhoneNumberError(RemoteWebDriver driver,String userName,
String mail,String phoneNumber,String password) throws InterruptedException, IOException {
try{
//输入登录网址
driver.get("http://47.93.243.4:9090/blogin.html");
//点击注册跳转按钮
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();
//输入信息
commonInput(driver,userName,mail,phoneNumber,password);
//点击注册按钮
driver.findElement(By.cssSelector("#registerForm > button")).click();
Thread.sleep(2000);
//注册成功点击弹窗确认按钮
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
alert.accept();
if(alertText.contains("注册成功")){
throw new Exception("电话格式错误时注册成功");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("RegistFail/registPhoneNumberError", driver);//传入方法名与驱动
e.printStackTrace();
}
}
//密码异常
public static void registPassWordError(RemoteWebDriver driver,String userName,
String mail,String phoneNumber,String password) throws InterruptedException, IOException {
try{
//输入登录网址
driver.get("http://47.93.243.4:9090/blogin.html");
//点击注册跳转按钮
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();
//输入信息
commonInput(driver,userName,mail,phoneNumber,password);
//点击注册按钮
driver.findElement(By.cssSelector("#registerForm > button")).click();
Thread.sleep(2000);
//注册成功点击弹窗确认按钮
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
alert.accept();
if(alertText.contains("注册成功")){
throw new Exception("密码格式错误时注册成功");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("RegistFail/registPassWordError", driver);//传入方法名与驱动
e.printStackTrace();
}
}
}
LoginSuccess代码
package lotteryLogin;
import browserManager.screenManager.CutScreen;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.io.IOException;
public class LoginSuccess {
public static void phonePasswordLogin(RemoteWebDriver driver, String phoneNumber,String password) throws IOException {
try{
driver.get("http://127.0.0.1:9090/blogin.html");//打开浏览器
//找到对应的输入框
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys(phoneNumber);
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.findElement(By.cssSelector("#loginForm > button")).click();
Thread.sleep(2000);
//如果此时的页面url不包含admin.html,则登录失败
String currentUrl = driver.getCurrentUrl();
System.out.println(currentUrl);
if(!currentUrl.contains("admin.html")){
throw new Exception("登录失败,页面没跳转");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("LoginSuccess/phonePasswordLogin",driver);//传入方法名与驱动
e.printStackTrace();
}
}
}
LoginFail代码
package lotteryLogin;
import browserManager.screenManager.CutScreen;
import org.apache.commons.lang3.StringUtils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.io.IOException;
public class LoginFail {//登录失败场景
public static void pPphoneNumberIsEmpty(RemoteWebDriver driver,String password) throws IOException {
try{
driver.get("http://127.0.0.1:9090/blogin.html");//打开浏览器
//只输入密码
driver.findElement(By.cssSelector("#password")).sendKeys(password);
//点击登录按钮
driver.findElement(By.cssSelector("#loginForm > button")).click();
//看看有没有框边提示
String text = driver.findElement(By.cssSelector("#phoneNumber-error")).getText();
if(StringUtils.isEmpty(text)){
throw new RuntimeException("提示错误");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("LoginFail/phoneNumberIsEmpty", driver);//传入方法名与驱动
e.printStackTrace();
}
}
public static void pPpasswordIsEmpty(RemoteWebDriver driver,String phoneNumber) throws IOException {
try{
driver.get("http://127.0.0.1:9090/blogin.html");//打开浏览器
//只输入手机号
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys(phoneNumber);
//点击登录按钮
driver.findElement(By.cssSelector("#loginForm > button")).click();
//看看有没有框边提示
String text = driver.findElement(By.cssSelector("#password-error")).getText();
if(StringUtils.isEmpty(text)){
throw new RuntimeException("页面提示错误");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("LoginFail/passwordIsEmpty", driver);//传入方法名与驱动
e.printStackTrace();
}
}
public static void pPpassWordIsError(RemoteWebDriver driver,String phoneNumber,String password) throws IOException {
try{
driver.get("http://127.0.0.1:9090/blogin.html");//打开浏览器
//找到对应的输入框
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys(phoneNumber);
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.findElement(By.cssSelector("#loginForm > button")).click();
Thread.sleep(2000);
//登录失败弹窗
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
alert.accept();
if(!alertText.contains("登录失败")){
throw new Exception("密码错误时登录成功");
}
}catch (Exception e){
//截图
CutScreen.saveScreen("LoginSuccess/phonePasswordLogin",driver);//传入方法名与驱动
e.printStackTrace();
}
}
}
Main代码入口
import browserManager.ChromeBrowser;
import lotteryLogin.LoginFail;
import lotteryLogin.LoginSuccess;
import lotteryRegisty.RegistFail;
import lotteryRegisty.RegistSuccess;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws InterruptedException, IOException {
ChromeDriver chromeDriver = ChromeBrowser.getChromeDriver();
RegistSuccess.regist(chromeDriver,"张三","1324566595@qq.com","17564432774","123456");
//姓名为空
RegistFail.registNameError(chromeDriver," ","1324567895@qq.com","17564832774","123456");
//姓名过长
RegistFail.registNameError(chromeDriver,"张fiasdfhdidjosdvmsadovmsdvopsdmvsdpaovmsdpovmsdpvmavasmdvpasmdvsadvms",
"1324467895@qq.com","17564832774","123456");
//邮箱为空
RegistFail.registMailError(chromeDriver,"张三"," ","17564832774","123456");
//邮箱不符合格式规范
RegistFail.registMailError(chromeDriver,"张三","1324567895qq.com","17564832774","123456");
//注册邮箱已存在
RegistFail.registMailError(chromeDriver,"张三","1324567895@qq.com","17564832774","123456");
//手机号为空
RegistFail.registPhoneNumberError(chromeDriver,"张三","1324567895@qq.com"," ","123456");
//手机号不符合格式规范
RegistFail.registPhoneNumberError(chromeDriver,"张三","1324567895@qq.com","1756483277","123456");
//手机号已存在
RegistFail.registPhoneNumberError(chromeDriver,"张三","1324567895@qq.com","17564832774","123456");
//密码为空
RegistFail.registPassWordError(chromeDriver,"张三","1324567895@qq.com","17564832774","");
//密码小于8位
RegistFail.registPassWordError(chromeDriver,"张三","1324567895@qq.com","17564832774","123");
//密码大于20位
RegistFail.registPassWordError(chromeDriver,"张三","1324567895@qq.com","17564832774","12345678912dfsdfsdfdsfdsfdfdfsfsafdsfsfdfdsfdsfdfdfdfdffdsdfsd3456789");
//登录成功
LoginSuccess.phonePasswordLogin(chromeDriver,"15660880523","kangjia456");
//登录失败密码为空
LoginFail.pPpasswordIsEmpty(chromeDriver,"15660880523");
//登录失败手机号为空
LoginFail.pPphoneNumberIsEmpty(chromeDriver,"123456");
//登录失败密码错误
LoginFail.pPpassWordIsError(chromeDriver,"15660880523","123456");
chromeDriver.quit();
}
}
七:遗留风险
高并发场景下性能风险:在本次测试中,模拟的并发用户数有限,未能充分覆盖实际业务中可能出现的高并发场景。当大量用户同时登录时,可能导致接口响应时间延长甚至出现系统崩溃的情况。目前无法确切评估系统在高并发下的性能表现,存在性能瓶颈风险
移动端适配风险:考虑到用户可能通过多种移动设备访问抽奖系统,不同移动设备的屏幕尺寸、操作系统版本及浏览器类型存在较大差异。在本次测试中,仅对部分主流移动设备进行了兼容性测试,对于一些小众或老旧设备,可能存在登录页面显示异常或接口无法正常调用的情况,影响移动端用户的登录体验
八:测试结果评估
功能测试结果:
正常登录功能:在输入正确的用户名和密码后,能够成功登录系统,且登录后的页面跳转及用户权限验证均正常,测试通过。
错误用户名或密码登录:当输入错误的用户名或密码时,系统能够准确提示错误信息,如 “用户名或密码错误”,测试通过。
验证码验证功能:在登录过程中,输入正确的验证码能够正常登录,输入错误的验证码则提示 “验证码错误”,,测试通过。
共执行功能测试用例 [17] 个,其中通过 [17] 个,未通过 [0] 个,功能测试通过率为 [100]%。
总结:
本次抽奖系统登录接口测试在功能、性能和安全性方面均取得了一定的成果。功能测试验证了接口的基本功能能够正常运行,性能测试发现了系统在高并发场景下的性能瓶颈,安全性测试未检测到常见的安全漏洞。总体而言,系统已具备一定的可用性,但仍存在一些需要改进和优化的地方。