怎样建设档案馆网站,免费 wordpress主题,本地php网站搭建环境,温州城市建设投资集团网站项目背景
个人博客系统采用了 SSM 框架与 Redis 缓存技术的组合 #xff0c;为用户提供了一个功能丰富、性能优越的博客平台。 在技术架构上 #xff0c;SSM 框架确保了系统的稳定性和可扩展性。Spring 负责管理项目的各种组件 #xff0c;Spring MVC 实现了清晰的请求处理…项目背景
个人博客系统采用了 SSM 框架与 Redis 缓存技术的组合 为用户提供了一个功能丰富、性能优越的博客平台。 在技术架构上 SSM 框架确保了系统的稳定性和可扩展性。Spring 负责管理项目的各种组件 Spring MVC 实现了清晰的请求处理 和视图渲染 MyBatis 则高效地处理数据库操作。功能方面 用户可以轻松撰写、编辑和发布博客文章。 前端主要有 登录/注册、个人中心、操作博客的相关界面构成。
后端主要有 登录/注册、用户信息操作、博客等相关操作。 项目功能
注册功能新用户需要填写用户名和密码验证通过后需要把用户名和加密的密码存入数据库。个人中心注册/登录之后跳转到该页面这个页面可以添加邮箱/Gitee/修改头像。同时还可以跳转到个人博客列表或者博客广场。 添加邮箱填入绑定的邮箱号之后会收到一条验证码。当验证码通过后就会绑定邮箱。同时把绑定的邮箱信息存入数据库。修改邮箱同添加邮箱。添加Gitee选择自己的Gitee链接提交完成后会存入数据库。点击Gitee会跳转到个人首页。修改Gitee同添加Gitee。我的博客点击会跳到个人博客列表页。博客广场点击会跳到博客广场。我的博客只会显示自己写的博客。博客按照发布时间升序排列。只显示每篇博客的标题发布时间文章的前一部分的内容。可以通过查看全文查看整篇文章。可以通过修改来修改文章的内容。通过删除来删除选中的文章。博客广场与我的博客列表相似只不过这里是全部人的博客。另外只有查看全文的显示。写博客当登录之后就可以点击写博客进行博客的书写和发布。注销当登陆后可以点击注销进行退出。 测试
功能测试 用户
注册 登录 注销 头像 邮箱 Gitee 博客
个人广场 博客广场 查看博客 增加博客 修改博客 删除博客 自动化测试
引入依赖 dependencygroupIdorg.seleniumhq.selenium/groupIdartifactIdselenium-java/artifactIdversion4.0.0/version/dependency!-- 保存屏幕截图需要用到的包--dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version/dependency!-- 添加junit5依赖--dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter/artifactIdversion5.8.2/versionscopetest/scope/dependencydependencygroupIdorg.junit.platform/groupIdartifactIdjunit-platform-suite/artifactIdversion1.8.2/versionscopetest/scope/dependency
创建公共类
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;public class AutoTestUtils {// 为了降低代码冗余度直接在这里实现代码的复用public static ChromeDriver driver;// 创建驱动对象public static ChromeDriver createDriver() {// 无头模式ChromeOptions options new ChromeOptions();options.addArguments(-headless);// 判断驱动对象是否已经创建if(driver null) {// 无头模式driver new ChromeDriver(options);// 默认的有头模式
// driver new ChromeDriver();// 创建隐式等待确保页面渲染出来driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(6));}return driver;}/** 保存现场截图* 把所有用例的执行结果进行保存* 注意保存的屏幕截图的名字应该是动态生成的否则会进行图片的覆盖*/// 获取动态文件名public ListString getTime() {SimpleDateFormat sim1 new SimpleDateFormat(yyyyMMdd-HHmmssSS);String fileName sim1.format(System.currentTimeMillis());// 希望文件按天的维度进行文件夹的分类保存SimpleDateFormat sim2 new SimpleDateFormat(yyyyMMdd);String dirName sim2.format(System.currentTimeMillis()); // 文件夹的名字// 使用链表进行保存ListString list new ArrayList();list.add(dirName);list.add(fileName);return list;}// 为了区分是哪个用例返回的可以加上用例的名称进行保存public void getScreenShot(String str) throws IOException {ListString list getTime();// 文件保存路径dirNamefileName// ./指的是当前路径这里来说就是BlogAutoTest目录下// 如果目前期望的路径./src/test/java/com/blogWebAutoTest/dirName/fileName// 注意图片保存的路径以及名称String fileName ./src/test/java/com/blogWebAutoTest/ list.get(0) / str _ list.get(1) .png; // 保存的路径名称File scrFile driver.getScreenshotAs(OutputType.FILE); // 获取到的屏幕截图// 把屏幕截图生成的文件放到指定路径下FileUtils.copyFile(scrFile,new File(fileName));}
}
具体测试
测试详情页
import com.blogWebAutoTest.common.AutoTestUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;import java.io.IOException;
import java.time.Duration;// 博客详情页测试
TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogDetailTest extends AutoTestUtils {public static ChromeDriver driver createDriver();BeforeAllstatic void baseControl() {driver.get(http://127.0.0.1:8370/myblog_list.html);}/** 详情页打开正确但是因为没有blogId会出现Undefined*/TestOrder(1)void undefindedTest() throws IOException {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));String expect ;String fact driver.findElement(By.xpath(/html/body/div[2]/div[2]/div/div[1])).getText();getScreenShot(getClass().getName());Assertions.assertEquals(expect,fact);}/** 测试详情页正确打开[有blogId]* 测试标题以及时间必定有* 这里其实还有一种情况不存在blogId*/TestOrder(2)void blogDetailPageRight() throws IOException {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));driver.get(http://127.0.0.1:8370/blog_content.html?id9);driver.findElement(By.cssSelector(body div.container div.container-right div h3));driver.findElement(By.cssSelector(body div.container div.container-right div div.date));driver.findElement(By.xpath(//*[id\content\]/p));getScreenShot(getClass().getName());driver.findElement(By.xpath(/html/body/div[1]/a[1])).click(); // 回到列表页}/** 测试“删除”按钮* 删除后会跳回到列表页然后与最上面的时间进行比对即可【不比较标题因为标题可能为空】* 这里是要删除第一篇博客*/TestOrder(3)void deleteTest() throws IOException {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));getScreenShot(getClass().getName());driver.findElement(By.cssSelector(body div.container div.container-right div:nth-child(1) a)).click();String before driver.findElement(By.xpath(/html/body/div[2]/div[2]/div/div[1])).getText();driver.findElement(By.cssSelector(#delete_button)).click();String after driver.findElement(By.cssSelector(body div.container div.container-right div:nth-child(1) div.date)).getText();getScreenShot(getClass().getName());Assertions.assertNotEquals(before,after); // 比对不同}// 注意更改驱动释放位置在最后一个类/测试用例之后AfterAllstatic void driverQuite() {driver.quit();}
}
其他界面也是类似。
最后一起跑一下。
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;// 测试套件运行
Suite
SelectClasses({BlogLoginTest.class, BlogListTest.class,BlogEditTest.class,BlogDetailTest.class,DriverQuiteTest.class})
public class runSuite {
}