大众博客系统测试报告【改】

news2024/11/15 11:59:24

 一、项目背景


大众博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的大众博客系统。其结合后端实现了以下的主要功能:登录、编辑博客、注销、删除博客、以及强制登录等功能。
但是该项目没有设计用户注册功能,只能提前在数据库中存储用户信息后经过校验登录;并且用户头像不能自己设定,在进行前端页面的书写过程中已经将头像的图片写为静态了;而用户信息中的文章数以及分类数也没有在后端中具体实现,直接在前端页面中写为了静态的。
该个人博客系统可以实现个人用户简单的博客记录,时间、标题、内容以及发布者等都可以进行详细地查看。


二、项目功能

一功能介绍


该大众博客系统主要实现了以下几个功能:登录,写博客以及用户管理等功能。

登录功能:用户名以及密码已经在后端写入了数据库,没有实现账户注册功能,即:用户名以及密码是已经存在的。登录成功后就会跳转到列表页面。在右上角存在主页和写博客两个按钮,但是在未登录情况下按下均只会跳转到登录页面。
列表页面:可以在列表页查看有限数量的博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。
详情页面:在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能:删除即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除。
写博客:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。

二相关源码

 @Order(3)
    @Test
    void EditBlog() throws InterruptedException {
        EdgeOptions options = new EdgeOptions();
        options.addArguments("--remote-allow-origins=*");
        EdgeDriver driver = new EdgeDriver(options);
        driver.get("http://62.234.43.231:7551/blog_add.html");
        driver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        driver.findElement(By.xpath(" body > div.nav > a:nth-child(5)")).click();
        //输入框输入标题
        ((JavascriptExecutor)driver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");
            sleep(3000);
            driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        sleep(3000);//获取url
        String cur_url = driver.getCurrentUrl();
        Assertions.assertEquals("http://62.234.43.231:7551/blog_list.html",cur_url);


三、测试计划操作


一功能测试


1测试用例:

实际执行测试的部分操作步骤/截图
1正常登录:

2写博客测试

3发布成功并查看详情页

4博客用户管理进行查询

5博客用户管理进行添加

6博客用户管理进行删除

6博客用户管理进行修改

二 自动化测试

代码编写
根据脑图进行测试用例的编写:每个页面一个测试类,然后再各个测试类中进行测试用例的编写。
注意公共属性需要单独放一个类,方便进行代码复用。
使用测试套件便于运行以及修改。
创建启动以及现场截图就是会频繁进行复用,所以单独创建一个类进行存储。
注意添加隐式等待,为了确保页面正确加载显示。
1. 添加相关依赖pom.xml

<dependencies>
<!--        添加selenium依赖-->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>

        <!--        保存屏幕截图需要用到的包-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

        <!--        添加junit5依赖-->
        <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>
    </dependencies>

29


2. 新建包并在包下创建测试类以及公共类
以下是所建立的是common公共包和Tests测试包:


1)公共类AutoTestUtils
创建驱动、保存现场截图
注意:在保存现场截图的时候命名是按时间来进行文件夹的划分,然后图片的名称要体现出测试类的类名,方便进行问题的追溯。
注意文件名的动态获取,注意时间格式的设置。
注意:可以在创建驱动的时候修改默认的有头模式or无头模式
2)登录页面测试BlogLoginTest
① 创建驱动,并打开页面
② 测试页面是否正常打开
③ 测试正常登录:多参数测试
④ 测试异常登录:用户名/密码错误的情况(此处不测null)
⑤ 注意测试的顺序,使用Order注解指定,否则可能会因为执行顺序不对导致测试失败
⑥ 注意清空内容后才能再次输入用户名以及密码

3)列表页测试BlogListTest
① 测试博客列表页是否可以正常打开
② 测试列表页的“查看全文”按钮是否可以正常跳转
③ 测试未登录的直接链接是否会跳转到登录页面,顺便测试了“注销”按钮
④ 同样注意执行顺序

4)编辑页测试BlogEditTest
① 测试编辑页是否可以正确打开
② 测试博客是否可以正常发布:元素齐全 or 部分元素
③ 测试“写博客”按钮是否可以正常使用
④ 执行顺序

5)详情页测试BlogDetailTest
① 测试详情页的正确打开:有blogId和没有blogId两种情况
② 测试“删除”按钮是否可用,注意比较的是时间,因为标题可能会存在为空的情况
③ 执行顺序
④ 一定要注意导航回到列表页的操作

6)驱动释放DriverQuiteTest
因为驱动的测试是要在最后一个测试类完成之后进行释放的,如果是使用@AfterAll注解,那么每次修改测试类的时候都会需要挪动驱动释放的位置,所以直接新建一个类作为驱动释放,此时只需要在测试套件中放到最后就行。

7)测试套件runSuite
测试套件的运行,使用的是以测试类作为执行顺序的方式

三 性能测试

使用loadrunner进行简单性能测试:针对登录、编写并发布博客以及删除博客、注销等功能进行简单的性能测试。
然后在实现的过程中,插入集合点以及事务等,并通过设置来实现用户的并发操作。

录制脚本

登录测试

通过开发者工具查看请求发送的格式,以此来进行性能测试脚本的编写。发现:用户名以及密码是使用form表单的形式来进行发送的。因为用户名以及密码可以有多个,所以可以进行参数化。

添加事务以及集合点、检查点:注意检查点一般放在请求之前。

设置迭代次数:为了能够更好地遍历到所有的参数,一定要进行保存。

参数化

检查点:一定注意函数只放在要检查的URL前面,不要随便再往前面放置。(即:只放在需求之前)相关源码

Action()
{




	web_custom_request("crx_game_2.html", 
		"URL=http://browser.360.cn/se/config/crx_game_2.html", 
		"Method=GET", 
		"Resource=0", 
		"RecContentType=text/html", 
		"Referer=", 
		"Snapshot=t4.inf", 
		"Mode=HTML", 
		EXTRARES, 
		"Url=http://62.234.43.231:7551/css/conmmon.css", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, 
		"Url=http://62.234.43.231:7551/css/login.css", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, 
		"Url=http://62.234.43.231:7551/js/jquery.min.js", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, 
		"Url=http://62.234.43.231:7551/img/logo2.jpg", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, 
		"Url=http://62.234.43.231:7551/img/cat.jpg", "Referer=http://62.234.43.231:7551/css/conmmon.css", ENDITEM, 
		"Url=http://62.234.43.231:7551/login.html", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, 
		"Url=http://cseupdate.360safe.com/safe/safe.cab", "Referer=", ENDITEM, 
		"Url=http://cseupdate.360safe.com/formal/360chrome.cab?ver=13.5.2044.0&mid=4f3c60c60fbd8d385ef600e811f8f6f5&guid=4f3c60c60fbd8d385ef600e811f8f6f5&pid=360CE&db=1&sbox=0&ceip=1&usei=0&usei9=0&usew=0&skin=&safe=0&setc=&to=4", "Referer=", ENDITEM, 
		LAST);
    //集合点
	lr_rendezvous("Rendezvous");

	//事务
	lr_start_transaction("login_transaction");


	lr_think_time(9);

	web_submit_data("info", 
		"Action=http://cloud.browser.360.cn/site/info", 
		"Method=POST", 
		"EncType=multipart/form-data", 
		"RecContentType=text/plain", 
		"Referer=", 
		"Snapshot=t5.inf", 
		"Mode=HTML", 
		ITEMDATA, 
		"Name=rn", "Value=814537", ENDITEM, 
		"Name=sitedata", "Value=631302071d050b051a0100190a02050f0b020b081b176e", ENDITEM, 
		LAST);
	
     //检查点
web_reg_find("Text=admin",
		LAST);
	web_submit_data("login", 
		"Action=http://62.234.43.231:7551/user/login", 
		"Method=POST", 
		"RecContentType=application/json", 
		"Referer=http://62.234.43.231:7551/login.html", 
		"Snapshot=t6.inf", 
		"Mode=HTML", 
		ITEMDATA, 
		"Name=username", "Value={username}", ENDITEM, 
		"Name=password", "Value={password}", ENDITEM, 
		LAST);

	web_submit_data("info_2", 
		"Action=http://cloud.browser.360.cn/site/info", 
		"Method=POST", 
		"EncType=multipart/form-data", 
		"RecContentType=text/plain", 
		"Referer=", 
		"Snapshot=t7.inf", 
		"Mode=HTML", 
		ITEMDATA, 
		"Name=rn", "Value=680672", ENDITEM, 
		"Name=sitedata", "Value=6d1a0104001c061600180608070808061865535a645942404517126b", ENDITEM, 
		LAST);


	web_url("myblog_list.html", 
		"URL=http://62.234.43.231:7551/myblog_list.html", 
		"Resource=0", 
		"RecContentType=text/html", 
		"Referer=http://62.234.43.231:7551/login.html", 
		"Snapshot=t8.inf", 
		"Mode=HTML", 
		LAST);

	web_submit_data("info_3", 
		"Action=http://cloud.browser.360.cn/site/info", 
		"Method=POST", 
		"EncType=multipart/form-data", 
		"RecContentType=text/plain", 
		"Referer=", 
		"Snapshot=t9.inf", 
		"Mode=HTML", 
		ITEMDATA, 
		"Name=rn", "Value=501298", ENDITEM, 
		"Name=sitedata", "Value=6e12000b0b160406091c0c0e1b010b030900051f46575b4c5a4543411b65", ENDITEM, 
		LAST);

	web_submit_data("info_4", 
		"Action=http://cloud.browser.360.cn/site/info", 
		"Method=POST", 
		"EncType=multipart/form-data", 
		"RecContentType=text/plain", 
		"Referer=", 
		"Snapshot=t10.inf", 
		"Mode=HTML", 
		ITEMDATA, 
		"Name=rn", "Value=859621", ENDITEM, 
		"Name=sitedata", "Value=6317080f001f090301180707160403070209081a5a515b1c5a5c571945545456565b571f48591b6b", ENDITEM, 
		LAST);

	web_custom_request("mylist", 
		"URL=http://62.234.43.231:7551/art/mylist", 
		"Method=POST", 
		"Resource=0", 
		"RecContentType=application/json", 
		"Referer=http://62.234.43.231:7551/myblog_list.html", 
		"Snapshot=t11.inf", 
		"Mode=HTML", 
		"EncType=", 
		LAST);

	web_custom_request("showinfo", 
		"URL=http://62.234.43.231:7551/user/showinfo", 
		"Method=POST", 
		"Resource=0", 
		"RecContentType=application/json", 
		"Referer=http://62.234.43.231:7551/myblog_list.html", 
		"Snapshot=t12.inf", 
		"Mode=HTML", 
		"EncType=", 
		LAST);

	lr_end_transaction("login_transaction",LR_AUTO);

	return 0;
}

脚本测试通过

同时测试2个用户并显示日志

设置并发数量进行性能测试,并导出测试报告以及图表
1)设置2个虚拟用户,防止电脑崩溃

2)在Controller中设置场景

3)开始进行运行,性能测试开始(运行中+结束截图)

4)在Analysis中查看性能报告以及报表
① 报告

② 点击率和吞吐量分析图

③ 事务响应量

5)分析系统资源
① 剩余的物理内存近80%,即使用了近40%的内存,对于简单的登录功能来说还是较高的内存使用,还有内存优化的空间。
② 当点击率较大时CPU使用也是达到了一个较高的点,CPU利用率较高。
③ 总之,该性能还有优化的空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1249542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spine深入学习 —— 数据

atlas数据的处理 作用 图集&#xff0c;描述了spine使用的图片信息。 结构 page 页块 页块包含了页图像名称, 以及加载和渲染图像的相关信息。 page1.pngsize: 640, 480format: RGBA8888filter: Linear, Linearrepeat: nonepma: truename: 首行为该页中的图像名称. 图片位…

电流模式的PWM控制电路芯片D3846,封装形式采用DIP16/SOIC16,内置差动电流检测放大器, 共模输入范围宽

D3846是一块电流模式的PWM控制电路。 主要特点&#xff1a; ● 自动前馈补偿 ● 可编程控制的逐个脉冲限流功能 ● 推挽输出结构^ 下自动对称校正 ● 负载响应特性好 ● 可并联运行&#xff0c;适用于模块系统 ● 内置差动电流检测放大器&#xff0c; 共模输入范围宽 ● 双脉冲…

反思一次效能提升

前天与一个大佬交流。想起自己在6年多前在团队里做的一次小小的效能提升。 改进前 在同一个产品团队&#xff0c;同时有前端工程师和后端工程师。他们经常需要共同协作完成features。 前端是一个传统的多页应用。前端渲染是由后端的velocity模板引擎实现的。 打包后&#xff0c…

【浏览器】录音open失败:浏览器禁止不安全页面录音,可开启https解决..

在浏览器地址栏中输入&#xff1a;chrome://flags/#unsafely-treat-insecure-origin-as-secure 启动选项&#xff0c;并且添加你本地的开发地址

多actor实体组合并统一应用变换_vtkAssembly

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题&#xff1a;创建了一个球体和立方体的三维可视化&#xff0c;将它们组合成一个装配体&#xff0c;应用变换&#xff0c;调整不透明度&#…

C#,《小白学程序》第三课:类class,类的数组及类数组的排序

类class把数值与功能巧妙的进行了结合&#xff0c;是编程技术的主要进步。 下面的程序你可以确立 分数 与 姓名 之间关系&#xff0c;并排序。 1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /…

使用 JavaScript 进行 API 测试的综合教程

说明 API 测试是软件测试的一种形式&#xff0c;涉及直接测试 API 并作为集成测试的一部分&#xff0c;以确定它们是否满足功能、可靠性、性能和安全性的预期。 先决条件&#xff1a; JavaScript 基础知识。Node.js 安装在您的计算机上。如果没有&#xff0c;请在此处下载。npm…

设计模式—里氏替换原则

1.概念 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说&#xff0c;任何基类可以出现的地方&#xff0c;子类一定可以出现。 LSP是继承复用的基石&#xff0c;只有当衍生类可以替换掉基类&#xff0c;软件单位的功能不受到影…

K8S客户端一 Rancher的安装

一 安装方式一 通过官网方式安装&#xff1a;官网 sudo docker run --privileged -d --restartunless-stopped -p 80:80 -p 443:443 rancher/rancher:stable访问服务器地址即可&#xff1a;http://192.168.52.128 修改语言 第一次安装会生成密码&#xff0c;查看密码步骤如下…

CANdelaStudio 使用教程3 新建Service

文章目录 简述Service 的相关配置项1、Protocol Services2、Diagnostic Class Templates3、Supported Diagnostic Classes 新建 Service1、新建 Service2、新建类并添加服务3、 选择支持的服务4、Diagnostic Class Templates&#xff1a;Identification 编辑 Service1、新增服务…

Git 与 Maven:企业级版本管理与版本控制规范设计

一、背景 当今&#xff0c;许多开发人员熟悉 GitFlow 工作流程&#xff0c;但往往忽略了 GitFlow 如何与 Maven 版本控制结合&#xff0c;尤其是在管理 snapshot 和 release 版本时的最佳实践。本文旨在整合 GitFlow 工作流程与 Maven 版本管理&#xff0c;提出一个统一的企业…

深入理解数据结构:链表

文章目录 &#x1f330;导语&#x1f330;链表的定义及基本结构&#x1f330;单链表&#x1f955;单链表特点 &#x1f330;双向链表&#x1f955;双链表特点 &#x1f330;循环链表&#x1f955;循环链表特点 &#x1f330;链表的操作&#x1f346;链表的插入&#x1fad8;链头…

GoLang Filepath.Walk遍历优化

原生标准库在文件量过大时效率和内存均表现不好 1400万文件遍历Filepath.Walk 1400万文件重写直接调用windows api并处理细节 结论 1400万文件遍历时对比 对比条目filepath.walkwindows api并触发黑科技运行时间710秒22秒内存占用480M38M 关键代码 //超级快的文件遍历 fun…

ONNX实践系列-将dbnet.onnx的hardsigmoid op用hardsigmoid.onnx整个去替换掉

一、目标 这个dbnet.onnx是paddleocr转出来的,自带的有paddle的那个hardsigmoid算子 ,这个不好转到trt等框架,因此我们想把这个hardsigmoid 算子op替换成我们常规的pytorch框架转出来的hardsigmoid onnx那种。 二、做法 给出代码如下: import onnx from onnx import help…

2023年汉字小达人市级比赛题目类型和答题策略(在线模拟题更新)

今天是2023年11月24日&#xff0c;距离2023年第十届上海市小学生汉字小达人市级比赛&#xff08;市级活动&#xff09;正式举办还有6天时间。 根据日常交流&#xff0c;六分成长发现还有一些家长和小朋友对汉字小达人的市级比赛的形式、题型不太了解&#xff0c;为此&#xff0…

Day40力扣打卡

打卡记录 包子凑数&#xff08;裴蜀定理 DP&#xff09; 根据裴蜀定理&#xff0c;存在 c gcd(a, b) 使不定方程ax by c满足条件&#xff0c;如果gcd(a, b) 1即a与b互素的情况下&#xff0c;就会 ax by 1&#xff0c;由于为1可以构造后面的无穷数字&#xff0c;故得到结…

DBS note5:Relational Algebra(关系代数)

目录 一、关系代数简介 二、Projection () 三、Selection () 四、Union () 五、Set Difference (-) 六、Intersection () 七、Cross Product () 八、Joins () 九、Rename () 十、Group By / Aggregation () 一、关系代数简介 关系代数中的所有运算符都接受一个关系并…

硬件连通性测试主要作用是什么?

硬件连通性测试是现代工程和制造中不可或缺的一环&#xff0c;它通过验证硬件系统内各个组件之间的通信和协作&#xff0c;确保系统在投入使用前能够正常运行。这一关键测试方法不仅有助于提高系统的可靠性和稳定性&#xff0c;还能在生产过程中节省成本&#xff0c;加快生产效…

Exchange意外登录日志

最近在审计Exchange邮件系统的时候&#xff0c;发现大量用户半夜登录的日志。而且都是成功的&#xff0c;几乎没有失败的情况。其中Logon Type 8表示用户从网络登录。 Logon type 8: NetworkCleartext. A user logged on to this computer from the network. The user’s pas…

机器学习算法——主成分分析(PCA)

目录 1. 主体思想2. 算法流程3. 代码实践 1. 主体思想 主成分分析&#xff08;Principal Component Analysis&#xff09;常用于实现数据降维&#xff0c;它通过线性变换将高维数据映射到低维空间&#xff0c;使得映射后的数据具有最大的方差。主成分可以理解成数据集中的特征…