当前位置: 首页 > news >正文

博客系统测试报告【可上线】

目录

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

模块测试版本测试环境测试步骤实际结果预期结果其他附件
博客主/个人/草稿列表页Test003Chrome- 113.0.5668.0输入主页url文章简介只含正文,不包括MarkDown编辑器的某些特殊字符文章简介只含正文,不包括MarkDown编辑器的某些特殊字符
草稿箱模块Test003Chrome- 113.0.5668.0登录-进入草稿箱个人信息栏下的文章数与草稿箱的文章数不对应个人信息栏下的文章数与草稿箱的文章数对应
博客详情页Test003Chrome- 113.0.5668.0登录-查看某文章的详情页-评论评论列表无评论者的头像评论列表有评论者的头像

 3.2、兼容性测试中发现的bug

模块测试版本测试环境测试步骤实际结果预期结果其他附件
登录模块Test003OPPPA93-QQ浏览器13.8.0.0039输入url-回车
个人博客列表模块Test003OPPPA93-QQ浏览器13.8.0.0039登录-进入个人博客列表页
博客主列表页Test003OPPPA93-QQ浏览器13.8.0.0039输入url-回车
草稿箱Test003OPPPA93-QQ浏览器13.8.0.0039登录-进入草稿箱
博客编辑页Test003OPPPA93-QQ浏览器13.8.0.0039登录-进入写博客页
个人中心Test003OPPPA93-QQ浏览器13.8.0.0039登录-进入个人中心
博客详情页Test003OPPPA93-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账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh [rootserver ~]# vim for1.sh 2.编写脚本for1.sh 3.执行脚本for1.sh [roo…...

【Unity入门】16.脚本引用组件

【Unity入门】脚本引用组件 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;脚本引用普通组件 &#xff08;1&#xff09;点击控制音频播放 还记得我们的车载音乐AudioSource吗&#xff1f;…...

无线蓝牙耳机哪款音质好?目前音质最好的无线蓝牙耳机推荐

现如今&#xff0c;蓝牙耳机已经是一个非常实用且常见的数码产品了&#xff0c;不少人喜欢戴着蓝牙耳机听歌&#xff0c;玩游戏。一款音质好的蓝牙耳机不止能听个响&#xff0c;还能给人极致的听觉享受。在此&#xff0c;我来给大家分享几款目前音质最好的无线蓝牙耳机&#xf…...

【云原生进阶之容器】第六章容器网络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 是什么&#xff1f; 代码版本管理工具他能记住每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2️⃣ SVN 与 Git 相比有什么优势&#xff1f; 使用简单、上手快目录级权限控制&#xff0c;企业安全必备子目录 Checkout&#xff0c;…...

【Dom获取属性操作】JavaScript 全栈体系(十)

Web APIs 第四章 操作元素属性 一、操作元素常用属性 还可以通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性比如&#xff1a; href、title、src 等语法&#xff1a; 对象.属性 值 <!DOCTYPE html> <html lang"en">&…...

C# 中的多态和虚方法,如何实现多态和使用虚方法?

在 C# 中&#xff0c;多态&#xff08;Polymorphism&#xff09;是面向对象编程的基本特性之一&#xff0c;它允许使用不同的对象和方法来执行同一操作。C# 中实现多态的方式主要是通过虚方法和抽象类。 虚方法是一种允许子类覆盖的方法&#xff0c;它的实现是在运行时动态确定…...

R软件使用一些常见的问题

以下均是个人经验摸索的解决办法&#xff0c;使用 Rstudio 执行命令&#xff0c;如有高手能更好地解决问题&#xff0c;还望指教&#xff0c;提前感谢。 问题一&#xff1a; 有些 package 因为编辑得比较早又没有继续更新&#xff0c;所以需要用旧版本的 R 才能正常运行&#…...

为什么需要uboot?

一、先看概念 bootROM&#xff1a;一种固化在芯片内部的只读存储器&#xff08;ROM&#xff09;&#xff0c;用于启动和初始化系统。BootROM 中通常包含了一些预先编写好的代码&#xff0c;用于完成系统启动前的基本初始化和配置&#xff0c;例如初始化时钟、GPIO控制器、中断…...

Qt布局实战:实现高效、美观的GUI应用程序

Qt布局实战&#xff1a;实现高效、美观的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 向水平布局中添加部件…...

推荐几款项目管理工具,提高你的团队协作效率

如何管理团队才能使团队发挥最大的价值&#xff0c;如果团队缺少协作&#xff0c;就会因为团队的内耗和冲突导致项目无法完成&#xff0c;如何提高团队协作效率呢&#xff1f;我们可以借助团队协作类的项目管理工具。 几个常见的项目管理工具&#xff1a; 1、进度猫 进度猫是…...

SQL101 检索每个顾客的名称和所有的订单号(一)

描述 Customers表代表顾客信息含有顾客id cust_id和 顾客名称 cust_name cust_idcust_namecust10andycust1bencust2tonycust22tomcust221ancust2217hex Orders表代表订单信息含有订单号order_num和顾客id cust_id order_numcust_ida1cust10a2cust1a3cust2a4cust22a5cust221…...

mac压缩文件多了__MACOSX目录问题

文章目录 背景原因解决方案&#xff1a;更换压缩方式分析问题拓展&#xff08;.DS_Store&#xff09; 背景 项目中有一个场景&#xff0c;需要把目录压缩为app离线包的zip 但是压缩之后一致打不开&#xff0c;别人上传的zip是好的 原因 如图&#xff0c;我上传的在安卓设备…...

1.17 从0开始学习Unity游戏开发--场景切换

前面的所有文章我们都在一个固定的游戏场景内进行开发&#xff0c;在最开始介绍场景这个概念的时候就已经提及&#xff0c;这个场景可以是一张地图&#xff0c;或者是一个对战房间等等&#xff0c;所以显然这个场景可以有多个&#xff0c;并且可以从一个场景切换到另外一个场景…...

【golang学习笔记】——(五)Go格式化统一代码风格

我们在入职一家新公司的时候&#xff0c;除了要学习公司的流程规范和规章制度&#xff0c;还会做的一件事情就是进行公司编码规范的学习&#xff0c;基于google的C规范下&#xff0c;做了各自的发散和规范&#xff0c;久而久之就是包罗万象的样子&#xff0c;疲于应付各种规范约…...

CAD转SHP最好的方法 赶快收藏起来吧

1、利用 ArcToolsbox 工具先将 DWG 文件转为 MDB 通过 CASS 软件生成的 DWG 文件&#xff0c;字段中包含有很多属性内容&#xff0c;所以我们先将 DWG 格式 的文件转换为 MDB 格式&#xff0c;再通过 MDB 转换为 SHP 格式数据进行整理。具体步骤如下&#xff1a; 通过 ArcTool…...

PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor

前言&#xff1a; 本文主要介绍了如何使用Python VTK高亮显示actor&#xff0c;使用Python语言&#xff0c;高亮显示选中的actor。当窗口中的圆球actor被选中时&#xff0c;会变成红色&#xff0c;并且会显示actor三遍面片边缘信息。 效果&#xff1a; VTK VTK&#xff0c;&…...

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之自动补全

当用户在搜索框输入字符时&#xff0c;我们应该提示出与该字符有关的搜索项&#xff0c;如图&#xff1a; 这种根据用户输入的字母&#xff0c;提示完整词条的功能&#xff0c;就是自动补全了。 因为需要根据拼音字母来推断&#xff0c;因此要用到拼音分词功能。 1.拼音分词器…...

TOOM解析如何搭建一套适合自己的舆情监测系统?完整的实战指南

随着互联网的普及和社交媒体的盛行&#xff0c;人们在网络上的活动越来越多&#xff0c;同时也涌现出大量的信息和舆情。这些信息和舆情在一定程度上会影响社会和个人的发展和进步。因此&#xff0c;舆情监测逐渐成为一项重要的任务。在本篇文章中&#xff0c;我们将为大家介绍…...

技术分享 | OceanBase 手滑误删了数据文件怎么办

作者&#xff1a;张乾 外星人2号&#xff0c;现兼任六位喵星人的资深铲屎官。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 手滑误删了数据文件&#xff0c;并且没有可替换的节点时&…...

windows上Git Bash支持常用命令gcc tree zip wget cmake ninja

windows上Git Bash支持常用命令gcc tree zip wget cmake ninja 前言 Git Bash基于MinGW64, 提供了win32下的linux命令环境&#xff0c;如ls、cat、tar等。 但是Git Bash还是缺少一些命令&#xff0c;如gcc、make、tree、zip、wget、cmake、ninja等 1. Git Bash支持其他命令…...

面试题30天打卡-day10

1、String 和 StringBuffer、StringBuilder 的区别是什么&#xff1f; String、StringBuffer、StringBuilder主要的区别在于执行效率和线程安全上。 String&#xff1a;String字符串常量&#xff0c;意味着它是不可变的&#xff0c;导致每次对String都会生成新的String对象&a…...

【python】制作一个简单的界面,有手就行的界面~

目录 前言准备工作试手小案例开始我们今天的案例教学尾语 &#x1f49d; 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! ttkbootstrap 是一个基于 tkinter 的界面美化库&#xff0c; 使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序。 ttkbootstrap …...

基于RK3568的Linux驱动开发—— GPIO知识点(二)

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主系列基于RK3568的Linux驱动开发——GPIO知识点&#xff08;一&#xff09;_daisy.skye的博客-CSDN博客 查看goio使用情况 cat /sys/kernel/debug/gpio 1|rk3568_r:# cat /sys/kernel/debug/gpio gpiochip0: GPIOs 0-3…...

item_get-获得aliexpress商品详情API的调用参数说明

item_get-获得aliexpress商品详情 aliexpress.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;免&#xff09;&#xff08;测&#xff09;&#xff08;试&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&…...

【Python_Scrapy学习笔记(三)】Scrapy框架之全局配置文件settings.py详解

Scrapy框架之全局配置文件settings.py详解 前言 settings.py 文件是 Scrapy框架下&#xff0c;用来进行全局配置的设置文件&#xff0c;可以进行 User-Agent 、请求头、最大并发数等的设置&#xff0c;本文中介绍 settings.py 文件下的一些常用配置 正文 1、爬虫的项目目录…...

spark读写时序数据库 TDengine 错误总结

最近在用spark读取、写入TDengine 数据库遇到了这样一个问题&#xff1a; JDBCDriver找不到动态链接库&#xff08;no taos in java.library.path&#xff09; 我本地都好好的&#xff0c;但是一上服务器写入就会报这个错误&#xff0c;看了很久没有排查出问题&#xff0c;后…...

Web中间件常见漏洞

一、IIS中间组件 1、PUT漏洞 原理&#xff1a;IIS开启了WebDAV&#xff0c;配置了可以写入的权限&#xff0c;造成了任意文件上传漏洞。 防御&#xff1a;关闭webDAV&#xff1b;关闭写入权限 2、短文件名猜解 原理&#xff1a; IIS的短文件名机制&#xff0c;可以暴力破解…...