目录
1.项目简介:
1.1项目介绍:
通过管理员用户管理活动,人员,奖品,对普通用户进行抽奖操作
该项目采用前后端分离开发方式,前端使用HTML,JS,CSS,AJAX技术,后端采用Java,SpringBoot开发,使用MYSQL作为数据存储,Redis作为缓存,RabbitMQ处理异步接口
1.2项目源码:
Spring学习过程: Spring等学习过程 - Gitee.com
1.3网页界面:
登录页面:
注册页面:
主页面:
抽奖页面:
2.功能测试用例:
3.自动化测试:
使用工具:Selenium
测试代码:测试code: 测试有关代码,包含自动化测试相关内容,Selenium,Junit,测试套件等 - Gitee.com
准备工作:
准备一个类,作为后续自动化功能测试,模块测试类的父类,处理一些共同的工作,如下:
1.获取浏览器驱动对象
2.测试结束后关闭浏览器
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;
/**
* @author yizhuo
*/
public class InitAndEnd {
protected static WebDriver webDriver = null;
@BeforeAll
//初始化
static void initialize(){
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
webDriver = new ChromeDriver(options);
}
@AfterAll
//结束化
static void finalization(){
webDriver.quit();
}
}
3.1登录功能
登录成功
使用正确的电话号码与密码进行登录测试
电话:13188888690
密码:zyz040318
@Order(1)
@ParameterizedTest
@CsvSource(value = {"13188888690,zyz040318"})
//登录成功
void loginSuccess(String phone,String password) throws InterruptedException {
//进入登录页面
webDriver.get("http://110.42.230.246:9090/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(3000);
}
抽奖系统自动化测试-登录成功
登录失败
使用错误的密码进行登录
电话:13188888690
密码:errorError
@Order(2)
@ParameterizedTest
@CsvSource(value = {"13188888690,errorError"})
//登录失败
void loginFailed(String phone,String password) throws InterruptedException {
//进入登录页面
webDriver.get("http://110.42.230.246:9090/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(3000);
}
抽奖系统自动化测试-登录失败
异常登录
保持电话号码与密码栏位空,观察是否有提示
@Order(3)
@Test
void loginError() throws InterruptedException {
//进入登录页面
webDriver.get("http://110.42.230.246:9090/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);
}
抽奖系统自动化测试-异常登录
该部分完整代码:
package test;
import common.InitAndEnd;
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;
/**
* @author yizhuo
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Login extends InitAndEnd {
@Order(1)
@ParameterizedTest
@CsvSource(value = {"13188888690,zyz040318"})
//登录成功
void loginSuccess(String phone,String password) throws InterruptedException {
//进入登录页面
webDriver.get("http://110.42.230.246:9090/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(3000);
}
@Order(2)
@ParameterizedTest
@CsvSource(value = {"13188888690,errorError"})
//登录失败
void loginFailed(String phone,String password) throws InterruptedException {
//进入登录页面
webDriver.get("http://110.42.230.246:9090/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(3000);
}
@Order(3)
@Test
void loginError() throws InterruptedException {
//进入登录页面
webDriver.get("http://110.42.230.246:9090/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);
}
}
3.2.人员模块
准备工作:
因为人员模块的功能是登录后才能使用的,而且为了让每个测试用例能独立运行,需要在该模块内让每个测试用例都要先进行登录,那么可以将这部分独立出来:
@BeforeEach
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("13188888690","zyz040318");
}
因为该模块在主页面内部,是嵌套在主页面的一个iFrame中,所以我们把进出iFrame的步骤也独立出来:
/**
* 这里的id是iFrame的id,注意是不带#的
* 在复制css选择器的时候需要手动去除#
* @param id
*/
private void inIFrame(String id){
webDriver.switchTo().frame(id);
}
private void outIFrame(){
webDriver.switchTo().defaultContent();
}
查看人员列表:
@Test
void checkUserList() throws InterruptedException {
//点击人员列表按钮
webDriver.findElement(By.cssSelector("#userList")).click();
sleep(3000);
//进入iFrame
inIFrame("contentFrame");
//获取标题
String title = webDriver.findElement(By.cssSelector("body > div > h2")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("人员列表",title);
//获取第一个用户的名字
String name = webDriver.findElement(By
.cssSelector("#userList > tr:nth-child(1) > td:nth-child(2)"))
.getText();
System.out.println("userName: " + name);
Assertions.assertEquals("黄维",name);
//退出iFrame
outIFrame();
}
抽奖系统自动化测试-查看人员列表
注册人员成功:
@ParameterizedTest
@CsvSource(value = {"铁若男,13188888682,13188888682@qq.com"})
@Order(1)
void registerSuccess(String name,String phone,String mail) throws InterruptedException {
//点击注册用户按钮
webDriver.findElement(By.cssSelector("#register")).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("#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(3000);
//
String text = webDriver.switchTo().alert().getText();
System.out.println("alertTet: " + text);
Assertions.assertEquals("注册成功",text);
webDriver.switchTo().alert().accept();
sleep(3000);
outIFrame();
}
抽奖系统自动化测试-注册成功
该部分完整代码:
package test;
import common.InitAndEnd;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import java.lang.ref.PhantomReference;
import static java.lang.Thread.sleep;
/**
* @author yizhuo
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class User extends InitAndEnd {
@BeforeEach
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("13188888690","zyz040318");
}
/**
* 这里的id是iFrame的id,注意是不带#的
* 在复制css选择器的时候需要手动去除#
* @param id
*/
private void inIFrame(String id){
webDriver.switchTo().frame(id);
}
private void outIFrame(){
webDriver.switchTo().defaultContent();
}
@ParameterizedTest
@CsvSource(value = {"铁若男,13188888682,13188888682@qq.com"})
@Order(1)
void registerSuccess(String name,String phone,String mail) throws InterruptedException {
//点击注册用户按钮
webDriver.findElement(By.cssSelector("#register")).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("#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(3000);
//
String text = webDriver.switchTo().alert().getText();
System.out.println("alertTet: " + text);
Assertions.assertEquals("注册成功",text);
webDriver.switchTo().alert().accept();
sleep(3000);
outIFrame();
}
@Test
@Order(2)
void checkUserList() throws InterruptedException {
//点击人员列表按钮
webDriver.findElement(By.cssSelector("#userList")).click();
sleep(3000);
//进入iFrame
inIFrame("contentFrame");
//获取标题
String title = webDriver.findElement(By.cssSelector("body > div > h2")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("人员列表",title);
//获取第一个用户的名字
String name = webDriver.findElement(By
.cssSelector("#userList > tr:nth-child(1) > td:nth-child(2)"))
.getText();
System.out.println("userName: " + name);
Assertions.assertEquals("黄维",name);
//退出iFrame
outIFrame();
}
}
3.3奖品模块
准备工作:
因为人员模块的功能是登录后才能使用的,而且为了让每个测试用例能独立运行,需要在该模块内让每个测试用例都要先进行登录,那么可以将这部分独立出来:
@BeforeEach
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("13188888690","zyz040318");
}
因为该模块在主页面内部,是嵌套在主页面的一个iFrame中,所以我们把进出iFrame的步骤也独立出来:
/**
* 这里的id是iFrame的id,注意是不带#的
* 在复制css选择器的时候需要手动去除#
* @param id
*/
private void inIFrame(String id){
webDriver.switchTo().frame(id);
}
private void outIFrame(){
webDriver.switchTo().defaultContent();
}
查看奖品列表
@Order(2)
@Test
void checkPrizeList() throws InterruptedException {
//点击奖品列表按钮
webDriver.findElement(By
.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(1) > 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);
//获取第一个奖品的名字
String name = webDriver.findElement(By.cssSelector("#prizeList > tr:nth-child(1) > td:nth-child(3)")).getText();
System.out.println("name: " + name);
Assertions.assertEquals("三转书虫",name);
outIFrame();
}
抽奖系统自动化测试-查看奖品列表
添加奖品成功
@Order(1)
@ParameterizedTest
@CsvSource(value = {"七转招灾蛊虫,C:\\Users\\dzhan\\Desktop\\图片\\抽奖系统用图\\抽奖系统实例图片\\七转招灾蛊.png,7000,七转运道仙蛊,此蛊能够替蛊仙招灾引难,将地灾天劫脱离原来的目标,勾连到自己的身上。"})
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(3000);
//点击创建奖品
webDriver.findElement(By.cssSelector("body > div > button")).click();
sleep(3000);
//
String text = webDriver.switchTo().alert().getText();
System.out.println("alertText: " + text);
Assertions.assertEquals("奖品创建成功!",text);
webDriver.switchTo().alert().accept();
sleep(3000);
outIFrame();
}
抽奖系统自动化测试-创建奖品成功
该部分完整代码
package test;
import common.InitAndEnd;
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;
/**
* @author yizhuo
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Prize extends InitAndEnd {
@BeforeEach
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("13188888690","zyz040318");
}
/**
* 这里的id是iFrame的id,注意是不带#的
* 在复制css选择器的时候需要手动去除#
* @param id
*/
private void inIFrame(String id){
webDriver.switchTo().frame(id);
}
private void outIFrame(){
webDriver.switchTo().defaultContent();
}
@Order(1)
@ParameterizedTest
@CsvSource(value = {"七转招灾蛊虫,C:\\Users\\dzhan\\Desktop\\图片\\抽奖系统用图\\抽奖系统实例图片\\七转招灾蛊.png,7000,七转运道仙蛊,此蛊能够替蛊仙招灾引难,将地灾天劫脱离原来的目标,勾连到自己的身上。"})
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(3000);
//点击创建奖品
webDriver.findElement(By.cssSelector("body > div > button")).click();
sleep(3000);
//
String text = webDriver.switchTo().alert().getText();
System.out.println("alertText: " + text);
Assertions.assertEquals("奖品创建成功!",text);
webDriver.switchTo().alert().accept();
sleep(3000);
outIFrame();
}
@Order(2)
@Test
void checkPrizeList() throws InterruptedException {
//点击奖品列表按钮
webDriver.findElement(By
.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(1) > 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);
//获取第一个奖品的名字
String name = webDriver.findElement(By.cssSelector("#prizeList > tr:nth-child(1) > td:nth-child(3)")).getText();
System.out.println("name: " + name);
Assertions.assertEquals("三转书虫",name);
outIFrame();
}
}
3.4活动模块
准备工作
因为人员模块的功能是登录后才能使用的,而且为了让每个测试用例能独立运行,需要在该模块内让每个测试用例都要先进行登录,那么可以将这部分独立出来:
/**
* 因为查看分享结果测试用例需要再未登录的环境下进行
* 所以该方法,就不用@BeforeEach修饰了
* @throws InterruptedException
*/
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("13188888690","zyz040318");
}
因为该模块在主页面内部,是嵌套在主页面的一个iFrame中,所以我们把进出iFrame的步骤也独立出来:
/**
* 这里的id是iFrame的id,注意是不带#的
* 在复制css选择器的时候需要手动去除#
* @param id
*/
private void inIFrame(String id){
webDriver.switchTo().frame(id);
}
private void outIFrame(){
webDriver.switchTo().defaultContent();
}
查看活动列表
@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<String> 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://110.42.230.246:9090/draw.html?activityName=%E5%8C%97%E5%8E%9F%E6%8B%8D%E5%8D%96%E5%A4%A7%E4%BC%9A&activityId=24&valid=false");
sleep(3000);
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();
}
抽奖系统自动化测试-分享中奖结果
查看抽奖页面
@Order(5)
@Test
void checkLottery() throws InterruptedException {
//进入活动列表页面
Activity activity = new Activity();
activity.checkActivityList();
inIFrame("contentFrame");
//进入抽奖页面
webDriver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a")).click();
//切换到抽奖页
Set<String> 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("#title")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("赌石坊抽奖活动",title);
webDriver.switchTo().window(handle);
outIFrame();
}
抽奖系统自动化测试-查看抽奖页面
创建活动成功
@Order(1)
@Test
void createActivity() throws InterruptedException {
login();
//点击新建抽奖活动按钮
webDriver.findElement(By.cssSelector("#createActivity")).click();
sleep(3000);
inIFrame("contentFrame");
sleep(3000);
//填写信息
webDriver.findElement(By.cssSelector("#activityName")).sendKeys("东海玉露晚会");
webDriver.findElement(By.cssSelector("#description")).sendKeys("方源为摆脱仙僵之身,跟随太白云生前往东海和鲨魔,苏白曼等人攻略乐土仙尊座下玉露仙子的玉露福地后举行的晚会");
//圈选奖品
webDriver.findElement(By.cssSelector("#buttonPrizes")).click();
webDriver.findElement(By.cssSelector("#prize-25")).click();
Select select1 = new Select(webDriver.findElement(By.cssSelector("#prizesContainer > div:nth-child(1) > select")));
select1.selectByValue("FIRST_PRIZE");
webDriver.findElement(By.cssSelector("#prize-24")).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-49")).click();
webDriver.findElement(By.cssSelector("#user-48")).click();
webDriver.findElement(By.cssSelector("#user-47")).click();
//点击确定
webDriver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();
//点击创建
webDriver.findElement(By.cssSelector("#createActivity")).click();
sleep(3000);
String tip = webDriver.switchTo().alert().getText();
System.out.println("alertText: " + tip);
Assertions.assertEquals("创建成功!",tip);
webDriver.switchTo().alert().accept();
sleep(3000);
outIFrame();
}
抽奖系统自动化测试-创建活动成功
该部分完整代码
package test;
import common.InitAndEnd;
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;
/**
* @author yizhuo
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Activity extends InitAndEnd {
/**
* 因为查看分享结果测试用例需要再未登录的环境下进行
* 所以该方法,就不用@BeforeEach修饰了
* @throws InterruptedException
*/
void login() throws InterruptedException {
Login login = new Login();
login.loginSuccess("13188888690","zyz040318");
}
/**
* 这里的id是iFrame的id,注意是不带#的
* 在复制css选择器的时候需要手动去除#
* @param id
*/
private void inIFrame(String id){
webDriver.switchTo().frame(id);
}
private void outIFrame(){
webDriver.switchTo().defaultContent();
}
@Order(1)
@Test
void createActivity() throws InterruptedException {
login();
//点击新建抽奖活动按钮
webDriver.findElement(By.cssSelector("#createActivity")).click();
sleep(3000);
inIFrame("contentFrame");
sleep(3000);
//填写信息
webDriver.findElement(By.cssSelector("#activityName")).sendKeys("东海玉露晚会");
webDriver.findElement(By.cssSelector("#description")).sendKeys("方源为摆脱仙僵之身,跟随太白云生前往东海和鲨魔,苏白曼等人攻略乐土仙尊座下玉露仙子的玉露福地后举行的晚会");
//圈选奖品
webDriver.findElement(By.cssSelector("#buttonPrizes")).click();
webDriver.findElement(By.cssSelector("#prize-25")).click();
Select select1 = new Select(webDriver.findElement(By.cssSelector("#prizesContainer > div:nth-child(1) > select")));
select1.selectByValue("FIRST_PRIZE");
webDriver.findElement(By.cssSelector("#prize-24")).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-49")).click();
webDriver.findElement(By.cssSelector("#user-48")).click();
webDriver.findElement(By.cssSelector("#user-47")).click();
//点击确定
webDriver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();
//点击创建
webDriver.findElement(By.cssSelector("#createActivity")).click();
sleep(3000);
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<String> 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://110.42.230.246:9090/draw.html?activityName=%E5%8C%97%E5%8E%9F%E6%8B%8D%E5%8D%96%E5%A4%A7%E4%BC%9A&activityId=24&valid=false");
sleep(3000);
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();
}
@Order(5)
@Test
void checkLottery() throws InterruptedException {
//进入活动列表页面
Activity activity = new Activity();
activity.checkActivityList();
inIFrame("contentFrame");
//进入抽奖页面
webDriver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a")).click();
//切换到抽奖页
Set<String> 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("#title")).getText();
System.out.println("title: " + title);
Assertions.assertEquals("赌石坊抽奖活动",title);
webDriver.switchTo().window(handle);
outIFrame();
}
}
3.5测试结果
场景 | 方法 | 结果 | 备注 |
登录成功 | loginSuccess | 通过 | 登录成功跳转到主页面 |
登录失败 | loginFailed | 通过 | 登录失败提示错误 |
异常登录 | loginError | 通过 | 异常登录提示语法 |
查看人员列表 | checkUserList | 通过 | 查看人员列表正确 |
注册人员成功 | registerSuccess | 通过 | 注册成功跳转到人员列表页 |
查看奖品列表 | checkPrizeList | 通过 | 查看奖品列表正确 |
添加奖品成功 | createPrizeSuccess | 通过 | 添加奖品成功提示 |
查看活动列表 | checkActivityList | 通过 | 查看活动列表正确 |
查看中奖名单 | checkWinnerList | 通过 | 查看中奖名单正确 |
分享中奖结果 | shareWinnerList | 通过 | 未登录查看分享结果 |
查看抽奖页面 | checkLottery | 通过 | 查看抽奖页面正确 |
创建活动成功 | createActivity | 通过 | 创建活动成功 |
4.性能测试:
4.1线程设置:
设置一共20个线程,每3秒在1秒内启动5个线程,全部启动后运行60秒,运行结束后每1秒结束5个线程
4.2聚合报告:
测试的接口测试数量都在3500次左右,次数数量较多
整体来看接收与发送kb/s在正常范围内,在该线程较少的情况下没有明显的网络瓶颈
获取奖品列表和获取活动详细信息的响应时间明显比其他接口的响应时间长,但吞吐量差距不大
而且错误率较低为0.19%,整体比较稳定
4.3吞吐量:
吞吐量在全部线程启动后,基本在47左右,整体平均在281.5,表明系统每秒能处理281个请求
但是稳定性有点差,不是很稳定,可能与网络波动有关
4.4响应时间:
从图像来看,所用接口的响应时间明显是获取活动列表与获取活动详细信息这两个接口的响应时间折线在其他接口折线之上,这两个接口的响应时间明显要高
所有接口的平均响应时间与中位数差距较大,表明响应时间波动较大
90%的响应时间在41~293之间
95%的响应时间在63~321之间
99%的响应时间在320~811之间
明显差距较大,进一步表明网络波动很大,最好更换网络条件
4.5生成一份性能测试报告:
5.总结:
5.1功能方面
功能方面较为稳定,所有接口都可以正常工作,手工测试与自动化测试都能正常运行,没有错误产生
5.2性能方面
经过性能测试,发现测试时使用的网络条件较差,波动幅度较大,建议更换网络条件,保证网络环境较好的情况下再进行一次测试
同时建议提升本端硬件性能,以方便使用更多的线程进行性能测试