文章目录
- 一.测试需求分析
- 1.功能分析
- 2.非功能分析
- 二.制定测试方案(计划 + 策略)
- 三.编写测试用例
- 四.执行自动化测试用例
- 五.编写测试报告
- 六.项目总结
一.测试需求分析
1.功能分析
通过功能测试需求分析
2.非功能分析
非功能分析主要从:界面,性能,安全性,兼容性,可维护性等来分析
- 界面
布局、排版美观,设计符合当下时代。
界面的按键和跳转能够正常使用。 - 性能
跳转页面不超过 3 秒。执行业务逻辑不超过 3 秒。 - 安全
防止用户数据泄露,预防sql注入,病毒危害系统 - 兼容
保证在不同系统(macOS,Windows),不同终端设备(PC,移动),不同浏览器上系统能正常运转 - 可维护
方便后续修复和扩展系统功能
二.制定测试方案(计划 + 策略)
测试范围以及测试点:
用户登录页面,注册页面,博客发布模块,博客删除模块,博客修改模块,博客主页模块。
测试方法: 自动化测试
测试所涉及的类型:功能,界面测试
三.编写测试用例
本次测试采用自动化测试主要对功能方面来进行测试用例的编写,通过前面对功能测试需求的分析,主要对六个功能模块来设计测试用例
四.执行自动化测试用例
自动化脚本如下:
package com.example.blog_test;
import lombok.SneakyThrows;
import org.assertj.core.data.Index;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.boot.test.context.SpringBootTest;
import sun.security.util.Password;
import javax.swing.*;
import java.time.Duration;
import java.util.List;
import static java.lang.Thread.sleep;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class ApplicationTest {
/**
* 测试登录模块
*/
@Nested
@Disabled
public class LoginTest{
@SneakyThrows
@ParameterizedTest
@CsvFileSource( files = "src/test/resources/TestSource/UserAcount.csv")
void test(String name,String pwd)
{
Driver driver = new Driver();
driver.MaxWindow();
driver.get(PublicVariable.LoginUrl);
//服务器性能太低 加载页面慢
driver.Wait(5);
//输入用户名账号
WebElement UserName = driver.findElementByCss("#username");
WebElement password = driver.findElementByCss("#password");
UserName.sendKeys(name);
password.sendKeys(pwd);
//点击登录按钮
WebElement button = driver.findElementByCss("#submit");
button.click();
//预期结果:跳转主页
// WebDriverWait wait = new WebDriverWait(driver.getWebDriver(), Duration.ofSeconds(10)); // 设置等待时间为10秒
// WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#app")));
sleep(100);
String CurUrl = driver.getUrl();
assertEquals(CurUrl,PublicVariable.IndexUrl);
//关闭窗口
driver.quit();
}
}
/**
* 测试注册模块
*/
@Nested
@Disabled
public class RegisterTest{
}
/**
* 测试注销模块
*/
@Nested
@Disabled
public class LogoutTest{
@SneakyThrows
@Test
void test()
{
Driver driver = new Driver();
//登录
Tool.login(driver);
//点击注销按钮
WebElement LogOutBtn = driver.findElementByCss("#app > div > div > a:nth-child(8)");
LogOutBtn.click();
driver.confirm();
sleep(1000);
//预期结果: 导航栏 只有注册 登录 主页三个按钮
List<WebElement> lists = driver.findElements("#app > div > div > a");
assertEquals(lists.size(),3);
}
}
/**
* 测试博客发布模块
*/
@Nested
@Disabled
public class ReleaseTest{
@SneakyThrows
@ParameterizedTest
@CsvFileSource( files = "src/test/resources/TestSource/BlogDetail.csv")
public void test(String title, String content)
{
Driver driver = new Driver();
//登录
Tool.login(driver);
//获取导航栏元素列表
List<WebElement> webElementList = driver.findElements("#app > div > div > a");
//选取写博客功能元素
WebElement target = null;
for(int i = 0 ;i<webElementList.size();i++)
{
WebElement element = webElementList.get(i);
if(element.getText().equals(Tool.Pub_blog))
{
target = element;
continue;
}
}
//进入博客发布页面 填写内容
target.click();
sleep(5000);
WebElement Title = driver.findElementByCss("#add_title");
Actions actions = new Actions(driver.getWebDriver());
//输入内容
actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(content).perform();
//输入标题
Title.sendKeys(title);
//点击发布
List<WebElement> lists = driver.findElements(".title > button");
for(int i =0;i<lists.size();i++)
{
WebElement element = lists.get(i);
if(element.getText().equals("发布文章"))
{
element.click();
sleep(1000);
driver.reject();
break;
}
}
//预期结果:跳转到主我的博客页面 主页面第一篇文章为刚发布文章
sleep(1000);
String CurUrl = driver.getUrl();
String IndexTitle = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > header:nth-child(1) > header:nth-child(1) > h2").getText();
String IndexContent = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > main > span").getText();
assertEquals(CurUrl,PublicVariable.MyBlogUrl);
assertEquals(IndexTitle,title);
assertEquals(IndexContent,content);
}
}
/**
* 测试博客删除模块
*/
@Nested
@Disabled
public class DeleteTest{
@Test
void test()
{
Driver driver = new Driver();
//先写入一篇文章
Tool.pub_blog(driver,"测试","测试");
//删除改文章
List<WebElement> elements = driver.findElements("#app .el-main .el-main");
WebElement el = elements.get(0);
List<WebElement> lists = el.findElements(By.cssSelector("button"));
for(int i = 0;i<lists.size();i++)
{
WebElement btn = lists.get(i);
if(btn.getText().equals("删除文章"))
{
btn.click();
driver.confirm();
break;
}
}
//预期结果: 展台显示暂无内容
WebElement h1 = driver.findElementByCss("h1");
assertNotNull(h1);
assertEquals(h1.getText(),"暂无内容");
}
}
/**
* 测试博客修改模块
*/
@Nested
@Disabled
public class ModifyTest{
@SneakyThrows
@ParameterizedTest
@CsvFileSource( files = "src/test/resources/TestSource/BlogDetail.csv")
void test(String title,String content)
{
Driver driver = new Driver();
//先写入一篇文章
Tool.pub_blog(driver,"测试","测试");
//修改文章
List<WebElement> elements = driver.findElements("#app .el-main .el-main");
WebElement el = elements.get(0);
List<WebElement> lists = el.findElements(By.cssSelector("button"));
for(int i = 0;i<lists.size();i++)
{
WebElement btn = lists.get(i);
if(btn.getText().equals("修改文章"))
{
btn.click();
break;
}
}
sleep(100);
//输入修改内容
WebElement Title = driver.findElementByCss("#add_title");
Actions actions = new Actions(driver.getWebDriver());
//输入内容
actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(content).perform();
new Actions(driver.getWebDriver())
.click(Title)
.perform();
//输入标题
actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(title).perform();
WebElement submitEl = driver.findElementByCss("#submit");
submitEl.click();
sleep(100);
driver.reject();
String CurUrl = driver.getUrl();
sleep(500);
//预期结果: 页面跳转到我的博客页面 且标题内容与修改相同
String IndexTitle = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > header:nth-child(1) > header:nth-child(1) > h2").getText();
String IndexContent = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > main > span").getText();
assertEquals(CurUrl,PublicVariable.MyBlogUrl);
assertEquals(IndexTitle,title);
assertEquals(IndexContent,content);
}
}
/**
* 测试博客主页模块
*/
@Nested
public class IndexTest{
@Test
void test() {
//插入多篇文章
Tool.pub_blog(new Driver(), "测试", "测试");
Tool.pub_blog(new Driver(), "测试", "测试");
Driver driver = new Driver();
driver.MaxWindow();
driver.get(PublicVariable.IndexUrl);
WebElement pageNum = driver.findElementByCss("#app > div > section > div.pagination > div > ul > li");
//预期结果 分页数目大于1
assertNotEquals(Integer.parseInt(pageNum.getText()),1);
}
}
}
被测试项目源代码链接:https://github.com/911400586/Blog_System
自动化脚本源代码:https://github.com/911400586/Blog_Auto_Test
五.编写测试报告
点击下方连接查看详细测试报告
博客系统测试报告
六.项目总结
测试用例根据用户需求分析来设计,而且有整体框架,算是比较详细全面。
有待改善的地方:
系统中有一些模块的功能是类似的,导致设计测试用例的时候重复,略显冗余。
系统中的一些功能模块,设计出的测试用例覆盖率较低。