博客系统测试报告【可上线】
目录
1、测试概述
1.1、项目名称
1.2、测试时间
1.3、编写目的
1.4、测试范围
2、测试计划
2.1、测试用例
2.1.1、注册/登录模块
2.1.2、个人中心模块
2.1.3、找回密码模块
2.1.4、博客主列表模块
2.1.5、个人博客列表模块
2.1.6、个人草稿列表模块
2.1.7、博客详情模块
2.1.8、博客编辑页
2.2、bug等级划分
2.3、测试环境与配置
3、测试执行
4、自动化测试
4.1、准备工作
4.2、注册自动化测试
4.3、登录自动化测试
4.4、找回密码自动化测试
4.5、个人中心自动化测试
4.6、博客列表页自动化测试
4.7、个人博客列表页自动化测试
4.8、草稿列表页自动化测试
4.9、博客详情页自动化测试
4.10、博客编辑页自动化测试
3、bug汇总
3.1、功能测试中发现的bug
3.2、兼容性测试中发现的bug
4、总结
4.1、缺陷和限制
4.2、综合评价
1、测试概述
1.1、项目名称
博客系统测试
1.2、测试时间
2023年4月13日——2023年4月。。。。
1.3、编写目的
对自己所编写的博客系统项目中所有的软件测试活动中,包括测试进度、资源问题、风险进行评估,总结测试活动的成功经验与不足,以便今后更好的开展测试工作
1.4、测试范围
| 主体模块 | 测试内容 |
| 用户 | 注册新用户、登录系统、修改密码、找回密码、个人详细信息 |
| 博客 | 博客主列表页、个人博客列表页、个人博客草稿页、博客全文 |
2、测试计划
2.1、测试用例
2.1.1、注册/登录模块

2.1.2、个人中心模块

2.1.3、找回密码模块

2.1.4、博客主列表模块

2.1.5、个人博客列表模块

2.1.6、个人草稿列表模块

2.1.7、博客详情模块

2.1.8、博客编辑页

2.2、bug等级划分
- 崩溃:系统无法运行
- 严重:系统可以运行,但是不稳定
- 一般:系统可以稳定运行,但影响用户使用及体验感
- 次要:建议修改,即可优化部分,不影响用户使用和体验
2.3、测试环境与配置
- 服务器:云服务器CentOS
- PC机:联想yoga13s
- 平台:Windows
- 移动端:OPPO A93 - Android
- 浏览器:Chrome、FireFox、Edge
- 自动化测试工具:Selenium + Junit5
3、测试执行
界面测试:使用手工测试,部分使用自动化测试
安全测试:使用手工测试
易用性测试:使用手工测试
兼容性测试:也是使用手工测试,由于本人只有一部手机、一台电脑,所以除了在电脑上使用Chrome进行自动化测试以外,安卓的兼容性测试、电脑的不同浏览器:Edge、Firefox都是用手工测试
功能测试:部分使用自动化测试,详情继续往下看~
所有的手工测试,在没有bug的情况下,我就不写在这上面了~
4、自动化测试
4.1、准备工作
创建一个maven项目,目录:

引入依赖:
<dependencies><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.2.2</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope></dependency><!-- 保存屏幕截图文件需要用到的包 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-edge-driver</artifactId><version>4.2.2</version><scope>test</scope></dependency></dependencies>
commom包下AutoTestUtils类【封装一些公共方法,方便调用】:
package com.BlogAutoTest.commom;import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:13:02*/
public class AutoTestUtils {public static EdgeDriver driver;//创建驱动对象public static EdgeDriver createDriver() {if(driver == null) {EdgeOptions options = new EdgeOptions();options.addArguments("--remote-allow-origins=*");driver = new EdgeDriver(options);//创建隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));}return driver;}//保存屏幕截图public static void getScreenShot(String str) throws IOException {List<String> list = getTime();//dir+filename//./指的是当前的项目路径下,也就是BlogAutoTest下//./src/test...相对路径String filename = "./src/test/java/com/BlogAutoTest/"+list.get(0)+"/" + str + "_" + list.get(1)+".png";File srcFile = driver.getScreenshotAs(OutputType.FILE);//放到指定位置FileUtils.copyFile(srcFile,new File(filename));}public static List<String> getTime() {//文件按照天的维度按文件进行保存//文件格式 20230302-123244毫秒SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyyMMdd-HHmmssSSS");SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyyMMdd");String filename = simpleDateFormat1.format(System.currentTimeMillis());String dirname = simpleDateFormat2.format(System.currentTimeMillis());List<String> list = new ArrayList<>();list.add(dirname);list.add(filename);return list;}}
4.2、注册自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.*;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:55*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegTest {public static EdgeDriver driver = createDriver();//进入页面@BeforeAllpublic static void baseControl() throws InterruptedException {driver.get("http://43.139.193.116:8085/blog/reg.html");}//1------检查注册页面是否正常打开@Test@Order(1)void regPageLoadRight() throws InterruptedException {driver.findElement(By.cssSelector("body > div.login-container > div > h3"));driver.findElement(By.xpath("//*[@id=\"password2\"]"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));}//2------用户名/密码为空是否有提示信息@Test@Order(2)void RegFail() throws IOException, InterruptedException, AWTException {//1、直接注册driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#password2")).clear();//2、输入用户名driver.findElement(By.cssSelector("#username")).sendKeys("cl");//3、输入密码driver.findElement(By.cssSelector("#password")).sendKeys("123");//4、输入确认密码driver.findElement(By.cssSelector("#password2")).sendKeys("123");getScreenShot(getClass().getName());driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(2000);driver.switchTo().alert().accept();}//3-----正确注册@Test@Order(3)void RegRight() throws IOException, InterruptedException, AWTException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#password2")).clear();String username = String.valueOf(System.currentTimeMillis());String password = "123";driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#password2")).sendKeys(password);getScreenShot(getClass().getName());driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(2000);driver.switchTo().alert().accept();}}
4.3、登录自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.*;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:55*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest {public static EdgeDriver driver = createDriver();//打开页面@BeforeAllstatic void baseControl() {driver.get("http://43.139.193.116:8085/blog/login.html");}//1-------检查页面是否正常打开@Test@Order(1)void loginPageLoadRight() {driver.findElement(By.cssSelector("body > div.login-container > div > div.msg > a.m"));driver.findElement(By.cssSelector("body > div.login-container > div > div.msg > a.ms"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));}//2-------登陆失败@Order(2)@ParameterizedTest@CsvSource({"zhangsan,789","lisi,789"})void loginFail(String username,String password) throws InterruptedException, IOException, AWTException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(2000);driver.switchTo().alert().accept();getScreenShot(getClass().getName());}//3--------登陆成功@Order(3)@ParameterizedTest@CsvSource({"cl,1118","zhangsan,123"})void loginSuc(String username,String password) throws IOException, InterruptedException, AWTException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();//检测是否到个人列表页driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(4) > span:nth-child(1)"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)"));getScreenShot(getClass().getName());driver.navigate().back();}
}
4.4、找回密码自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:13:00*/
public class FindPasswordTest {public static EdgeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://43.139.193.116:8085/blog/find_password.html");}@Testvoid FPSWPageLoadRight() throws IOException {driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(4) > span"));driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(3)"));getScreenShot(getClass().getName());}
}
4.5、个人中心自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:58*/
public class MyCenterTest {public static EdgeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://43.139.193.116:8085/blog/mycenter.html");}@Testvoid MCPageLoadRight() throws IOException {driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(5) > span"));driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(3)"));getScreenShot(getClass().getName());}
}
4.6、博客列表页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:58*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogListTest {//未登录状态 + 登录状态//登录状态下public static EdgeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://43.139.193.116:8085/blog/blog_list.html");}@Testvoid BLPageLoadRight() throws IOException {driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)"));driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(2)"));getScreenShot(getClass().getName());}}
4.7、个人博客列表页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:58*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class MyBlogListTest {public static EdgeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://43.139.193.116:8085/blog/myblog_list.html");}//1------检查页面加载@Test@Order(1)void mListPageLoadRight() throws IOException {driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(4) > span:nth-child(1)"));driver.findElement(By.cssSelector("#username"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)"));getScreenShot(getClass().getName());}//2------检查文章内容是否显示过长@Test@Order(2)void lengthMore() {String artCount = driver.findElement(By.cssSelector("#artCount")).getText();if(artCount.equals("0")) {String expect = "暂无文章";String actual = driver.findElement(By.cssSelector("#artDiv > h3:nth-child(1)")).getText();Assertions.assertEquals(expect,actual);}else {String content = driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > div.desc")).getText();if(content.length() > 200) {Assertions.assertEquals(200,content.length());}}}//3------删除博客操作@Test@Order(3)void delRight() throws InterruptedException, AWTException {String artCount = driver.findElement(By.cssSelector("#artCount")).getText();if(artCount.equals("0")) {//删除driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(6)")).click();Thread.sleep(2000);driver.switchTo().alert().accept();//检查页面是否还存在当前文章Thread.sleep(500);String artCount1 = driver.findElement(By.cssSelector("#artCount")).getText();if(Integer.parseInt(artCount1) == (Integer.parseInt(artCount)-1)) {Assertions.assertTrue(true);} else {Assertions.assertTrue(false);}}}//4------修改博客@Test@Order(4)void ModRight() {String artCount = driver.findElement(By.cssSelector("#artCount")).getText();if(artCount.equals("0")) {String artTitleFirst = driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > div.title")).getText();//修改driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(5)")).click();//检查当前修改页面是否为当前文章driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button:nth-child(4)"));
// String title = driver.findElement(By.cssSelector("#title")).getAttribute("value");Assertions.assertEquals(title,artTitleFirst);
// if(title.equals(artTitleFirst)) {
// Assertions.assertTrue(true);
// } else {
// Assertions.assertTrue(false);
// }driver.navigate().back();}}//5-------查看全文@Test@Order(5)void lookArt() {String artCount = driver.findElement(By.cssSelector("#artCount")).getText();if(artCount.equals("0")) {
// String artTitleFirst = driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > div.title")).getText();//查看全文driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(4)")).click();//检查文章详情页是否是当前文章//先检查页面是否加载出来了driver.findElement(By.cssSelector("body > div.container > div.container-right > div.upvote > button"));driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(3) > div.textarea-comment > button"));
// String title = driver.findElement(By.cssSelector("#title")).getText();
// Assertions.assertEquals(title,artTitleFirst);}}}
4.8、草稿列表页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:57*/public class DraftListTest {public static EdgeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://43.139.193.116:8085/blog/mydraft_list.html");}@Testvoid BDraftPageLoadRight() throws IOException {driver.findElement(By.cssSelector("#username"));driver.findElement(By.cssSelector("body > div.container > div.container-left > div > a"));getScreenShot(getClass().getName());}}
4.9、博客详情页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:13:01*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogDetailTest {public static EdgeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://43.139.193.116:8085/blog/blog_content.html?id=1");}@Order(1)@Testvoid BDetailPageLoadRight() throws IOException {driver.findElement(By.cssSelector("body > div.container > div.container-right > div.upvote > button"));driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(3) > div.textarea-comment > button"));getScreenShot(getClass().getName());}//点赞@Order(2)@Testvoid VoteRight() throws InterruptedException, AWTException {String voteCount = "0";String NewVote = "0";try {voteCount = driver.findElement(By.cssSelector("#tag")).getText();//原始点赞数} catch (NumberFormatException e) {e.printStackTrace();}//点赞driver.findElement(By.cssSelector("body > div.container > div.container-right > div.upvote > button")).click();Thread.sleep(2500);driver.switchTo().alert().accept();try {NewVote = driver.findElement(By.cssSelector("#tag")).getText();//当前点赞数if(Integer.parseInt(voteCount) >= 0 && Integer.parseInt(NewVote) >= 0) {if ((Integer.parseInt(NewVote) + 1) == Integer.parseInt(voteCount) ||(Integer.parseInt(NewVote) - 1) == Integer.parseInt(voteCount)) {Assertions.assertTrue(true);} else {Assertions.assertTrue(false);}} else {Assertions.assertTrue(false);}} catch (NumberFormatException e) {e.printStackTrace();}}//评论@Order(3)@Testvoid CommentRight() throws InterruptedException, AWTException {String comment = "很棒!";//评论driver.findElement(By.cssSelector("#text-comment")).sendKeys(comment);driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(3) > div.textarea-comment > button")).click();Thread.sleep(2000);Alert alert = driver.switchTo().alert();alert.accept();//检查String comment1 = driver.findElement(By.cssSelector("#comment-list > div > div.comment-content")).getText();if(comment.equals(comment1)) {Assertions.assertTrue(true);} else {Assertions.assertTrue(false);}}
}
4.10、博客编辑页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:13:01*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogEditTest {public static EdgeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://43.139.193.116:8085/blog/blog_add.html");}@Test@Order(1)void BEditPageLoadRight() throws IOException {driver.findElement(By.cssSelector("#day"));driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button:nth-child(4)"));getScreenShot(getClass().getName());}@Test@Order(2)void addArt() throws InterruptedException, AWTException {String title = "周一";driver.findElement(By.cssSelector("#title")).sendKeys(title);driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a")).click();driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(5) > a")).click();driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button:nth-child(6)")).click();Thread.sleep(2000);driver.switchTo().alert().accept();String t = driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > div.title")).getText();if(t.equals(title)) {Assertions.assertTrue(true);} else {Assertions.assertTrue(false);}}
}
3、bug汇总
3.1、功能测试中发现的bug
| 模块 | 测试版本 | 测试环境 | 测试步骤 | 实际结果 | 预期结果 | 其他附件 |
| 博客主/个人/草稿列表页 | Test003 | Chrome- 113.0.5668.0 | 输入主页url | 文章简介只含正文,不包括MarkDown编辑器的某些特殊字符 | 文章简介只含正文,不包括MarkDown编辑器的某些特殊字符 | ![]() |
| 草稿箱模块 | Test003 | Chrome- 113.0.5668.0 | 登录-进入草稿箱 | 个人信息栏下的文章数与草稿箱的文章数不对应 | 个人信息栏下的文章数与草稿箱的文章数对应 | ![]() |
| 博客详情页 | Test003 | Chrome- 113.0.5668.0 | 登录-查看某文章的详情页-评论 | 评论列表无评论者的头像 | 评论列表有评论者的头像 | ![]() |
3.2、兼容性测试中发现的bug
| 模块 | 测试版本 | 测试环境 | 测试步骤 | 实际结果 | 预期结果 | 其他附件 |
| 登录模块 | Test003 | OPPPA93-QQ浏览器13.8.0.0039 | 输入url-回车 | ![]() | ||
| 个人博客列表模块 | Test003 | OPPPA93-QQ浏览器13.8.0.0039 | 登录-进入个人博客列表页 | ![]() | ||
| 博客主列表页 | Test003 | OPPPA93-QQ浏览器13.8.0.0039 | 输入url-回车 | ![]() | ||
| 草稿箱 | Test003 | OPPPA93-QQ浏览器13.8.0.0039 | 登录-进入草稿箱 | ![]() | ||
| 博客编辑页 | Test003 | OPPPA93-QQ浏览器13.8.0.0039 | 登录-进入写博客页 | ![]() | ||
| 个人中心 | Test003 | OPPPA93-QQ浏览器13.8.0.0039 | 登录-进入个人中心 | ![]() | ||
| 博客详情页 | Test003 | OPPPA93-QQ浏览器13.8.0.0039 | 通过url-进入某篇文章 | ![]() |
结论:界面设计不兼容移动端,但功能支持
4、总结
4.1、缺陷和限制
该博客系统只满足了最基本的功能,吸引用户量,还需要拓展更多的功能,例如:登陆的验证码、用户头像、关注、粉丝、用户周排名、月排名、总排名、主页皮肤等等;另外性能方面也存在不足,还需要继续优化~
4.2、综合评价
可以上线~
相关文章:
博客系统测试报告【可上线】
目录 1、测试概述 1.1、项目名称 1.2、测试时间 1.3、编写目的 1.4、测试范围 2、测试计划 2.1、测试用例 2.1.1、注册/登录模块 2.1.2、个人中心模块 2.1.3、找回密码模块 2.1.4、博客主列表模块 2.1.5、个人博客列表模块 2.1.6、个人草稿列表模块 2.1.7、博客详…...
shell中的for循环和if判断
一.编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh [rootserver ~]# vim for1.sh 2.编写脚本for1.sh 3.执行脚本for1.sh [roo…...
【Unity入门】16.脚本引用组件
【Unity入门】脚本引用组件 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)脚本引用普通组件 (1)点击控制音频播放 还记得我们的车载音乐AudioSource吗?…...
无线蓝牙耳机哪款音质好?目前音质最好的无线蓝牙耳机推荐
现如今,蓝牙耳机已经是一个非常实用且常见的数码产品了,不少人喜欢戴着蓝牙耳机听歌,玩游戏。一款音质好的蓝牙耳机不止能听个响,还能给人极致的听觉享受。在此,我来给大家分享几款目前音质最好的无线蓝牙耳机…...
【云原生进阶之容器】第六章容器网络6.6.1--Cilium网络方案概述
《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述...
集中式版本控制工具 —— SVN
一、简介 1️⃣ SVN 是什么? 代码版本管理工具他能记住每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2️⃣ SVN 与 Git 相比有什么优势? 使用简单、上手快目录级权限控制,企业安全必备子目录 Checkout,…...
【Dom获取属性操作】JavaScript 全栈体系(十)
Web APIs 第四章 操作元素属性 一、操作元素常用属性 还可以通过 JS 设置/修改标签元素属性,比如通过 src更换 图片最常见的属性比如: href、title、src 等语法: 对象.属性 值 <!DOCTYPE html> <html lang"en">&…...
C# 中的多态和虚方法,如何实现多态和使用虚方法?
在 C# 中,多态(Polymorphism)是面向对象编程的基本特性之一,它允许使用不同的对象和方法来执行同一操作。C# 中实现多态的方式主要是通过虚方法和抽象类。 虚方法是一种允许子类覆盖的方法,它的实现是在运行时动态确定…...
R软件使用一些常见的问题
以下均是个人经验摸索的解决办法,使用 Rstudio 执行命令,如有高手能更好地解决问题,还望指教,提前感谢。 问题一: 有些 package 因为编辑得比较早又没有继续更新,所以需要用旧版本的 R 才能正常运行&#…...
为什么需要uboot?
一、先看概念 bootROM:一种固化在芯片内部的只读存储器(ROM),用于启动和初始化系统。BootROM 中通常包含了一些预先编写好的代码,用于完成系统启动前的基本初始化和配置,例如初始化时钟、GPIO控制器、中断…...
Qt布局实战:实现高效、美观的GUI应用程序
Qt布局实战:实现高效、美观的GUI应用程序 引言 (Introduction)1.1 Qt布局简介 (Brief introduction to Qt layouts)1.2 Qt布局的优势 (Advantages of Qt layouts) 2.布局类型 (Layout Types)2.1 水平布局 (QHBoxLayout)2.1.1 创建水平布局2.1.2 向水平布局中添加部件…...
推荐几款项目管理工具,提高你的团队协作效率
如何管理团队才能使团队发挥最大的价值,如果团队缺少协作,就会因为团队的内耗和冲突导致项目无法完成,如何提高团队协作效率呢?我们可以借助团队协作类的项目管理工具。 几个常见的项目管理工具: 1、进度猫 进度猫是…...
SQL101 检索每个顾客的名称和所有的订单号(一)
描述 Customers表代表顾客信息含有顾客id cust_id和 顾客名称 cust_name cust_idcust_namecust10andycust1bencust2tonycust22tomcust221ancust2217hex Orders表代表订单信息含有订单号order_num和顾客id cust_id order_numcust_ida1cust10a2cust1a3cust2a4cust22a5cust221…...
mac压缩文件多了__MACOSX目录问题
文章目录 背景原因解决方案:更换压缩方式分析问题拓展(.DS_Store) 背景 项目中有一个场景,需要把目录压缩为app离线包的zip 但是压缩之后一致打不开,别人上传的zip是好的 原因 如图,我上传的在安卓设备…...
1.17 从0开始学习Unity游戏开发--场景切换
前面的所有文章我们都在一个固定的游戏场景内进行开发,在最开始介绍场景这个概念的时候就已经提及,这个场景可以是一张地图,或者是一个对战房间等等,所以显然这个场景可以有多个,并且可以从一个场景切换到另外一个场景…...
【golang学习笔记】——(五)Go格式化统一代码风格
我们在入职一家新公司的时候,除了要学习公司的流程规范和规章制度,还会做的一件事情就是进行公司编码规范的学习,基于google的C规范下,做了各自的发散和规范,久而久之就是包罗万象的样子,疲于应付各种规范约…...
CAD转SHP最好的方法 赶快收藏起来吧
1、利用 ArcToolsbox 工具先将 DWG 文件转为 MDB 通过 CASS 软件生成的 DWG 文件,字段中包含有很多属性内容,所以我们先将 DWG 格式 的文件转换为 MDB 格式,再通过 MDB 转换为 SHP 格式数据进行整理。具体步骤如下: 通过 ArcTool…...
PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor
前言: 本文主要介绍了如何使用Python VTK高亮显示actor,使用Python语言,高亮显示选中的actor。当窗口中的圆球actor被选中时,会变成红色,并且会显示actor三遍面片边缘信息。 效果: VTK VTK,&…...
TCP和UDP通信对比
tcp通信流程 服务器: 创建流式套接字 绑定 监听 提取 读写 关闭 客户端: 创建流式套接字 连接 读写 关闭 收发数据: read recv ssize_t recv(int sockfd, void *buf, size_t len, int flags); //flagsMSG_PEEK 读数据不会删除缓冲区的数据 write send ssize_t send(int…...
SpringCloud:ElasticSearch之自动补全
当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图: 这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。 因为需要根据拼音字母来推断,因此要用到拼音分词功能。 1.拼音分词器…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...









