一.项目背景
本系统基于SSM框架实现。它为用户提供了一个便捷的内容创作与分享平台。用户可以轻松注册登录,发表博客文章,涵盖文字、图片等多种形式。系统具备简洁美观的界面设计,方便用户浏览与搜索感兴趣的内容。通过SSM框架的整合,系统具有良好的稳定性、可扩展性和性能表现,为用户打造了一个优质的博客交流空间。
二.项目功能
该应用主要实现了以下几个功能:登录、注册、编写博客、上传个人信息。
登录功能:账号以及密码已经在注册时写入了数据库,即:用户名以及密码是已经存在的,登录成功后就会跳转到对应的身份的列表页面。用户登录成功后,会出现用户资料卡以及发布的博客列表。
注册功能:输入用户名和密码即可注册成功,如果用户名已注册则会跳转到异常页面并显示:当前用户名已经被使用,请更换用户名后再来尝试注册。
编写博客功能:登录后即可在导航栏点击“写博客”按钮,即可开始编写博客。
上传个人信息:登录后,点击资料卡中的“修改个人信息”按钮,即可开始修改个人信息,可修改的信息有:用户名、登录密码、github地址、头像。
三.功能测试
1)测试用例
功能测试结果:测试用例100%通过
2)自动化测试
自动化测试覆盖模块:登录页面、注册页面、博客列表页面、编辑列表页面、博客详情页面、修改资料页面。
自动化代码示例:
1.common包
package commen;
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.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.SimpleTimeZone;
public class Utils {
public static WebDriver driver;
public static WebDriver createDriver(){
if(driver==null){
//驱动程序管理的⾃动化
WebDriverManager.edgedriver().setup();
EdgeOptions options=new EdgeOptions();
//允许访问所有连接
options.addArguments("--remote-allow-origins=*");
driver=new EdgeDriver(options);
//等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
}
return driver;
}
public Utils(String url){
driver=createDriver();
driver.get(url);
}
public void getScreenShot(String str) throws IOException {
SimpleDateFormat sim1=new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2=new SimpleDateFormat("HHmmSS");
String dirTime=sim1.format(System.currentTimeMillis());
String fileTime=sim2.format(System.currentTimeMillis());
String filename="./src/test/image/"+dirTime+"/"+str+"-"+fileTime+".png";
File srcFile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//srcFile放到指定位置
FileUtils.copyFile(srcFile,new File(filename));
}
}
2.tests包
(1)LoginPage
package tests;
import commen.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.TakesScreenshot;
import java.io.IOException;
//http://127.0.0.1:8080/login.html
public class LoginPage extends Utils {
public static String url="http://127.0.0.1:8080/login.html";
public LoginPage(){
super(url);
}
/*
检查页面加载是否成功
*/
public void LoginPageRight() throws InterruptedException {
//通过查看页面元素来检查页面加载成功与否
driver.findElement(By.cssSelector("#submit"));
//登录输入框
driver.findElement(By.cssSelector("body > div.login-container"));
}
//检查登录功能
public void LoginSuccess() throws InterruptedException, IOException {
//保证输入时没有文本
//方法一:
// driver.findElement(By.cssSelector("#username")).clear();
// driver.findElement(By.cssSelector("#password")).clear();
//方法二:
//driver.navigate().refresh();
//输入正确的账号密码
driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#submit")).click();
//检查点击登录后是否登陆成功(两个页面中的不同点都可以作为检查登录是否成功的标志)
//登录页面和登陆成功页面 的 标题不一样
String expect=driver.getTitle();
assert expect.equals("博客列表");
}
public void LoginFail() throws InterruptedException, IOException {
//1.错误的用户名和错误的密码
driver.findElement(By.cssSelector("#username")).sendKeys("abcdrfg");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
driver.findElement(By.cssSelector("#submit")).click();
//
String text=driver.findElement(By.cssSelector("body")).getText();
assert text.equals("登陆失败,用户名或密码错误,请重新登录~");
getScreenShot(getClass().getName());
//登陆失败之后返回登录页,方便继续测试登录成功用例
driver.navigate().back();
}
}
(2)ListPage
package tests;
import commen.Utils;
import org.openqa.selenium.By;
public class ListPage extends Utils {
public static String url="http://127.0.0.1:8080/blog_list.html";
public ListPage(){
super(url);
}
public void ListByLogin() throws InterruptedException {
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//能找到菜单
driver.findElement(By.cssSelector("body > div.nav"));
//能找到个人信息
driver.findElement(By.cssSelector("body > div.container > div.left > div"));
//能找到博客列表模块
driver.findElement(By.cssSelector("body > div.container > div.right"));
Thread.sleep(2000);
driver.quit();
}
}
(3) RegisterPage
package tests;
import commen.Utils;
import org.openqa.selenium.By;
public class RegisterPage extends Utils {
public static String loginurl="http://127.0.0.1:8080/login.html";
public static String registerurl="http://127.0.0.1:8080/login.html";
public RegisterPage(){
super(registerurl);
}
public void RegisterPageRight(){
//登录页面点击注册
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)")).click();
String text=driver.getTitle();
assert text.equals("注册用户");
//直接打开注册页面
// String text2=driver.getTitle();
// assert text2.equals("注册用户");
}
public void RegisterSuccess(){
driver.findElement(By.cssSelector("#username")).sendKeys("wangwu");
driver.findElement(By.cssSelector("#password")).sendKeys("123459");
driver.findElement(By.cssSelector("#submit")).click();
String text=driver.getTitle();
assert text.equals("登录页面");
}
public void RegisteFail(){
driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#submit")).click();
//
String text=driver.findElement(By.cssSelector("body > h2")).getText();
assert text.equals("当前用户名已经被使用,请更换用户名后再来尝试注册");
driver.quit();
}
}
(4) EditPage
package tests;
import commen.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;
public class EditPage extends Utils {
public static String editurl="http://127.0.0.1:8080/blog_edit.html";
public static String listurl = "http://127.0.0.1:8080/blog_list.html";
public static String loginurl = "http://127.0.0.1:8080/login.html";
public static String detailurl = "http://127.0.0.1:8080/blog_detail.html";
public EditPage(){
super(listurl);
}
public void EditSuccess() throws InterruptedException {
//1.编辑博客页面可以正常打开
//1)输入连接打开
// driver.get(editurl);
//2)从列表页面打开
// driver.get(listurl);
//3)从登录页面打开
// driver.get(loginurl);
//4)从博客详情页打开
// driver.get(detailurl);
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
//2.正常填写博客能提交成功(只写标题不填内容(本来就有内容))
// driver.findElement(By.cssSelector("#title")).sendKeys("我的博客888");
// driver.findElement(By.cssSelector("#submit")).click();
// //检查一下博客发布之后是否成功
// String title = driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.title")).getText();
// assert title.equals("我的博客888");
// driver.quit();
}
public void EiditFail(){
//不写标题
driver.findElement(By.cssSelector("#submit")).click();
String text=driver.findElement(By.cssSelector("body")).getText();
assert text.equals("当前提交的博客标题或者正文缺失");
driver.navigate().back();
//不写内容
driver.findElement(By.cssSelector("#title")).sendKeys("我的博客666");
driver.findElement(By.cssSelector("#submit")).click();
String text2=driver.findElement(By.cssSelector("body")).getText();
assert text2.equals("当前提交的博客标题或者正文缺失");
driver.navigate().back();
//都不写
driver.findElement(By.cssSelector("#submit")).click();
String text3=driver.findElement(By.cssSelector("body")).getText();
assert text2.equals("当前提交的博客标题或者正文缺失");
}
}
(5)DetailPage
package tests;
import commen.Utils;
import org.openqa.selenium.By;
import java.io.IOException;
public class DetailPage extends Utils {
public static String url="http://127.0.0.1:8080/blog_detail.html";
public DetailPage(){
super(url);
}
public void DetailSuccess() throws IOException, InterruptedException {
Thread.sleep(3000);
driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();
driver.quit();
}
}
(6)PageByNoLogin
package tests;
import commen.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import java.io.IOException;
import static commen.Utils.driver;
public class PageByNoLogin extends Utils {
public static String listurl = "http://127.0.0.1:8080/blog_list.html";
public static String editurl = "http://127.0.0.1:8080/blog_edit.html";
public static String detailurl = "http://127.0.0.1:8080/blog_detail.html";
public static String updateurl = "http://127.0.0.1:8080/blog_update.html";
public PageByNoLogin() {
super(updateurl);
}
public void ListPageByNoLogin() throws IOException {
driver.get(listurl);
//调整到登录页面
String expect = driver.getTitle();
getScreenShot(getClass().getName());
assert expect.equals("登录页面");
}
public void DetailPageByNoLogin() throws IOException {
driver.get(listurl);
String expect = driver.getTitle();
getScreenShot(getClass().getName());
assert expect.equals("登录页面");
}
public void EditPageByNoLogin() throws IOException, InterruptedException {
driver.get(editurl);
driver.findElement(By.cssSelector("#title")).sendKeys("第三篇博客");
driver.findElement(By.cssSelector("#submit")).click();
driver.findElement(By.cssSelector("body > h2"));
getScreenShot(getClass().getName());
driver.quit();
}
public void UpdatePageByNoLogin(){
String text=driver.getTitle();
assert text.equals("HTTP状态 404 - 未找到");
}
}
自动化测试用例数量:28
自动化测试结果:pass:27/28,fail:1/28
自动化测试问题是否已经修复:是
四.遗留风险
系统主功能基本没有问题,可能仍有细节未照顾到。
五.测试结果评估
主功能测试通过,项目可以上线。