目录
一、项目介绍
二、测试计划
1、功能测试
(1)测试环境:
(2)测试用例编写
(3)部分功能测试
2、自动化测试
注册页面测试
验证注册成功的情况
验证注册失败的情况
登录界面测试
登录成功测试
登录失败测试
显示博客列表测试
未登录状态下测试
登录状态下测试
发布帖子测试
未登录状态下测试
登录后测试
帖子详情页测试
未登录状态下
登录状态下
删除帖子测试
登录状态下测试
个人中心显示
未登录测试
登录状态下测试
显示个人信息并修改
未登录测试
登录显示个人信息测试
登录后修改昵称测试
登录后修改密码测试
退出测试
3、性能测试
对登录界面进行性能测试。
VUG录制脚本
使用Controller
生成测试报告
基于Spring前后端分离的博客论坛系统,实现了注册、登录、显示帖子、编辑帖子、删除帖子、回复帖子、点赞帖子,修改个人信息等功能,并将其部署到云服务器上。
要点:
1、使用统⼀返回格式+全局错误信息定义处理前后端交互时的返回结果;
2、使用@ControllerAdvice+@ExceptionHandler实现全局异常处理;
3、使用拦截器实现用户登录校验;
4、集成Swagger实现⾃动⽣成API测试接口;5、对密码进行加密处理。
访问地址:http://124.71.152.247:8081/sign-in.html
操作系统:Windows 10家庭版
项目运行环境:IIntelliJ IDEA Community Edition 2022.1.4、JDK1.8、MySQL5.7
浏览器:Chorme、Edge、FireFox、QQ浏览器
自动化脚本环境:IIntelliJ IDEA Community Edition 2022.1.4
访问链接:http://124.71.152.247:8081/index.html
测试技术: 主要手工进行单元测试和自动化测试
测试人员: 本人
功能测试:
非功能测试点:
对注册页面进行的测试
场景1:输入用户名存在,密码与确认密码一致,点击注册
预期结果:提示用户已经存在
实际结果:提示用户已经存在,与预期结果一致。
预期结果:注册成功,跳转回登录界面
实际结果:注册成功,跳转回登录界面,与预期结果一致。
对登录页面进行的测试
场景1:输入用户名存在,密码与确认密码一致,点击登录
预期结果:登录成功,跳转到首页博客列表页面
场景2:输入用户名存在,密码与确认密码不一致,点击登录
预期结果:登录失败,给出错误提示
实际结果:登录失败,给出错误提示。
对首页进行的测试
场景1:未登录状态下,点击首页
预期结果:跳转回登录界面
实际结果:跳转回登录界面,与预期结果一致。
场景2:登录状态下,点击“首页”
预期结果:导航栏显示所有的版块名,下方显示所有帖子列表,右上方显示登录用户信息。
实际结果:与预期结果一致。
场景3:登录状态下,点击导航栏处的版块名“C++”
预期结果:下方显示C++名称,该版块下的帖子数量,版块下的所有帖子列表,右上方显示登录用户信息。
实际结果:与预期结果一致。
场景4:登录状态下,在搜索框输入关键字“数据库”搜索
预期结果:下方显示帖子正文中所有存在“数据库”这三个字的帖子;
实际结果:刷新回到首页界面,与预期不符。不支持搜索功能。
场景5:登录状态下,点击“月亮”按钮
预期结果:进入夜间模式的切换
实际结果:进入夜间模式的切换,与预期相符。
场景6:登录状态下,点击“发布帖子”按钮
预期结果:进入博客编辑页面,版块名默认选择Java
实际结果:与预期相符。
......
对编辑页面进行的测试
场景1:未登录状态下,进入编辑页面
预期结果:跳转回登录界面
实际结果:跳转回登录界面,与预期结果一致。
场景2:登录状态下,不输入帖子标题,输入帖子内容,点击发布
预期结果:给出提示:请输入帖子标题
实际结果:与预期相符。
场景3:登录状态下,输入帖子标题,不输入帖子内容,点击发布
预期结果:给出提示:请输入帖子内容
实际结果:与预期相符。
场景4:登录状态下,输入帖子标题,输入帖子内容,点击发布
预期结果:编辑成功,跳转回首页,最上方显示刚发布的帖子信息
实际结果:与预期相符。
......
对帖子详情页面进行的测试
场景1:未登录状态下,点击首页下的任意一条帖子内容
预期结果:跳转回登录界面
实际结果:跳转回登录界面,与预期结果一致。
场景2:登录状态下,点击首页下的一条帖子内容“西安”
预期结果:跳转到该帖子详情页面
实际结果:与预期相符。
场景3:登录状态下,点击首页下的一条帖子内容“西安”(帖子作者“小狐狸”,当前登录作者“小星星”)
预期结果:跳转到该帖子详情页面,最上方显示帖子信息,左侧显示帖子作者信息,下方显示该帖子的内容,下方只显示点赞按钮。
实际结果:与预期相符。
场景4:登录状态下,下方点赞按钮
预期结果:上方显示的点赞数加1
实际结果:与预期相符。
场景5:登录状态下,点击首页下的一条帖子内容“123”(帖子作者“小星星”,当前登录作者“小星星”)
预期结果:跳转到该帖子详情页面,最上方显示帖子信息,左侧显示帖子作者信息,下方显示该帖子的内容,下方显示点赞按钮,删除按钮、编辑按钮。
实际结果:与预期相符。
场景6:登录状态下,点击首页下的一条帖子内容“123”,观察访问数变化
预期结果:跳转到该帖子详情页面,最上方显示帖子信息中的访问数+1
实际结果:与预期相符。
场景7:登录状态下,点击发私信按钮,不输入文本内容,点击“发送”
预期结果:给出警告提示:请输入要发送的内容
实际结果:与预期相符。
场景8:登录状态下,点击发私信按钮,输入文本内容,点击“发送”
预期结果:给出成功提示,发送成功
实际结果:与预期相符。
场景9:登录状态下,在下方的回复框中不输入文本内容,点击“回复”
预期结果:给出警告提示,请输入回复内容
实际结果:与预期相符。
场景10:登录状态下,在下方的回复框中输入文本内容,点击“回复”
预期结果:给出成功提示,同时下方显示回复内容。
实际结果:与预期相符。
......
对个人中心页面进行的测试
场景1:未登录状态下,点击首页下的任意一条帖子内容
预期结果:跳转回登录界面
实际结果:跳转回登录界面,与预期结果一致。
场景2:登录状态下,点击“我的帖子”
预期结果:下方显示该登录用户的所有帖子信息
实际结果:与预期相符。
场景3:登录状态下,点击“个人中心”
预期结果:下方显示该登录用户的所有信息
实际结果:与预期相符。
场景4:登录状态下,“修改头像”
预期结果:打开 电脑,上传本地图片并更新头像。
实际结果:打开电脑,上传本地图片,但是没有反应。与预期不符。(不支持修改头像)
场景5:登录状态下,“修改昵称”
预期结果:输入修改后的昵称,并刷新成功
实际结果:与预期一致。
场景5:登录状态下,“修改密码”:原密码错误,新密码和确认密码一致,点击修改密码
预期结果:给出警告提示:原密码有误。
实际结果:输出后端具体代码信息,与预期不一致。
场景6:登录状态下,“修改密码”:原密码正确,新密码和确认密码不一致,点击修改密码
预期结果:给出警告提示:两次输入的密码不一致。
实际结果:与预期一致。
场景7:登录状态下,“修改密码”:原密码正确,新密码和确认密码一致,点击修改密码
预期结果:跳转回登录界面,要求重新登录
实际结果:与预期一致。
......
这里只给出部分测试,其他功能测试就不一一展示了。
场景1:注册用户名在数据库不存在,昵称,两次密码一致,注册成功,跳转回登录界面。
/**
* 场景1:不存在的用户名,昵称,两次密码一致
*/
@Order(1)
@ParameterizedTest
@CsvSource(value = "apple,apple,123,123")
void Register(String username, String nickname,String password1,String password2) throws InterruptedException, IOException {
// 打开注册页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
//点击注册按钮
webDriver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入昵称
webDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password1);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 确认密码
webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(password2);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//点击复选框
webDriver.findElement(By.cssSelector("#policy")).click();
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(1000); // 显示等待
// 注册成功之后,判断是否会跳转回登录界面
String expect = "http://124.71.152.247:8081/sign-in.html";
String actual = webDriver.getCurrentUrl();
// 进行截图,看当前是否跳转到了登录界面
webDriver.manage().timeouts().implicitlyWait(300, TimeUnit.MINUTES);
Assertions.assertEquals(expect, actual);
System.out.println("注册成功");
// 进行截图,看当前是否跳转到了登录界面
// 程序执行的速度和页面渲染的速度
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "RegisterTest.png";
FileUtils.copyFile(srcFile, new File(fileName));
Thread.sleep(1000); // 显示等待
//因为我们要测试多个账号,所有在一个账号检测完了后,还需要回退到登录界面
webDriver.navigate().back();
}
场景2:注册用户名在数据库存在,昵称,两次密码一致,注册失败,获取警告框信息。
代码同上。测试结果
场景1:测试用户名正确,密码正确,登录成功
/**
* 场景1:用户名和密码都正确
*/
@Order(1)
@ParameterizedTest
@CsvSource(value = "cherry, 123")
void Login1(String username, String password) throws InterruptedException, IOException {
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
Thread.sleep(1000); // 显示等待,等待弹窗出现
// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到博客列表页
String expect = "http://124.71.152.247:8081/index.html";
String actual = webDriver.getCurrentUrl();//
// // 进行截图,看当前是否跳转到了登录界面
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect, actual); // 查看当前的url是否在博客详情页面
// 进行截图,看当前是否跳转到了登录界面
// 程序执行的速度和页面渲染的速度
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "loginTest.png";
FileUtils.copyFile(srcFile, new File(fileName));
Thread.sleep(1000); // 显示等待,等待弹窗出现
//因为我们要测试多个账号,所有在一个账号检测完了后,还需要回退到登录界面
webDriver.navigate().back();
}
场景2:测试用户名正确,密码错误,登录失败
@Order(2)
@ParameterizedTest
@CsvSource(value = "cherry1, 123")
void Login2(String username, String password) throws InterruptedException, IOException {
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
Thread.sleep(1000);
String msg = webDriver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div")).getText();
System.out.println(msg);
}
场景1:未登录状态下进入博客列表页,直接跳转回登录界面。测试通过。
/**
* 场景1:未登录状态下,进入博客列表页,是否跳转回登录页面
*/
@Order(1)
@Test
void BlogList1() throws InterruptedException, IOException {
//1-不登录,直接打开博客显示列表页
webDriver.get("http://124.71.152.247:8081/index.html");
//获取当前的url地址
String expect = "http://124.71.152.247:8081/sign-in.html";
String actual = webDriver.getCurrentUrl();
//判断是否跳转到登录界面
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect, actual);
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "BlogListFailed.png";
FileUtils.copyFile(srcFile, new File(fileName));
}
未登录,直接跳转回登录界面
场景2:登录后进入博客列表页,查看“首页”元素是否存在,查看是否含有“发布帖子”按钮。
/**
* 场景2:登录状态下,进入博客列表页,是否正确显示帖子相应的控件信息
*/
@Order(2)
@ParameterizedTest
@CsvSource(value = "cherry, 123")
void BlogList2(String username, String password) throws InterruptedException, IOException {
//1-登录
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
//2-查看页面的文本内容显示是否正确
String expect1 = "首页";
System.out.println();
String actual1 = webDriver.findElement(By.cssSelector("#nav_board_index > a > span.nav-link-title")).getText();
Assertions.assertEquals(expect1, actual1); // 断言
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "BlogListSuccess.png";
FileUtils.copyFile(srcFile, new File(fileName));
//3-查看是否有发布帖子按钮,并点击
webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
Thread.sleep(1000);
//查看是否跳转到博客编辑页面
String expectUrl = "http://124.71.152.247:8081/index.html";
String actualUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(expectUrl, actualUrl); // 断言
System.out.println("跳转到边界帖子页面");
}
场景1:未登录状态下发布帖子,直接跳转回登录界面。
/**
* 场景1:未登录状态下,是否跳转回登录页面
*/
@Order(1)
@Test
void WriteBlog1() throws InterruptedException, IOException {
//1-不登录,直接打开博客编辑页
webDriver.get("http://124.71.152.247:8081/index.html");
//获取当前的url地址
String expect = "http://124.71.152.247:8081/sign-in.html";
String actual = webDriver.getCurrentUrl();
//判断是否跳转到登录界面
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect, actual);
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "WriteBlogFailed.png";
FileUtils.copyFile(srcFile, new File(fileName));
}
场景2:登录后,输入帖子标题,不输入帖子内容,点击发布按钮,给出提示信息。
/**
* 场景2:登录状态下
*/
@Order(2)
@ParameterizedTest
@CsvSource(value = "cherry, 321")
void WriteBlog2(String username, String password) throws InterruptedException, IOException {
//1-登录
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
//场景2:输入标题,内容为空,点击发布帖子按钮,获取警告信息
//2-点击 发布帖子按钮#article_post_submit
webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
//场景1:输入标题
webDriver.findElement(By.cssSelector("#article_post_title")).sendKeys("标题");
Thread.sleep(1000);
//不输入内容
//点击提交按钮
webDriver.findElement(By.cssSelector("#article_post_submit")).click();
//获取警告框信息
System.out.println(webDriver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div")).getText());
// 截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "WriteBlogFailed.png";
FileUtils.copyFile(srcFile, new File(fileName));
}
场景1:未登录状态下,进入帖子详情页,直接跳转回登录界面。
/**
* 场景1:未登录状态下,进入博客详情页,是否跳转回登录页面
*/
@Order(1)
@Test
void BlogDetail1() throws InterruptedException, IOException {
//1-不登录,直接打开博客详情页
webDriver.get("http://124.71.152.247:8081/index.html");
//获取当前的url地址
String expect = "http://124.71.152.247:8081/sign-in.html";
String actual = webDriver.getCurrentUrl();
//判断是否跳转到登录界面
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect, actual);
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "BlogListFailed.png";
FileUtils.copyFile(srcFile, new File(fileName));
}
/**
* 场景2:登录状态下,进入博客详情页,是否正确显示对应帖子的信息
*/
@Order(2)
@ParameterizedTest
@CsvSource(value = "cherry, 123")
void BlogList2(String username, String password) throws InterruptedException, IOException {
//1-登录
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(5000);
// 2-场景1:点击帖子内容"西安",博客作者与登录作者不一致,只显示点赞按钮
webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(3) > div > div.col > div.text-truncate > a > strong")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
//是否跳转到 帖子详情页
//获取当前的url地址
String expect = "http://124.71.152.247:8081/index.html";
String actual = webDriver.getCurrentUrl();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect, actual);
//帖子详情页是否含有 帖子 标题
System.out.println(webDriver.findElement(By.cssSelector("#details_article_content_title")).getText());
Thread.sleep(5000);
//帖子内容
System.out.println(webDriver.findElement(By.cssSelector("#h1-u897Fu5B89u5927u5510u4E0Du591Cu57CE")).getText());
Thread.sleep(1000);
//帖子作者
System.out.println(webDriver.findElement(By.cssSelector("#article_details_author_name")).getText());
Thread.sleep(1000);
//点赞按钮
webDriver.findElement(By.cssSelector("#details_btn_like_count")).click();
Thread.sleep(1000);
// 截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "BlogDetailSuccess1.png";
FileUtils.copyFile(srcFile, new File(fileName));
//2-场景2:点击帖子内容"测试",博客作者与登录作者一致,显示点赞按钮、编辑按钮,删除按钮
// webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
// webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
// //是否跳转到 帖子详情页
// //获取当前的url地址
// String expect2 = "http://124.71.152.247:8081/index.html";
// String actual2 = webDriver.getCurrentUrl();
// webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Assertions.assertEquals(expect2, actual2);
// //帖子详情页是否含有 帖子 标题
// System.out.println(webDriver.findElement(By.cssSelector("#details_article_content_title")).getText());
// Thread.sleep(1000);
// //帖子内容
// System.out.println(webDriver.findElement(By.cssSelector("#details_article_content > p")).getText());
// Thread.sleep(1000);
// //帖子作者
// System.out.println(webDriver.findElement(By.cssSelector("#article_details_author_name")).getText());
// Thread.sleep(1000);
// //点赞按钮
// webDriver.findElement(By.cssSelector("#details_btn_like_count")).click();
// //编辑按钮
// webDriver.findElement(By.cssSelector("#details_artile_edit"));
// //删除按钮
// webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div:nth-child(1) > div.col-9.card.card-lg > div.card-footer.bg-transparent.mt-auto.justify-content-end > div > div:nth-child(3) > div > a"));
// Thread.sleep(1000);
// System.out.println("测试成功2");
//
// //截图
// File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
// String fileName = "BlogDetailSuccess2.png";
// FileUtils.copyFile(srcFile, new File(fileName));
}
场景1:登录后,登录用户与帖子作者不一致,获取帖子标题、帖子内容、帖子作者、点赞按钮。
场景2:登录后,登录用户与帖子作者一致,获取帖子标题、帖子内容、帖子作者、点赞按钮、编辑按钮、删除按钮。
场景:登录后,进入帖子详情页,点击删除按钮,删除帖子成功,成功跳转回帖子列表页面。
/**
* 场景2:登录状态下,进入博客详情页,是否正确显示对应帖子的信息,点击删除按钮并删除
*/
@Order(2)
@ParameterizedTest
@CsvSource(value = "cherry, 123")
void BlogList2(String username, String password) throws InterruptedException, IOException {
//1-登录
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(5000);
//2-场景2:点击帖子内容"测试",博客作者与登录作者一致,显示点赞按钮、编辑按钮,删除按钮
webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
//是否跳转到 帖子详情页
//获取当前的url地址
String expect2 = "http://124.71.152.247:8081/index.html";
String actual2 = webDriver.getCurrentUrl();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect2, actual2);
//删除按钮
webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div:nth-child(1) > div.col-9.card.card-lg > div.card-footer.bg-transparent.mt-auto.justify-content-end > div > div:nth-child(3) > div > a")).click();
Thread.sleep(1000);
//判断是否跳转回博客列表页面
//是否跳转到 帖子详情页
//获取当前的url地址
String expect1 = "http://124.71.152.247:8081/index.html";
String actual1 = webDriver.getCurrentUrl();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect1, actual1);
System.out.println("帖子删除成功");
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "BlogDeleteSuccess1.png";
FileUtils.copyFile(srcFile, new File(fileName));
}
未登录状态下,进入博客列表页,点击我的帖子(都走不到这一步),跳转回登录页面。
场景:登录状态下,进入博客列表页,点击我的帖子,跳转到个人中心页面,显示用户昵称等信息。
/**
* 场景2:登录状态下,进入博客列表页,点击我的帖子,跳转到个人中心页面
*/
@Order(2)
@ParameterizedTest
@CsvSource(value = "cherry, 123")
void BlogList2(String username, String password) throws InterruptedException, IOException {
//1-登录
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
//2-点击我的帖子
webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
Thread.sleep(1000);
webDriver.findElement(By.cssSelector("#index_user_profile")).click();
Thread.sleep(1000);
//是否有用户昵称
webDriver.findElement(By.cssSelector("#profile_nickname"));
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "CenterInfoSuccess.png";
FileUtils.copyFile(srcFile, new File(fileName));
}
场景1:未登录状态下,进入博客列表页,点击用户头像下的个人中心(都走不到这一步),跳转回登录页面。
场景2:登录后点击用户头像下的个人中心,输入新昵称并修改,获取新昵称观察是否显示成功。
场景3:登录后点击用户头像下的个人中心,输入新密码并修改,其中两次密码一致,输入原密码也正确,观察是否跳转回登录界面。
@Order(2)
@ParameterizedTest
@CsvSource(value = "cherry, 123")
void BlogList2(String username, String password) throws InterruptedException, IOException {
//1-登录
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
//2-点击我的帖子
webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
Thread.sleep(1000);
webDriver.findElement(By.cssSelector("#index_user_settings")).click();
Thread.sleep(1000);
//是否有用户昵称
webDriver.findElement(By.cssSelector("#settings_nickname"));
//是否有“昵称”这两个字
webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(4)"));
//是否有“邮箱地址”这几个字
webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(7)"));
//是否有“电话号码”这几个字
webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(10)"));
//是否有“修改密码”这几个字
webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(13)"));
//是否有“提交修改”按钮#settings_input_passwordRepeat
webDriver.findElement(By.cssSelector("#settings_submit_password"));
Thread.sleep(1000);
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "CenterInfoListSuccess.png";
FileUtils.copyFile(srcFile, new File(fileName));
}
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class CenterInfoListTest extends InitAndEnd {
/**
* 场景1:用户名和密码都正确
*/
@Order(1)
@ParameterizedTest
@CsvSource(value = "cherry, 123")
void Login1(String username, String password) throws InterruptedException, IOException {
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
}
/**
* 场景2:登录状态下,进入博客列表页,点击个人中心,跳转到个人中心页面
*/
@Order(2)
@Test
void BlogList2() throws InterruptedException, IOException {
//2-点击我的帖子
webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
Thread.sleep(1000);
webDriver.findElement(By.cssSelector("#index_user_settings")).click();
Thread.sleep(1000);
//是否有用户昵称
webDriver.findElement(By.cssSelector("#settings_nickname"));
//是否有“昵称”这两个字
webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(4)"));
//是否有“邮箱地址”这几个字
webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(7)"));
//是否有“电话号码”这几个字
webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(10)"));
//是否有“修改密码”这几个字
webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(13)"));
//是否有“提交修改”按钮#settings_input_passwordRepeat
webDriver.findElement(By.cssSelector("#settings_submit_password"));
Thread.sleep(1000);
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "CenterInfoListSuccess1.png";
FileUtils.copyFile(srcFile, new File(fileName));
//3-修改昵称
//清除昵称的文本内容
webDriver.findElement(By.cssSelector("#setting_input_nickname")).clear();
//输入要修改的内容
webDriver.findElement(By.cssSelector("#setting_input_nickname")).sendKeys("newCherry");
//点击修改按钮
webDriver.findElement(By.cssSelector("#setting_submit_nickname")).click();
Thread.sleep(1000);
//再次获取昵称,判断是不是修改后的昵称名
String actualNickName = webDriver.findElement(By.cssSelector("#settings_nickname")).getText();
Thread.sleep(1000);
String exceptNickName = "newCherry";
Assertions.assertEquals(actualNickName, exceptNickName); // 断言
System.out.println("昵称修改成功!");
//截图
File srcFile1 = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName1 = "CenterInfoListSuccess2.png";
FileUtils.copyFile(srcFile1, new File(fileName1));
}
}
//4-修改密码:原密码123正确,两次新密码321也一致
//输入原密码
webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("123");
//输入新密码
webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("321");
//输入确认密码
webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("321");
//点击 提交修改 按钮
webDriver.findElement(By.cssSelector("#settings_submit_password")).click();
Thread.sleep(1000);
//判断是否返回登录界面
//获取当前的url地址
String expect = "http://124.71.152.247:8081/sign-in.html";
String actual = webDriver.getCurrentUrl();
//判断是否跳转到登录界面
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect, actual);
//截图
File srcFile2 = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName2 = "CenterInfoListSuccess3.png";
FileUtils.copyFile(srcFile2, new File(fileName2));
场景:登录后,点击用户头像下的退出按钮,跳转回登录界面,退出成功。
@Order(1)
@ParameterizedTest
@CsvSource(value = "cherry, 321")
void LoginOut1(String username, String password) throws InterruptedException, IOException {
//1-登录
// 打开登录页面
webDriver.get("http://124.71.152.247:8081/sign-in.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
//2-点击我的帖子
webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
Thread.sleep(1000);
//点击退出按钮
webDriver.findElement(By.cssSelector("#index_user_logout")).click();
Thread.sleep(1000);
//获取当前的url地址
String expect = "http://124.71.152.247:8081/sign-in.html";
String actual = webDriver.getCurrentUrl();
//判断是否跳转到登录界面
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expect, actual);
//截图
File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String fileName = "LoginOutSuccess.png";
FileUtils.copyFile(srcFile, new File(fileName));
}
Action()
{
web_url("sign-in.html",
"URL=http://124.71.152.247:8081/sign-in.html",
"Resource=0",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
EXTRARES,
"Url=/sign-in.html", ENDITEM,
LAST);
web_add_cookie("__huid=119NsjOYxU6mdbuaWxJs2RsDkAbqvUbWoATer/xQupFzE=; DOMAIN=cloud.browser.360.cn");
lr_think_time(7);
web_custom_request("sea",
"URL=http://cloud.browser.360.cn/hp/sea",
"Method=POST",
"Resource=0",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
"EncType=text/plain",
"Body=WQF5sG2A3G87Di1j/9lVU6tGpUxjbi8h9dOSKi0nx0bBqI3NhNjo%2BhJjBEgGG7vJpmWkPaE8H7VriNz9f/uQIcxcAQMslbR5BrNQFX%2BaLkMlu51TJYzYI03Ix9kMz7AGv5atKy3kF9YF86MaiowJ%2B88BdH2zke9LfjkSSOnDIB9pCrQEMhm%2BWy2gk8ziS7Izk7GF/IvqUyc5GvTM4PFYu3hjejRzs4fV",
LAST);
web_custom_request("safe_update",
"URL=http://vconf.f.360.cn/safe_update",
"Method=POST",
"Resource=0",
"RecContentType=application/octet-stream",
"Referer=",
"Snapshot=t3.inf",
"Mode=HTML",
"BodyBinary=\\x0E\\x06$!\\x01\\x08$\\xB8j\\xC4\\x00\\x00\\x00\\x00\\xF8\\xD7\\xFB\\xE5\\xFD\\x9A/\\xC2&\\x90\\x94$N\\x85R\\x1Br$2>b\\xB8\\x84\\xE5\\xE6\\xF8\\x18\\xF2\\xC1,\\x88\\xFC\t\\xF9\\x84\\xB1Ls)q\n\\x05\\x8Bw\\x8B,\\x066\\xE1\\xE50\\x11\\xB9\\xAF\\xD5!\\x18\\x14\\x8C,\\x86I_\\x1C\\xE81\\xFAE\\xB8L\\xD0\\x95\\x03\\x8E\\xCB\\xB9}\\xFCi,\\x18F\\xAD\\xF4\r\\x82'IqH\\xFD\\xF8\\x0CIe\\x84\\x1B\\xF8\\x00\\x9C\\x0Be]"
"#\\xD0f\\x82\\xA6\\xE2c\\x7F\\xCC\\xC9.\\xE2\\x03\\xDB\\xBF\\xF5\\xBF3Mfu\\xF2\\xF2Hz\\x1B\\x02M\\xB7;\\xC9U\\xF9\\xED\\x90\\x06\\xB7\\x19\\xA1\\x96\\x98S\\xCF\\xB2\\x00LO\"\\xDD\\xD4S\\x11Zp\\xB1\\x9B\\x7F\\xDA\\x9C\\x03|\\x9B\\xCB\\xE9\\x96-T.3\\xF4\\xF8\\xE7O2DK\\x00\\xA0J\\xC5\\x06\\x9Cb \\xC8\\xA8\\xDF\\xBB3\\xA5\\x82\\x902\\x82\\xF4\\xB7nH\\x90\\xCAN<\\x07\\xC0\\x074l>4=\\x12\\x8D\\x8E9\\xDB}\\xA7\\xDA\\x05e\\x085V^#~\\x03%\\x07\\xD0\\xD4N\\x9C\\x98b\\x93g\\x84z\\xE2"
"[x\\xB3E\\x10\\xDA\\x86w3fpk:\\x0E?B?_\\xF9\\xBB\\x8D(@\\xE9\\x1D\\x02D\\xFB\\xEC\\xFE\\xE8\\xA88\\xB6-\\xBA$6\\x8D\\x00\\x04\\xBC\\x06\\xFFN",
EXTRARES,
"Url=http://t.wg.360-api.cn/api/helpgame?app=hotrank", "Referer=", ENDITEM,
"Url=http://t.wg.360-api.cn/ap/tips/browse?cver=&mid=9584dcf1d21227deae8dfc79c880b3cc", "Referer=", ENDITEM,
"Url=http://t.wg.360-api.cn/ap/tips/guess?sence=browse_ai&mid=9584dcf1d21227deae8dfc79c880b3cc&cver=9.1.2.1018&gver=", "Referer=", ENDITEM,
"Url=http://cseupdate.360safe.com/formal/360chrome.cab?ver=13.5.2044.0&mid=9584dcf1d21227deae8dfc79c880b3cc&guid=9584dcf1d21227deae8dfc79c880b3cc&pid=360CE", "Referer=", ENDITEM,
LAST);
web_add_cookie("__huid=11jHmC5E3q3/A2xfpl7ar/4QDK+68TzjQe82izYITuvsI=; DOMAIN=browser.360.cn");
web_custom_request("crx_game_2.html",
"URL=http://browser.360.cn/se/config/crx_game_2.html",
"Method=GET",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t4.inf",
"Mode=HTML",
LAST);
web_add_cookie("__huid=11jHmC5E3q3/A2xfpl7ar/4QDK+68TzjQe82izYITuvsI=; DOMAIN=cloud.browser.360.cn");
web_submit_data("info",
"Action=http://cloud.browser.360.cn/site/info",
"Method=POST",
"EncType=multipart/form-data",
"RecContentType=text/plain",
"Referer=",
"Snapshot=t5.inf",
"Mode=HTML",
ITEMDATA,
"Name=rn", "Value=459029", ENDITEM,
"Name=sitedata", "Value=6f1751515d170703091e5156591a1b6d", ENDITEM,
LAST);
web_submit_data("info_2",
"Action=http://cloud.browser.360.cn/site/info",
"Method=POST",
"EncType=multipart/form-data",
"RecContentType=text/plain",
"Referer=",
"Snapshot=t6.inf",
"Mode=HTML",
ITEMDATA,
"Name=rn", "Value=224189", ENDITEM,
"Name=sitedata", "Value=691005030c1705031a000d0b1c0000060201020a051e4b50555c195856175a46595d1a64", ENDITEM,
LAST);
web_submit_data("info_3",
"Action=http://cloud.browser.360.cn/site/info",
"Method=POST",
"EncType=multipart/form-data",
"RecContentType=text/plain",
"Referer=",
"Snapshot=t7.inf",
"Mode=HTML",
ITEMDATA,
"Name=rn", "Value=112784", ENDITEM,
"Name=sitedata", "Value=6a1303000a1a03051c050b071f0006040205010903184f5153655d424a471e136f", ENDITEM,
LAST);
web_submit_data("info_4",
"Action=http://cloud.browser.360.cn/site/info",
"Method=POST",
"EncType=multipart/form-data",
"RecContentType=text/plain",
"Referer=",
"Snapshot=t8.inf",
"Mode=HTML",
ITEMDATA,
"Name=rn", "Value=774065", ENDITEM,
"Name=sitedata", "Value=6c150507041b05031a020506190600030c04070f041f415055635b454446156a", ENDITEM,
LAST);
web_submit_data("info_5",
"Action=http://cloud.browser.360.cn/site/info",
"Method=POST",
"EncType=multipart/form-data",
"RecContentType=text/plain",
"Referer=",
"Snapshot=t9.inf",
"Mode=HTML",
ITEMDATA,
"Name=rn", "Value=587854", ENDITEM,
"Name=sitedata", "Value=6e1a5051415c405a195b5a591a5355425d555b5f070d05011765", ENDITEM,
LAST);
web_submit_data("info_6",
"Action=http://cloud.browser.360.cn/site/info",
"Method=POST",
"EncType=multipart/form-data",
"RecContentType=text/plain",
"Referer=",
"Snapshot=t10.inf",
"Mode=HTML",
ITEMDATA,
"Name=rn", "Value=314153", ENDITEM,
"Name=sitedata", "Value=6813585e56525f595b4241090b010c001a77565c5b076a7f5c565d5f7c5d116c", ENDITEM,
EXTRARES,
"Url=http://t.wg.360-api.cn/ap/bar/pull?mid=9584dcf1d21227deae8dfc79c880b3cc&cver=", "Referer=", ENDITEM,
LAST);
lr_start_transaction("1_login");
web_add_cookie("__huid=11jHmC5E3q3/A2xfpl7ar/4QDK+68TzjQe82izYITuvsI=; DOMAIN=upext.chrome.360.cn");
lr_think_time(8);
web_url("intf.php",
"URL=http://upext.chrome.360.cn/intf.php?method=ExtUpdate.query&os=win&arch=x86&os_arch=x86_64&nacl_arch=x86-64&prod=chromiumcrx&prodchannel=stable&prodversion=86.0.4240.198&lang=zh-CN&acceptformat=crx2,crx3&cse=13.5.2044.0&x=id%3Dcfbkpilajlmedibkjkhcckpkpphhhklm%26v%3D1.3.1%26installsource%3Dnotfromwebstore%26installedby%3Dinternal%26uc",
"Resource=0",
"RecContentType=text/xml",
"Referer=",
"Snapshot=t11.inf",
"Mode=HTML",
LAST);
lr_think_time(8);
web_submit_data("login",
"Action=http://124.71.152.247:8081/user/login",
"Method=POST",
"RecContentType=application/json",
"Referer=http://124.71.152.247:8081/sign-in.html",
"Snapshot=t12.inf",
"Mode=HTML",
ITEMDATA,
"Name=username", "Value=apple", ENDITEM,
"Name=password", "Value=123", ENDITEM,
LAST);
web_url("index.html",
"URL=http://124.71.152.247:8081/index.html",
"Resource=0",
"Referer=http://124.71.152.247:8081/sign-in.html",
"Snapshot=t13.inf",
"Mode=HTML",
EXTRARES,
"Url=/user/info", ENDITEM,
"Url=/board/topList", ENDITEM,
"Url=/message/getUnreadCount", ENDITEM,
"Url=/message/getAll", ENDITEM,
"Url=/article/getAllByBoardId", ENDITEM,
LAST);
web_url("article_list.html",
"URL=http://124.71.152.247:8081/article_list.html",
"Resource=0",
"Referer=http://124.71.152.247:8081/index.html",
"Snapshot=t14.inf",
"Mode=HTML",
LAST);
lr_end_transaction("1_login",LR_AUTO);
return 0;
}
脚本录制通过
设置10个虚拟用户数量,防止电脑崩溃。
(1)创建性能测试场景
一次初始化一个用户,每次间隔15s初始化一个虚拟用户;
设置虚拟用户数量10个,每隔10S启动一个用户;
运行5分钟;
退出所有用户,每隔10s退出一个用户。
运行过程截图
结束截图
- 虚拟用户数为10:测试中使用了10个虚拟用户。
- 点击率为2928:在一定时间内发生的点击次数。测试中出现了2928次点击。
- 吞吐量为112738:系统在单位时间内处理的请求数量,测试期间处理了112738个请求。
- 标准差为23.316:系统不够稳定,后续应进一步优化系统以降低标准差,提高系统的可靠性和稳定性。
吞吐量:点击数越多,要处理的数量就越多,和上图的趋势相似。