基于博客系统的功能测试和性能测试

目录

项目介绍

项目功能

设计测试用例

功能测试--自动化测试

测试代码

登录测试

博客详情页测试

发布博客测试

删除博客测试

退出账号测试

性能测试


项目介绍


1.博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。

2.前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的个人博客系统。其结合后端实现了以下的主要功能:登录、编辑博客、注销、删除博客。

3.博客系统可以实现个人用户简单的博客记录,时间、标题、内容以及发布者等都可以进行详细地查看。

使用JUnit测试框架对博客系统进行功能测试。

项目功能


博客系统主要实现了以下几个功能:登录、注销、写博客以及删除博客等功能。

登录功能:用户名以及密码是已经存在于数据库中的。登录成功后就会跳转到列表页面。在右上角存在主页和写博客两个按钮,但是在未登录情况下按下均只会跳转到登录页面。


列表页面:可以在列表页查看博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。


详情页面:在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能。


博客编辑页:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。

设计测试用例

功能测试--自动化测试

测试代码

先指定在所有测试方法执行之前和所有方法执行之后的要执行的方法。

在所有测试方法前要执行的是登录博客网址,所有测试方法后要执行的是关闭该网页。

public class InitAndEndBrowser {/*** 打开博客网站*/@BeforeAllstatic void SetUp() {// 打开网页,博客列表的登录网址webDriver.get("http://xxxxxxxxxx/blog_login.html");}/*** 退出浏览器*/@AfterAllstatic void TearDown() {try {// 休眠3秒sleep(3000);// 退出浏览器webDriver.quit();} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

登录测试

输入账号和密码,若登录成功,进入博客列表页,博客列表页有注销按钮。出现注销按钮即可说明登录成功。

 /*** 账号正确,密码正确登陆成功*/@Order(1)@ParameterizedTest@CsvSource(value = {"admin, 123456"})void Login(String user_name, String passport) throws InterruptedException {// 输入账号webDriver.findElement(By.cssSelector("#username")).sendKeys(user_name);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(passport);// 点击登录按钮webDriver.findElement(By.cssSelector("#submit")).click();sleep(3000);// 如果页面出现注销按钮,此时说明登录成功WebElement logout_button = webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)"));Assertions.assertNotNull(logout_button);}

博客详情页测试

/*** 点击查看全文,成功跳转到博客详情页面*/@Order(2)@ParameterizedTest@ValueSource(strings = {"http://xxxxxxxxx/blog_system/blog_detail.html?blogId="})void BlogListToBlogInfo(String expected_url) throws InterruptedException {// 找到查看全文按钮(这里找到的是全部的查看全文按钮)List<WebElement> review_all_blog_buttons = webDriver.findElements(By.xpath("//a[text()=\'查看全文 >>\']"));// 点击第一个查看全文按钮review_all_blog_buttons.get(0).click();// 预期的url是http://42.192.83.143:8563/blog_system/blog_detail.html?blogId=xxxString actual_url = webDriver.getCurrentUrl();// 判断url是否是详情页urlif(actual_url.contains(expected_url)) {System.out.println("测试通过,当前博客详情页地址是:" + actual_url);} else {System.out.println("测试不通过,当前页面地址是:" + actual_url);}sleep(3000);}

发布博客测试

发布成功一条博客后会跳转到博客列表页面,检查博客列表页的第一条博客的标题是否和测试的博客标题一致即可。

 /*** 发布博客成功,跳转到博客列表页面*/@Order(3)@ParameterizedTest@CsvFileSource(resources = "test04.csv")void EditBlogSimple( String expected_url) throws InterruptedException {// 找到发布博客按钮,点击webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();// 找到标题输入框,输入"自动化代码发布博客"((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value='自动化测试代码发布博客'");sleep(3000);webDriver.findElement(By.cssSelector("#submit")).click();// 校验页面是不是跳转到博客列表页面// 比较当前页面url是不是等于http://xxxxxxxx/blog_system/blog_list.html// 如果相等,跳转页面正确// 跳转页面不正确,测试不通过String actual_url = webDriver.getCurrentUrl();Assertions.assertEquals(expected_url, actual_url);}/*** 检查博客列表中第一条博客标题是不是和自己发布的博客标题相等*/public static Stream<Arguments> GeneratorBlogTitle() {return Stream.of(Arguments.arguments("#这个是自动化代码写的文章\n"));}@ParameterizedTest@MethodSource("GeneratorBlogTitle")@Order(4)void CheckBlogTitle(String expected_blog_title) throws InterruptedException {sleep(3000);// 获取刚才代码发布的博客标题String release_blog_title = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[3]")).getText();// 校验发布的博客标题,是不是和EditBlogSimple方法中发布的博客标题一样Assertions.assertNotEquals(expected_blog_title, release_blog_title);}

删除博客测试

 /*** 删除博客*/@Order(5)@Testvoid DeleteBlog() {try {// 点击查看全文sleep(3000);webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();sleep(3000);// 点击删除按钮webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)")).click();} catch (Exception e) {System.out.println(e.getMessage());}}

退出账号测试

退出账号后,成功的标志是用户名和密码为空。

/**** 退出*/@Order(6)@Testvoid Logout() throws InterruptedException{// 退出账号webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();sleep(3000);// 获取用户名信息String user_name = webDriver.findElement(By.cssSelector("#username")).getText();// 获取密码信息String pass_port = webDriver.findElement(By.cssSelector("#password")).getText();// 退出后,用户名为空,测试通过,否则测试不通过Assertions.assertEquals("", user_name);// 退出后,密码为空,测试通过,否则测试不通过Assertions.assertEquals("", pass_port);}

以上,可以保证博客系统的基本功能正常。

性能测试

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

对登录进行测试:

1.添加访问地址

2.通过开发者工具查看请求发送的格式,以此来进行性能测试脚本的编写

3.用户名以及密码可以有多个,可以进行参数化。

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

5.设置迭代次数:为了能够更好地遍历到所有的参数。

6.脚本测试

7.设置并发数量进行性能测试,并导出测试报告以及图表
(1)设置10个虚拟用户

(2)在Controller中设置场景

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

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

② 点击率

③ 吞吐量

④ 系统资源

分析系统资源:击率较大时,CPU利用率较高,这就是系统可以优化的一个方向。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 数据输入输出

本文 我们来说 数据的输入与输出 及数据的运算 在程序的运算工程中 往往需要输入一些数据 而程序的运算 所得到的运算结果又需要输出给用户 因此 数据的输入与输出 就显得非常重要 在C语言中 不提供专门的输入输出语句 所有的输入输出 都是通过对标准库的调用 来实现的 一般 …

权威Scrum敏捷开发企业级实训/敏捷开发培训课程

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架。 这是一个两天的实训课程&#xff0c;面向研发管理者、项目经理、产品经理、研发团队等&#xff0c;旨在帮助学员全面系统地学习Scrum和敏捷开发, 帮助企业快速启动敏…

idea工具使用Tomcat创建jsp 部署servlet到服务器

使用tomcat创建jsp 在tomcat官网中下载对应windows版本的tomcat文件 Apache Tomcat - Welcome! 解压到系统目录中&#xff0c;记得不要有中文路径 新建一个java项目 点击右上角 点击加号 找到Tomcat Service的 Local 点击右下角的Fix一下&#xff0c;然后ok关闭 再重新打开一…

Python | Leetcode Python题解之第27题移除元素

题目&#xff1a; 题解&#xff1a; class Solution:def removeElement(self, nums: List[int], val: int) -> int:a 0b 0while a < len(nums):if nums[a] ! val:nums[b] nums[a]b 1a 1return b

SpringCloudalibaba之Nacos的配置管理

Nacos的配置管理 放个妹子能增加访问量&#xff1f; 动态配置服务 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。 动态配置消除了配置变更时重新部署应用和服务的需要&#xff0c;让配置管理变得更加高效和敏捷。 配置中心化管…

AI虽强,搜索引擎仍不可或缺

AI 领域正以前所未有的速度发展&#xff0c;大模型的发布变得愈发频繁&#xff0c;模型的规模也在持续扩大。如今&#xff0c;大模型的起点已经攀升至数十亿参数&#xff08;数十 B&#xff0c;B 是 Billion 的简写&#xff0c;10 亿&#xff09;&#xff0c;其功能之广泛&…

搭建个人智能家居 4 -WS2812B-RGB灯

搭建个人智能家居 4 - WS2812B-RGB灯 前言说明ESPHomeHomeAssistant 前言 上一篇文章我们已经完成了第一个外设的添加&#xff08;一个LED灯&#xff09;&#xff0c;今天接着来“壮大”这个系统&#xff0c;添加第二个外设“RGB灯”。 环境搭建可以回顾前面的文章。前文回顾&…

arm工作模式、arm9通用寄存器、异常向量表中irq的异常向量、cpsr中的哪几位是用来设置工作模式以及r13,r14,15别名是什么?有什么作用?

ARM 首先先介绍一下ARM公司。 ARM成立于1990年11月&#xff0c;前身为Acorn计算机公司 主要设计ARM系列RISC处理器内核 授权ARM内核给生产和销售半导体的合作伙伴ARM公司不生产芯片 提供基于ARM架构的开发设计技术软件工具评估版调试工具应用软件总线架构外围设备单元等等CPU中…

Java 基于微信小程序的智能停车场管理小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【七 (1)FineBI FCP模拟试卷-股票收盘价分析】

目录 文章导航一、字段解释二、需求三、操作步骤1、添加计算字段&#xff08;每月最后一天的收盘价&#xff09;2、绘制折线图 文章导航 【一 简明数据分析进阶路径介绍&#xff08;文章导航&#xff09;】 一、字段解释 Company Name&#xff1a;公司名称 Date&#xff1a;…

亚远景科技-ASPICE 4.0-HWE硬件过程的范围 The Technical Scope of HW process

ASPICE 4.0中的HWE process是电气和电子硬件的技术范畴&#xff0c;涵盖了硬件工程中的需求分析、设计和验证活动&#xff0c;但不包括以下活动&#xff1a; 1. 系统级工程过程。既不包括机电一体MECHATRONIC&#xff0c;也不包括ECU特定电子控制单元的开发。 2. 硬件采购过程…

TQ15EG开发板教程:在MPSOC上运行ADRV9009(vivado2018.3)

首先需要在github上下载两个文件&#xff0c;本例程用到的文件以及最终文件我都会放在网盘里面&#xff0c; 地址放在最后面。在github搜索hdl选择第一个&#xff0c;如下图所示 GitHub网址&#xff1a;https://github.com/analogdevicesinc/hdl/releases 点击releases选择版…

Python根据主播直播时间段判定订单销售额归属

写在前面&#xff1a;最近在群里看到一个这样的直播电商的场景觉得还是挺有趣的&#xff0c;于是就想用Python来实现。 需求描述&#xff1a;根据主播直播时间段结合销售订单的付款时间判断所属销售的归属 生成主播在线直播时间段数据 from datetime import datetime, timed…

Linux 使用 ifconfig 报错:Failed to start LSB: Bring up/down networking

一、报错信息 在运行项目时报错数据库连接失败&#xff0c;我就想着检查一下虚拟机是不是 Mysql 服务忘了开&#xff0c;结果远程连接都连接不上虚拟机上的 Linux 了&#xff0c;想着查一下 IP 地址看看&#xff0c;一查就报错了&#xff0c;报错信息&#xff1a; Restarting…

Github 2024-04-14 php开源项目日报Top9

根据Github Trendings的统计,今日(2024-04-14统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9TypeScript项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseStar数量:30824 个Fork数量:1…

L1 【哈工大_操作系统】什么是操作系统

从本期开始&#xff0c;笔者将出一系列哈工大的《操作系统》课堂要点笔记&#xff0c;该课程应该算得上是国内最好的操作系统课程之一&#xff0c;也是哈工大CS课程含金量最高的课程之一。尤其是对于想学习国外课程《MIT 6.S081》《MIT 6.828》又基础不足的同学&#xff0c; 特…

【生产案例面试题】JVM调优

写作目的 最近上线了一个需求&#xff0c;遇到了一个JVM报警的问题&#xff0c;很荣幸能遇到&#xff0c;在此分享一下整个调优的过程。 背景 我们是中台服务&#xff0c;我们的甲方就是上游不同的业务。中台原则上是业务和能力分离&#xff0c;但是不可避免的是分不开&…

年龄与疾病c++

题目描述 某医院想统计一下某项疾病的获得与否与年龄是否有关&#xff0c;需要对以前的诊断记录进行整理&#xff0c;按照0-18岁、19-35岁、36-60岁、61以上&#xff08;含61&#xff09;四个年龄段统计的患病人数以及占总患病人数的比例。 输入 共2行&#xff0c;第一行为过…

android支付宝接入流程

接入前准备 接入APP支付能力前&#xff0c;开发者需要完成以下前置步骤。 本文档展示了如何从零开始&#xff0c;使用支付宝开放平台服务端 SDK 快速接入App支付产品&#xff0c;完成与支付宝对接的部分。 第一步&#xff1a;创建应用并获取APPID 要在您的应用中接入支付宝…

python输入某年某月某日判断这一天是这一年的第几天

如何使用python实现输入某年某月某日判断这一天是这一年的第几天 from datetime import datetime #引入日期类 def is_leap_year(year):"""判断是否为闰年"""return (year % 4 0 and year % 100 ! 0) or (year % 400 0)# 根据年份和月份返回当…