目录
一:项目背景
二:项目功能
(1) 注册功能
(2) 登录功能
电话 + 密码登录
电话 + 短信登录
三:设计测试用例
四:功能测试
五:自动化测试代码
七:遗留风险
八:测试结果评估
一:项目背景
在市场竞争白热化的当下,企业与商家亟需不断推陈出新,打造新颖的营销手段,以此抓住消费者的目光。传统营销模式渐显疲态,消费者对千篇一律的促销活动已然产生审美疲劳。抽奖作为一种极具吸引力的营销手段,能够迅速激发消费者的参与热情。通过设置丰富多样的奖品,如现金红包、优惠券、实物礼品等,不仅能提升消费者在购物过程中的乐趣,增强其对品牌的好感度,还能显著促进销售额的增长。以电商平台的促销活动为例,抽奖系统作为关键的互动环节,能吸引用户浏览商品页面,延长用户在平台的停留时长,有效提高商品的曝光率与销售量
二:项目功能
(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]%。
总结:
本次抽奖系统登录接口测试在功能、性能和安全性方面均取得了一定的成果。功能测试验证了接口的基本功能能够正常运行,性能测试发现了系统在高并发场景下的性能瓶颈,安全性测试未检测到常见的安全漏洞。总体而言,系统已具备一定的可用性,但仍存在一些需要改进和优化的地方。