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

目录

项目介绍

项目功能

设计测试用例

功能测试--自动化测试

测试代码

登录测试

博客详情页测试

发布博客测试

删除博客测试

退出账号测试

性能测试


项目介绍


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

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

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

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

项目功能


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

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


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


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


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

设计测试用例

功能测试--自动化测试

测试代码

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

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

public class InitAndEndBrowser {

    /**
     * 打开博客网站
     */
    @BeforeAll
    static void SetUp() {
        // 打开网页,博客列表的登录网址
        webDriver.get("http://xxxxxxxxxx/blog_login.html");
    }

    /**
     * 退出浏览器
     */
    @AfterAll
    static 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=xxx
        String actual_url = webDriver.getCurrentUrl();
        // 判断url是否是详情页url
        if(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)
    @Test
    void 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)
    @Test
    void 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利用率较高,这就是系统可以优化的一个方向。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【一刷《剑指Offer》】面试题 3:二维数组中的查找

力扣对应题目链接&#xff1a;240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 核心考点&#xff1a;数组相关&#xff0c;特性观察&#xff0c;时间复杂度把握。 一、《剑指Offer》对应内容 二、分析题目 正常查找的过程本质就是排除的过程&#xff0c;谁排除…

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 轻松文生视频

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 &#x1f4fa;轻松文生视频 学习前言源码下载地址技术原理储备&#xff08;DIT/Lora/Motion Module&#xff09;什么是Diffusion Transformer (DiT)LoraMotion Module EasyAnimate简介EasyAnimate原理界面展示快速启动云…

RUM 最佳实践-交互延迟的探索与发现

FID 在互联网高速发展的时代&#xff0c;用户体验已成为企业竞争的关键所在。网页性能作为用户体验的重要组成部分&#xff0c;直接影响着用户的满意度和工作效率。First Input Delay&#xff08;FID&#xff09;作为衡量网页性能的重要指标&#xff0c;越来越受到业界关注。今…

万字长文深入理解Docker镜像分层原理、容器数据卷、网络通信架构(Docker系列第2章,共3章)

镜像分层的简单直观体现 在执行docker pull时&#xff0c;会发现多个Pull complete 字样&#xff0c;就能体现分层&#xff0c;如果是一个文件&#xff0c;只会有一个Pull complete 。 docker pull redis Using default tag: latest latest: Pulling from library/redis a2ab…

数据治理专家岗位的能力模型

数据治理专家的角色要求其具备全方位的专业素养与技能&#xff0c;不仅要有深厚的业务理解与数据技术功底&#xff0c;还需展现出卓越的领导力、团队协作与沟通能力&#xff0c;以驱动组织内部数据治理工作的高效运行与持续优化。以下是对数据治理专家各项能力的深入解读&#…

STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(5)

接前一篇文章&#xff1a;STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978&#xff08;4&#xff09; 本文参考以下文章及视频&#xff1a; STM32CbueIDE Audio播放音频 WM8978 I2S_stm32 cube配置i2s录音和播放-CSDN博客 STM32第二十二课&#xff08;I2S&#xff0c;HAL&am…

C++学习进阶:哈希思想的进一步体现

目录 前言 1.位图 1.1.位图的实现与原理 1.2.如何使用位图处理海量数据 2.布隆过滤器 2.1.知识引入 2.2.布隆过滤器的实现 2.3.布隆过滤器的应用 3.哈希切割 前言 我们在之前对哈希表的学习&#xff0c;明白了哈希的本质就是一种映射&#xff01;&#xff01;&#xf…

安达发|APS智能优化排产软件之模具约束

在制造业中&#xff0c;模具是生产过程中不可或缺的重要工具。然而&#xff0c;由于模具的制造周期长、成本高以及生产过程中的复杂性&#xff0c;如何合理安排模具的使用和生产计划成为了一个关键问题。为了解决这个问题&#xff0c;许多企业开始采用APS&#xff08;高级计划与…

主干网络篇 | YOLOv8更换主干网络之VanillaNet | 华为方舟实验室提出全新轻量级骨干架构

前言:Hello大家好,我是小哥谈。华为方舟实验室所提出的VanillaNet架构克服了固有复杂性的挑战,使其成为资源受限环境的理想选择。其易于理解和高度简化的架构为高效部署开辟了新的可能性。广泛的实验表明,VanillaNet提供的性能与著名的深度神经网络和vision transformers相…

深度剖析Java中的String类

目录 引言 String类的特性 String类的部分实现代码&#xff1a; 不可变性&#xff1a; 补充&#xff1a; 常量池&#xff1a; 不可变性的好处 创建String对象 创建String对象的常用的三种方法如下&#xff1a; 使用常量串构造&#xff08;最常用&#xff09;&#xf…

帝国cms仿《鳄鱼下载站》网站源码

仿《鳄鱼下载站》网站源码手机安卓软件网站模版 PHP网站源码 帝国cms内核 采用帝国cms7.5 环境PHPmysql 恢复数据库后如何修改密码: 双击表&#xff0c;进入对应的详细数据表&#xff0c;然后找到&#xff1a;www_96kaifa_com_enewsuser这个表&#xff0c;双击打开修改&…

SAP SD学习笔记06 - 受注的据否,受注的理由,简易变更(一括处理)

上文讲了一括处理和Block&#xff08;冻结&#xff09;处理。 SAP SD学习笔记05 - SD中的一括处理&#xff08;集中处理&#xff09;&#xff0c;出荷和请求的冻结&#xff08;替代实现承认功能&#xff09;-CSDN博客 本章继续讲SAP的流程中一些常用的操作。 1&#xff0c;受注…

【算法】分治-快排

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 前言1. 75. 颜色分类1.1 分析1.2 代码 2. 912. 排序数组2.1 分析2.2 代码 3. 215. 数组中的第K个最大元素3.1 分析3.2 代码 4. LCR 159. 库存管理 III4.1 分析4.2 代码 前言 分治就是分而治之 1. 75. 颜色分类 1.1 分析…

基于java+springboot+vue实现的网上购物系统(文末源码+Lw+ppt)23-42

摘 要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;网上购物系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为…

Linux【实战篇】—— NFS服务搭建与配置

目录 一、介绍 1.1什么是NFS&#xff1f; 1.2客户端与服务端之间的NFS如何进行数据传输&#xff1f; 1.3RPC和NFS的启动顺序 1.4NFS服务 系统守护进程 二、安装NFS服务端 2.1安装NFS服务 2.2 创建共享目录 2.3创建共享目录首页文件 2.4关闭防火墙 2.5启动NFS服务 2.…

Java 语言程序设计(基础篇)原书第10版 梁勇著 PDF 文字版电子书

简介 Java 语言程序设计&#xff08;基础篇&#xff09;原书第 10 版 是 Java 语言的经典教材&#xff0c;中文版分为基础篇和进阶篇&#xff0c;主要介绍程序设计基础、面向对象程序设计、GUI 程序设计、数据结构和算法、高级 Java 程序设计等内容。本书通过示例讲解问题求解…

抖音滑块验证码加密的盐的位置

最近更新后之前很容易找到盐的位置的方法变了&#xff0c;抖音特意把盐隐藏起来了 {"reply": "RJC","models": "yAd8rl","in_modal": "DTn0nD2","in_slide": "ou7H0Ngda","move": …

C++算法题 - 双指针

目录 125. 验证回文串392. 判断子序列167. 两数之和 Ⅱ - 输入有序数组11. 盛最多的水15. 三数之和 125. 验证回文串 LeetCode_link 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 …

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

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

一起学习python——基础篇(20)

前言&#xff0c;之前经常从网上找一些免费的接口来测试&#xff0c;有点受制于人的感觉。想了想还不如直接写一个接口&#xff0c;这样方便自己测试。自己想返回什么格式就返回什么样子&#xff0c;不用担心服务报错&#xff0c;因为自己就可以完全掌控。然后宿舍二哥告诉我py…