目录
(一) 项目介绍
(二) 测试计划
1. 功能测试
(1)测试环境
(2)测试用例
(3)部分的功能测试
2. 自动化测试
项目介绍
项目整体基于 HTTP 协议,前端使用 HTML+CSS+JS 构建页面整体布局,后端采用分层结构,分为Controller层,Service层,Mapper层,Model层,Config层,Common层的设计,以达到在设计上的高内聚低耦合。采用了Spring框架,JAVA开发语言,以及MySQL数据库等技术。系统主要实现了注册、登录、显示博客、展示详细,编辑博客、删除博客,注销。使用统⼀返回格式+全局错误信息定义处理前后端交互时的返回结果;使用@ControllerAdvice和@ExceptionHandler实现全局异常处理;使用拦截器实现用户登录校验;对密码进行加密处理。
访问地址:博客登陆页http://124.223.187.220:8080/blog_login.html
功能测试
测试环境
操作系统:Windows 11
项目运行环境:IIntelliJ IDEA Community Edition 2022.1.4、JDK1.8、MySQL8.0
浏览器:Chorme浏览器
自动化测试工具:selenium4自动化测试框架:junit5
测试人员: 本人访问链接:博客登陆页
测试用例
功能测试
部分的功能测试
(1)注册
对注册页面进行的测试
测试场景1:输入正确注册账号,输入两次密码一致,输入正确用户名,上传头像,点击"注册"按钮
预期结果:注册成功,弹出提示框
实际结果:注册成功,弹出提示框
测试场景2:输入已存在的帐号,输入两次密码一致,输入正确用户名,上传头像,点击"注册"按钮
预期结果:注册失败,弹出提示框
实际结果:注册失败,弹出提示框
(2)登录
对登录页面进行的测试
测试场景1:输入正确的帐号,输入正确的密码,点击"登录"按钮
预期结果:登录成功,跳转博客列表页
实际结果:登录成功,跳转博客列表页
测试场景2:输入正确的帐号,输入错误的密码,点击"登录"按钮
预期结果:登录失败,弹出提示框
实际结果:登录失败,弹出提示框
测试场景3:用户未注册,点击"登录"按钮
预期结果:登录失败,弹出提示框
实际结果:登录失败,弹出提示框
测试场景4:帐号密码为空,点击"登录"按钮
预期结果:登录失败,弹出提示框
实际结果:登录失败,弹出提示框
(3)博客列表
对博客列表页展示进行测试
测试场景1:登录状态下没有发布过博客
预期结果:列表不展示博客信息
实际结果:列表不展示博客信息
测试场景2:登录状态下发布一篇博客,标题为"测试"
预期结果:展示一篇标题为"测试"博客信息
实际结果:展示一篇标题为"测试"博客信息
(4)发布博客
对发布博客进行测试
测试场景1:登录状态下,输入标题,输入正文,点击"发布文章"按钮
预期结果:发布博客成功,跳转博客列表页展示相关信息
实际结果:发布博客成功,跳转博客列表页展示相关信息
测试场景2:登录状态下,标题或者正文为空
预期结果:发布失败,弹出提示框
实际结果:发布失败,弹出提示框
测试场景3:未登录状态下,无法发布博客
预期结果:弹出提示框,跳转登录页
实际结果:弹出提示框,跳转登录页
(5)修改博客
博客修改进行测试
测试场景1:登录状态下且当前博客详情是当前登录用户
预期结果:修改博文,修改成功
实际结果:修改博文,修改成功
测试场景2:登录状态下当前博客详情不是当前登录用户
预期结果:不可修改,没有可修改的接口
实际结果:不可修改,没有可修改的接口
(6)删除博客
对删除进行测试
测试场景1:登录状态下且当前博客详情是当前登录用户,点击删除
预期结果:删除成功
实际结果:删除成功
(7)注销
对注销进行测试
测试场景1:在已经登录状态下点击右上角"注销"按钮
预期结果:退出成功,跳转登录页
实际结果:退出成功,跳转登录页
自动测试
(1)代码编写
对主要功能进行自动化测试
- 脑图
- 添加依赖 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>AutoTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<!-- 截图-->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 注册历面测试
//注册成功测试用例
@Test
void registerSuccess() throws InterruptedException {
//用当前时间自动生成随机帐号密码等
String time = String.valueOf(System.currentTimeMillis());
//打开博客注册页
webDriver.get("http://124.223.187.220:8080/blog_register.html");
//输入要注册的账号
webDriver.findElement(By.cssSelector("#username")).sendKeys(time);
//输入正确密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(time);
//输入正确确认密码
webDriver.findElement(By.cssSelector("#password_2")).sendKeys(time);
//输入正确用户名
webDriver.findElement(By.cssSelector("#as_username")).sendKeys(time);
sleep(1000);
//上传头像
webDriver.findElement(By.cssSelector("#avatar")).sendKeys("D:\\网页文件包\\img\\16.jpg");
//点击"注册"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(2000);
//校验, 弹出提示框点确定,跳转登录页面,页面有展示"登陆"文本 则通过
webDriver.switchTo().alert().accept();
sleep(2000);
String url = webDriver.getCurrentUrl();
String text = webDriver.findElement(By.cssSelector("body > div.container-login > div > h3")).getText();
Assertions.assertEquals(text, "登陆");
Assertions.assertEquals("http://124.223.187.220:8080/blog_login.html", url);
}
//注册失败测试用例
@Test
void registerFail01() throws InterruptedException {
//打开博客注册页
webDriver.get("http://124.223.187.220:8080/blog_register.html");
//输入已存在的帐号
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
//输入正确密码
webDriver.findElement(By.cssSelector("#password")).sendKeys("010306");
//输入正确确认密码
webDriver.findElement(By.cssSelector("#password_2")).sendKeys("010306");
//输入正确用户名
webDriver.findElement(By.cssSelector("#as_username")).sendKeys("010306");
//上传头像
webDriver.findElement(By.cssSelector("#avatar")).sendKeys("D:\\网页文件包\\img\\16.jpg");
//点击"注册"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(1000);
//校验, 弹出提示框,显示"内部内部发生错误, 请联系管理员" 则通过
String text = webDriver.switchTo().alert().getText();
webDriver.switchTo().alert().accept();
Assertions.assertEquals("内部发生错误, 请联系管理员", text);
}
@Test
void registerFail02() throws InterruptedException {
//打开博客注册页
webDriver.get("http://124.223.187.220:8080/blog_register.html");
//输入已存在的帐号
webDriver.findElement(By.cssSelector("#username")).sendKeys("010306");
//输入正确密码
webDriver.findElement(By.cssSelector("#password")).sendKeys("010306");
//输入正确确认密码
webDriver.findElement(By.cssSelector("#password_2")).sendKeys("0103067");
//输入正确用户名
webDriver.findElement(By.cssSelector("#as_username")).sendKeys("010306");
//上传头像
webDriver.findElement(By.cssSelector("#avatar")).sendKeys("D:\\网页文件包\\img\\16.jpg");
//点击"注册"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(1000);
//校验 弹出提示框,显示"两次密码不一致" 则通过
String text = webDriver.switchTo().alert().getText();
webDriver.switchTo().alert().accept();
Assertions.assertEquals("两次密码不一致", text);
}
- 登录页面测试
//登录成功测试用例
@Test
void loginSuccess() throws InterruptedException {
//打开博客登录页
webDriver.get("http://124.223.187.220:8080/blog_login.html");
//输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
//输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys("135435");
//点击"登录"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(3000);
//登录成功后,校验是否登陆成功
String url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://124.223.187.220:8080/blog_list.html", url);
}
//登录失败测试用例
@Test
void loginFail01() throws InterruptedException {
//打开博客登录页
webDriver.get("http://124.223.187.220:8080/blog_login.html");
//输入正确用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
//输入错误密码
webDriver.findElement(By.cssSelector("#password")).sendKeys("135435555");
//点击"登录"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
//检验, 如弹出提示框,显示"用户名或密码错误!!!则通过
sleep(3000);
String text = webDriver.switchTo().alert().getText();
webDriver.switchTo().alert().accept(); //弹窗确定
Assertions.assertEquals("用户名或密码错误!!!", text);
}
@Test
void loginFail02() throws InterruptedException {
//打开博客登录页
webDriver.get("http://124.223.187.220:8080/blog_login.html");
//不输入任何东西
//点击"登录"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
//检验, 如弹出提示框,显示"用户名或密码为空"则通过
sleep(3000);
String text = webDriver.switchTo().alert().getText();
webDriver.switchTo().alert().accept();
Assertions.assertEquals("用户名或密码为空", text);
}
@Test
void loginFaill03() throws InterruptedException {
//打开博客登录页
webDriver.get("http://124.223.187.220:8080/blog_login.html");
//输入未注册的用户
webDriver.findElement(By.cssSelector("#username")).sendKeys("loginFail");
webDriver.findElement(By.cssSelector("#password")).sendKeys("loginFail");
//点击"登录"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(1000);
//检验, 如弹出提示框,显示"用户不存在"则通过
String text = webDriver.switchTo().alert().getText();
webDriver.switchTo().alert().accept();
Assertions.assertEquals("用户不存在", text);
}
- 博客列表测试
//博客列表登录状态下
@Test
void blogLists01() throws InterruptedException {
//登录
webDriver.get("http://124.223.187.220:8080/blog_login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
webDriver.findElement(By.cssSelector("#password")).sendKeys("135435");
//点击"登录"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
//没有发布博客 列表不展示博客信息
sleep(2000);
String text = webDriver.findElement(By.cssSelector("body > div.container > div.right")).getText();
Assertions.assertEquals("", text);
}
//博客列表未登录状态下
@Test
void blogLists02() throws InterruptedException {
//输入URL
webDriver.get("http://124.223.187.220:8080/blog_list.html");
sleep(3000);
//校验 弹出提示框"用户未登录",点确定,跳转登录页面则通过
webDriver.switchTo().alert().accept();
sleep(3000);
String url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://124.223.187.220:8080/blog_login.html", url);
}
- 发布博客测试
//发布博客登录状下
//发布成功
@Test
void blogEditSuccess() throws InterruptedException {
//登录
webDriver.get("http://124.223.187.220:8080/blog_login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
webDriver.findElement(By.cssSelector("#password")).sendKeys("135435");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(3000);
//点击"写博客"按钮
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
sleep(3000);
// document.querySelector("#title").value="测试"
// 输入标题(通过Selenium执行JS脚本完成)
((JavascriptExecutor) webDriver).executeScript("document.querySelector(\"#title\").value=\"测试\"");
sleep(2000);
//点击"发布文章"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(2000);
//校验, 如跳转博客列表页,博客列表页面展示一条博客信息和用户文章数变为1 刚测试通过 否则不通过
WebElement title = webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.title"));
String count = webDriver.findElement(By.cssSelector("body > div.container > div.left > div > div:nth-child(5) > span")).getText();
Assertions.assertNotEquals("0", count);
Assertions.assertNotNull(title);
}
//发布失败
@Test
void blogEditFail01() throws InterruptedException {
//登录
webDriver.get("http://124.223.187.220:8080/blog_login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
webDriver.findElement(By.cssSelector("#password")).sendKeys("135435");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(1000);
//点击"写博客"按钮
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
sleep(4000);
// document.querySelector("#title").value="测试"
// 输入标题(通过Selenium执行JS脚本完成)
((JavascriptExecutor) webDriver).executeScript("document.querySelector(\"#title\").value=\"测试\"");
//清空正文
//使用JavaScript来清空指定元素中的内容
((JavascriptExecutor) webDriver).executeScript("document.querySelector('#editor > div.editormd-toolbar > div > ul > li:nth-child(39) > a > i').click()");
sleep(1000);
//点击"发布文章"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(1000);
//校验 弹出提示框,显示"标题或正文不能空" 则通过
String text = webDriver.switchTo().alert().getText();
Assertions.assertEquals("标题或正文不能空", text);
}
//发布博客未登录状态下
@Test
void blogEditFail02() throws InterruptedException {
//打开编缉页面
webDriver.get("http://124.223.187.220:8080/blog_edit.html");
//点击"发布文章"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(5000);
//检验 弹出提示框,显示"用户未登录",点确定,跳转登录页面 则通过
webDriver.switchTo().alert().accept();
sleep(3000);
String url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://124.223.187.220:8080/blog_login.html", url);
}
- 修改博客测试
//修改博客 登录状态下
//修改成功
@Test
void updateBlogSuccess() throws InterruptedException {
String text = String.valueOf(System.currentTimeMillis());
//登录
webDriver.get("http://124.223.187.220:8080/blog_login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
webDriver.findElement(By.cssSelector("#password")).sendKeys("135435");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(3000);
String text1 = webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.title")).getText();
sleep(1000);
//点击"查看详情"按钮
webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();
sleep(2000);
//点击"编辑"按钮
webDriver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(1)")).click();
sleep(2000);
((JavascriptExecutor) webDriver).executeScript("document.querySelector(\"#title\").value = '" + text + "';");
//点击"更新文章"按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(2000);
String text2 = webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.title")).getText();
Assertions.assertNotEquals(text1, text2);
}
//修改博客未登录状态下
//修改失败
@Test
void updateBlogFail() throws InterruptedException {
//直接打开编缉页
webDriver.get("http://124.223.187.220:8080/blog_update.html?blogId=39");
//校验 无法跳转到编辑页 则通过
String url = webDriver.getCurrentUrl();
sleep(3000);
Assertions.assertEquals("http://124.223.187.220:8080/blog_login.html", url);
}
- 删除博客测试
//删除博客 是登录状态且是当前用户的博客
@Test
void deleteBlog() throws InterruptedException {
//登录
webDriver.get("http://124.223.187.220:8080/blog_login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
webDriver.findElement(By.cssSelector("#password")).sendKeys("135435");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(3000);
// webDriver.manage().timeouts().implicitlyWait(3, SECONDS);
//点击"查看全文"按钮
webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();
sleep(2000);
// webDriver.manage().timeouts().implicitlyWait(3, SECONDS);
//点击"删除"按钮
webDriver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(2)")).click();
//校验
sleep(2000);
// webDriver.manage().timeouts().implicitlyWait(3, SECONDS);
String text = webDriver.findElement(By.cssSelector("body > div.container > div.right")).getText();
Assertions.assertEquals("", text);
}
- 注销测试
//注销(是已登录) 退出成功
@Test
void LogOut() throws InterruptedException {
//登录
webDriver.get("http://124.223.187.220:8080/blog_login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("lirunkun");
webDriver.findElement(By.cssSelector("#password")).sendKeys("135435");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(3000);
//进入已登录进的页面
webDriver.get("http://124.223.187.220:8080/blog_list.html");
//点击"注销"按钮,
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
sleep(1000);
//校验, 跳转登录页面却页面有展示"登陆"文本 则通过
String url = webDriver.getCurrentUrl();
String loginText = webDriver.findElement(By.cssSelector("body > div.container-login > div > h3")).getText();
Assertions.assertEquals("http://124.223.187.220:8080/blog_login.html", url);
Assertions.assertEquals("登陆", loginText);
}