博客系统测试报告【可上线】
目录
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.拼音分词器…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...