个人博客系统测试报告

超、凢脫俗 2024-02-28 04:20 123阅读 0赞

个人博客系统测试报告

  • 一.项目背景
  • 二.项目功能
  • 三.测试用例
    • 3.1 功能测试
    • 3.2 自动化测试(部分测试)
      • 3.2.1登陆页面
      • 3.2.2博客详情页
      • 3.2.3博客编辑页
      • 3.2.4个人列表页
      • 3.2.5测试结果
    • 3.3 性能测试

一.项目背景

当学习完一项技能后,我们总会习惯通过博客来总结所学的知识点,方便后期遗忘时随时查看和快速复习。本次开发的类似于CSDN的个人博客系统便是为了更加轻量和方便地记录自己的学习笔记,方便自己后期学习记录。

二.项目功能

该个人博客系统主要实现了以下功能:注册和登录、注销、编写博客、修改博客、删除博客、查看博客详情,修改个人信息等功能。

  • 注册登录功能:用户输入想创建的账号和密码,点击注册按钮无误后跳转到登陆页面,在登录页面输入正确的账号密码,登录成功后就会跳转到博客列表页。在右上角存在网站主页,注册两个按钮。
  • 博客列表页面:可以在列表页查看用户所有的博客文章简介(支持分页功能),其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能。
  • 博客详情页面:在博客列表页面下方点击“查看全文”按钮就会跳转到当前博客详情页,此时就可以看到该篇博客的完整内容。在右上角有主页和写博客两个功能
  • 个人信息页面:该页面显示用户全部的个人信息,包括头像,性别,账号,昵称,个人简介等,用户也可以修改除账号以外的全部信息。
  • 博客编辑页面:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写(支持markdown格式),点击“发布文章”后就可以成功发布文章,此时就会跳转到我的博客页面。

三.测试用例

3.1 功能测试

在这里插入图片描述

3.2 自动化测试(部分测试)

实现工具类,增加代码复用
为了避免在使用时频繁创建驱动类,我们可以定义一个功能类使用单例创建驱动对象。

  1. // An highlighted block
  2. package com.example.blogautotest.common;
  3. import org.apache.commons.io.FileUtils;
  4. import org.openqa.selenium.OutputType;
  5. import org.openqa.selenium.chrome.ChromeDriver;
  6. import org.openqa.selenium.edge.EdgeDriver;
  7. import java.io.File;
  8. import java.io.IOException;
  9. import java.text.SimpleDateFormat;
  10. import java.time.Duration;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. public class AutotestUtils {
  14. public static EdgeDriver driver;
  15. //创建驱动对象
  16. public static EdgeDriver createDriver(){
  17. //单例模式
  18. if(driver==null){
  19. driver=new EdgeDriver();
  20. //创建隐式等待
  21. driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
  22. }
  23. return driver;
  24. }
  25. //获取当前时间将截图按照时间保存
  26. public List<String> getTime(){
  27. //文件夹以天保存
  28. //截图以毫秒时间戳保存
  29. SimpleDateFormat sim1=new SimpleDateFormat("yyyyMMdd-HHmmssSS");
  30. SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");
  31. String filename=sim1.format(System.currentTimeMillis());
  32. String dirname=sim2.format(System.currentTimeMillis());
  33. List<String> list = new ArrayList<>();
  34. list.add(dirname);
  35. list.add(filename);
  36. return list;
  37. }
  38. //获取屏幕截图,把所有的用例执行的结果保存下来
  39. public void getScreenShot(String str) throws IOException {
  40. List<String> list=getTime();
  41. // ./指的是当前的项目路径下,也就是BlogAutoTest下
  42. String filename="./src/test/java/com/blogautotest/"+list.get(0)+"/"+str+"_"+list.get(1)+".png";
  43. File srcfile=driver.getScreenshotAs(OutputType.FILE);
  44. //把屏幕截图生成的文件放到指定的路径
  45. FileUtils.copyFile(srcfile,new File(filename));
  46. }
  47. }

3.2.1登陆页面

创建一个类(自定义名为BlogLoginTest )继承 AutoTestUtils 类,获取驱动,之后选取典型 case 使用参数化注解对异常、正常登录分别进行测试,进行相应弹窗处理,最后进行屏幕截图.

  1. package com.example.blogautotest.Tests;
  2. import com.example.blogautotest.common.AutotestUtils;
  3. import org.junit.jupiter.api.*;
  4. import org.junit.jupiter.params.ParameterizedTest;
  5. import org.junit.jupiter.params.provider.CsvSource;
  6. import org.openqa.selenium.By;
  7. import org.openqa.selenium.edge.EdgeDriver;
  8. import java.io.IOException;
  9. //设置优先级
  10. @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
  11. public class BlogLoginTest extends AutotestUtils {
  12. public static final String UNIVERSAL_KAPTCHA_CODE="c8fd27d19b2aa9fa24affd2a4726778c";
  13. public static EdgeDriver driver=createDriver();
  14. @BeforeAll
  15. public static void baseControl(){
  16. driver.get("http://127.0.0.1:8080/login.html");
  17. }
  18. /*
  19. 检查登录页面打开是否正确
  20. 检查点:登录标题 用户名是否存在
  21. */
  22. @Test
  23. @Order(1)
  24. public void loginPageLoadRight() throws IOException {
  25. //检验页面是否加载正确(两个检查点)
  26. driver.findElement(By.cssSelector("body > div.login-container > div > h3"));
  27. driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(2) > span"));
  28. getScreenShot(getClass().getName());
  29. }
  30. @ParameterizedTest
  31. @CsvSource({
  32. "zhangsan,123","admin,admin"})
  33. @Order(2)
  34. public void loginSuc(String name , String password) throws InterruptedException, IOException{
  35. driver.findElement(By.cssSelector("#username")).clear();
  36. driver.findElement(By.cssSelector("#password")).clear();
  37. driver.findElement(By.cssSelector("#rightCode")).clear();
  38. driver.findElement(By.cssSelector("#username")).sendKeys(name);
  39. driver.findElement(By.cssSelector("#password")).sendKeys(password);
  40. driver.findElement(By.cssSelector("#rightCode")).sendKeys(UNIVERSAL_KAPTCHA_CODE);
  41. driver.findElement(By.cssSelector("#submit")).click();
  42. //处理弹窗
  43. Thread.sleep(300);
  44. driver.switchTo().alert().accept();
  45. //对登录结果进行检测,存在草稿页元素代表登录成功
  46. driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
  47. //getScreenShot(getClass().getName());
  48. driver.navigate().back();
  49. }
  50. @ParameterizedTest
  51. @CsvSource({
  52. "admin,123","zhangsan,666"})
  53. @Order(3)
  54. public void loginFail(String name,String password) throws IOException, InterruptedException {
  55. driver.findElement(By.cssSelector("#username")).clear();
  56. driver.findElement(By.cssSelector("#password")).clear();
  57. driver.findElement(By.cssSelector("#rightCode")).clear();
  58. driver.findElement(By.cssSelector("#username")).sendKeys(name);
  59. driver.findElement(By.cssSelector("#password")).sendKeys(password);
  60. driver.findElement(By.cssSelector("#rightCode")).sendKeys(UNIVERSAL_KAPTCHA_CODE);
  61. driver.findElement(By.cssSelector("#submit")).click();
  62. //处理弹窗
  63. Thread.sleep(300);
  64. //获取弹窗内容
  65. String text=driver.switchTo().alert().getText();
  66. String except="登陆成功!";
  67. driver.switchTo().alert().accept();
  68. Assertions.assertNotEquals(except,text);
  69. //获取当前页面截屏
  70. //getScreenShot(getClass().getName());
  71. }
  72. }

3.2.2博客详情页

  1. package com.example.blogautotest.Tests;
  2. import com.example.blogautotest.common.AutotestUtils;
  3. import org.junit.jupiter.api.BeforeAll;
  4. import org.junit.jupiter.api.Test;
  5. import org.openqa.selenium.By;
  6. import org.openqa.selenium.chrome.ChromeDriver;
  7. import org.openqa.selenium.edge.EdgeDriver;
  8. import java.io.IOException;
  9. public class BlogDetailTest extends AutotestUtils {
  10. public static EdgeDriver driver=createDriver();
  11. @BeforeAll
  12. public static void baseControl(){
  13. driver.get("http://127.0.0.1:8080/blog_content.html?id=12869974016131072");
  14. }
  15. @Test
  16. public void blogDeailLoadRight() throws IOException{
  17. driver.findElement(By.cssSelector("#data"));
  18. driver.findElement(By.cssSelector("#title"));
  19. }
  20. }

3.2.3博客编辑页

  1. package com.example.blogautotest.Tests;
  2. import com.example.blogautotest.common.AutotestUtils;
  3. import org.junit.jupiter.api.Assertions;
  4. import org.junit.jupiter.api.BeforeAll;
  5. import org.junit.jupiter.api.Test;
  6. import org.openqa.selenium.By;
  7. import org.openqa.selenium.edge.EdgeDriver;
  8. import java.io.IOException;
  9. public class BlogEditTest extends AutotestUtils {
  10. public static EdgeDriver driver=createDriver();
  11. @BeforeAll
  12. public static void baseControl(){
  13. driver.get("http://127.0.0.1:8080/blog_edit.html");
  14. }
  15. @Test
  16. public void editAndSubimitBlog() throws IOException, InterruptedException {
  17. driver.findElement(By.cssSelector("#title")).sendKeys("自动化测试");
  18. //博客系统使用到的编辑是第三方软件,所以不能直接使用sendKeys向编辑模块发送文本
  19. driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(30)")).click();
  20. driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button:nth-child(2)")).click();
  21. Thread.sleep(300);
  22. String actual=driver.switchTo().alert().getText();
  23. driver.switchTo().alert().accept();
  24. String expect = "恭喜:添加成功!";
  25. Assertions.assertEquals(expect,actual);
  26. }
  27. }

3.2.4个人列表页

  1. package com.example.blogautotest.Tests;
  2. import com.example.blogautotest.common.AutotestUtils;
  3. import org.junit.jupiter.api.Assertions;
  4. import org.junit.jupiter.api.BeforeAll;
  5. import org.junit.jupiter.api.Test;
  6. import org.openqa.selenium.By;
  7. import org.openqa.selenium.edge.EdgeDriver;
  8. public class MyBlogListTest extends AutotestUtils {
  9. public static EdgeDriver driver=createDriver();
  10. @BeforeAll
  11. public static void baseControl(){
  12. driver.get("http://127.0.0.1:8080/myblog_list.html");
  13. }
  14. @Test
  15. public void myListPageLoadRight(){
  16. //检查博客列表加载是否正常
  17. driver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)"));
  18. driver.findElement(By.cssSelector("body > div.container > div.container-left > div > a"));
  19. driver.findElement(By.cssSelector("body > div.container > div.container-right > div.blog-pagnation-wrapper > button:nth-child(1)"));
  20. driver.findElement(By.cssSelector("body > div.container > div.container-right > div.blog-pagnation-wrapper > button:nth-child(3)"));
  21. }
  22. @Test
  23. public void jumpTest(){
  24. //测试导航栏能否正常跳转
  25. driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
  26. Assertions.assertEquals("http://127.0.0.1:8080/blog_list.html",driver.getCurrentUrl());
  27. driver.navigate().back();
  28. driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
  29. Assertions.assertEquals("http://127.0.0.1:8080/blog_edit.html",driver.getCurrentUrl());
  30. driver.navigate().back();
  31. }
  32. }

3.2.5测试结果

在这里插入图片描述

3.3 性能测试

通过LoadRunner模拟多个用户进行并发进行登录后访问所有文章列表页面。
3.3.1.编写性能测试脚本

  1. Action()
  2. {
  3. //开启进入登录页事务
  4. lr_start_transaction("login_index");
  5. /* 注册获取返回参数,该方法可以配合打印返回数据,检测数据内容 */
  6. web_reg_save_param("ParaResult",
  7. "LB=",
  8. "RB=",
  9. LAST);
  10. // 定时检查点,检测登录页面是否正确打开
  11. web_reg_find("Text=登录",LAST);
  12. // 定义虚拟用户结合点
  13. lr_rendezvous("start");
  14. // 进入登录页面
  15. web_url("login_html",
  16. "URL=http://127.0.0.1:7070/login.html",
  17. "TargetFrame=",
  18. "Resource=0",
  19. "Referer=",
  20. LAST);
  21. // 结束进入登录页事务
  22. lr_end_transaction("login_index", LR_AUTO);
  23. //开启登录事务
  24. lr_start_transaction("login");
  25. // 进行登录
  26. web_submit_data("login",
  27. "Action=http://127.0.0.1:7070/user/login",
  28. "Method=POST",
  29. "EncType=application/x-www-form-urlencoded; charset=UTF-8",
  30. "TargetFrame=",
  31. "Referer=",
  32. "Mode=HTTP",
  33. ITEMDATA,
  34. "Name=username", "Value=<username>", ENDITEM,
  35. "Name=password", "Value=<password>", ENDITEM,
  36. LAST);
  37. //定时检测所有文章列表页检查点
  38. web_reg_find("Text=查看全文",LAST);
  39. // 结束登录事务
  40. lr_end_transaction("login", LR_AUTO);
  41. //文章列表事务
  42. lr_start_transaction("blog_list");
  43. // 登录后访问所有文章列表页面
  44. web_url("blog_list",
  45. "URL=http://127.0.0.1:7070/blog_list.html",
  46. "TargetFrame=",
  47. "Resource=0",
  48. "Referer=",
  49. LAST);
  50. // 结束文章列表页事务
  51. lr_end_transaction("blog_list", LR_AUTO);
  52. return 0;
  53. }

测试脚本没有问题后修改Action脚本的执行次数,执行5次脚本

在这里插入图片描述

为了保证测试的合理性,多个虚拟用户使用多个不同的账号进行登录,使用LoadRunner的参数化即可实现。

在这里插入图片描述

针对编写好的脚本通过Controller创建测试场景

  • 设置15个虚拟用户
  • 在这里插入图片描述
  • 设置每5秒进入3个虚拟用户到测试场景在这里插入图片描述
  • 设置虚拟用户执行循环执行5分钟
    在这里插入图片描述
  • 设置虚拟用户执行完毕后每10秒退出5个虚拟用户
    在这里插入图片描述
  • 添加监视系统资源
    CPU运行时间和剩余内存
    在这里插入图片描述
    性能测试报告
    在这里插入图片描述

通过虚拟用户运行图标可以发现,在脚本运行40秒到5分30秒之间虚拟用户给了服务器负载

在这里插入图片描述

通过点击率表可以看到和虚拟用户运行表运行对应起来,虚拟用户的增多点击率也随之增多,点击率越多说明和服务器的交互次数也越多。

在这里插入图片描述

通过事务响应时间发现,访问登录页面的时间比较长,登录事务时间响应时间是比较短的

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,123人围观)

还没有评论,来说两句吧...

相关阅读

    相关 个人系统

    个人博客系统 摘 要 个人博客系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和博客两部分,管理员主要功能包括:个人中心、文章分类管理、

    相关 个人管理系统

    项目简介 Blog是一款个人博客管理系统,是我和同学上学期的期末大作业,完成的比较仓促,大部分功能已经完成。 访问地址:[https://gitee.com/caoch