博客系统自动化测试项目实践

news2024/11/28 21:47:09

文章目录

    • 一.测试需求分析
      • 1.功能分析
      • 2.非功能分析
    • 二.制定测试方案(计划 + 策略)
    • 三.编写测试用例
    • 四.执行自动化测试用例
    • 五.编写测试报告
    • 六.项目总结

一.测试需求分析

1.功能分析

通过功能测试需求分析
在这里插入图片描述

2.非功能分析

非功能分析主要从:界面,性能,安全性,兼容性,可维护性等来分析

  • 界面
    布局、排版美观,设计符合当下时代。
    界面的按键和跳转能够正常使用。
  • 性能
    跳转页面不超过 3 秒。执行业务逻辑不超过 3 秒。
  • 安全
    防止用户数据泄露,预防sql注入,病毒危害系统
  • 兼容
    保证在不同系统(macOS,Windows),不同终端设备(PC,移动),不同浏览器上系统能正常运转
  • 可维护
    方便后续修复和扩展系统功能

二.制定测试方案(计划 + 策略)

测试范围以及测试点
用户登录页面,注册页面,博客发布模块,博客删除模块,博客修改模块,博客主页模块。

测试方法: 自动化测试

测试所涉及的类型:功能,界面测试

三.编写测试用例

本次测试采用自动化测试主要对功能方面来进行测试用例的编写,通过前面对功能测试需求的分析,主要对六个功能模块来设计测试用例

在这里插入图片描述

四.执行自动化测试用例

自动化脚本如下:

package com.example.blog_test;

import lombok.SneakyThrows;
import org.assertj.core.data.Index;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.boot.test.context.SpringBootTest;
import sun.security.util.Password;

import javax.swing.*;
import java.time.Duration;
import java.util.List;

import static java.lang.Thread.sleep;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
public class ApplicationTest {
    /**
     * 测试登录模块
     */
    @Nested
    @Disabled
    public class LoginTest{
        @SneakyThrows
        @ParameterizedTest
        @CsvFileSource( files = "src/test/resources/TestSource/UserAcount.csv")
        void test(String name,String pwd)
        {
            Driver driver = new Driver();
            driver.MaxWindow();
            driver.get(PublicVariable.LoginUrl);
            //服务器性能太低 加载页面慢
            driver.Wait(5);
            //输入用户名账号
            WebElement UserName = driver.findElementByCss("#username");
            WebElement password = driver.findElementByCss("#password");
            UserName.sendKeys(name);
            password.sendKeys(pwd);
            //点击登录按钮
            WebElement button = driver.findElementByCss("#submit");
            button.click();

            //预期结果:跳转主页
//            WebDriverWait wait = new WebDriverWait(driver.getWebDriver(), Duration.ofSeconds(10)); // 设置等待时间为10秒
//            WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#app")));
            sleep(100);
            String CurUrl = driver.getUrl();
            assertEquals(CurUrl,PublicVariable.IndexUrl);
            //关闭窗口
            driver.quit();
        }
    }
    /**
     * 测试注册模块
     */
    @Nested
    @Disabled
    public class RegisterTest{
    }
    /**
     * 测试注销模块
     */
    @Nested
    @Disabled
    public class LogoutTest{
        @SneakyThrows
        @Test
        void test()
        {

            Driver driver = new Driver();
            //登录
            Tool.login(driver);
            //点击注销按钮
            WebElement LogOutBtn = driver.findElementByCss("#app > div > div > a:nth-child(8)");
            LogOutBtn.click();
            driver.confirm();
            sleep(1000);
            //预期结果: 导航栏 只有注册 登录 主页三个按钮
            List<WebElement> lists = driver.findElements("#app > div > div > a");
            assertEquals(lists.size(),3);
        }
    }
    /**
     * 测试博客发布模块
     */
    @Nested
    @Disabled
    public class ReleaseTest{
        @SneakyThrows
        @ParameterizedTest
        @CsvFileSource( files = "src/test/resources/TestSource/BlogDetail.csv")
       public void test(String title, String content)
        {

            Driver driver = new Driver();
            //登录
            Tool.login(driver);
            //获取导航栏元素列表
            List<WebElement> webElementList = driver.findElements("#app > div > div > a");
            //选取写博客功能元素
            WebElement target = null;
            for(int i = 0 ;i<webElementList.size();i++)
            {
                WebElement element = webElementList.get(i);
                if(element.getText().equals(Tool.Pub_blog))
                {
                    target = element;
                    continue;
                }
            }
            //进入博客发布页面 填写内容
            target.click();
            sleep(5000);
            WebElement Title = driver.findElementByCss("#add_title");
            Actions actions = new Actions(driver.getWebDriver());
            //输入内容
            actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(content).perform();
            //输入标题
            Title.sendKeys(title);
            //点击发布
            List<WebElement> lists = driver.findElements(".title > button");
            for(int i  =0;i<lists.size();i++)
            {
                WebElement element = lists.get(i);
                if(element.getText().equals("发布文章"))
                {
                    element.click();
                    sleep(1000);
                    driver.reject();
                    break;
                }
            }
            //预期结果:跳转到主我的博客页面 主页面第一篇文章为刚发布文章
            sleep(1000);
            String CurUrl = driver.getUrl();
            String IndexTitle = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > header:nth-child(1) > header:nth-child(1) > h2").getText();
            String IndexContent = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > main > span").getText();
            assertEquals(CurUrl,PublicVariable.MyBlogUrl);
            assertEquals(IndexTitle,title);
            assertEquals(IndexContent,content);
        }
    }
    /**
     * 测试博客删除模块
     */
    @Nested
    @Disabled
    public class DeleteTest{

        @Test
        void test()
        {

            Driver driver = new Driver();
            //先写入一篇文章
            Tool.pub_blog(driver,"测试","测试");
            //删除改文章
            List<WebElement> elements = driver.findElements("#app .el-main .el-main");
            WebElement el = elements.get(0);
            List<WebElement> lists = el.findElements(By.cssSelector("button"));
            for(int i = 0;i<lists.size();i++)
            {
                WebElement btn = lists.get(i);
                if(btn.getText().equals("删除文章"))
                {
                    btn.click();
                    driver.confirm();
                    break;
                }
            }
            //预期结果: 展台显示暂无内容
            WebElement h1 = driver.findElementByCss("h1");
            assertNotNull(h1);
            assertEquals(h1.getText(),"暂无内容");
        }
    }
    /**
     * 测试博客修改模块
     */
    @Nested
    @Disabled
    public class ModifyTest{
        @SneakyThrows
        @ParameterizedTest
        @CsvFileSource( files = "src/test/resources/TestSource/BlogDetail.csv")
        void test(String title,String content)
        {

            Driver driver = new Driver();
            //先写入一篇文章
            Tool.pub_blog(driver,"测试","测试");
            //修改文章
            List<WebElement> elements = driver.findElements("#app .el-main .el-main");
            WebElement el = elements.get(0);
            List<WebElement> lists = el.findElements(By.cssSelector("button"));
            for(int i = 0;i<lists.size();i++)
            {
                WebElement btn = lists.get(i);
                if(btn.getText().equals("修改文章"))
                {
                    btn.click();
                    break;
                }
            }
            sleep(100);
            //输入修改内容
            WebElement Title = driver.findElementByCss("#add_title");
            Actions actions = new Actions(driver.getWebDriver());
            //输入内容
            actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(content).perform();

            new Actions(driver.getWebDriver())
                    .click(Title)
                    .perform();
            //输入标题
            actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(title).perform();
            WebElement submitEl = driver.findElementByCss("#submit");
            submitEl.click();
            sleep(100);
            driver.reject();
            String CurUrl = driver.getUrl();
            sleep(500);
            //预期结果: 页面跳转到我的博客页面 且标题内容与修改相同
            String IndexTitle = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > header:nth-child(1) > header:nth-child(1) > h2").getText();
            String IndexContent = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > main > span").getText();
            assertEquals(CurUrl,PublicVariable.MyBlogUrl);
            assertEquals(IndexTitle,title);
            assertEquals(IndexContent,content);

        }
    }
    /**
     * 测试博客主页模块
     */
    @Nested

    public class IndexTest{
        @Test
        void test() {
            //插入多篇文章
            Tool.pub_blog(new Driver(), "测试", "测试");
            Tool.pub_blog(new Driver(), "测试", "测试");
            Driver driver  = new Driver();
            driver.MaxWindow();
            driver.get(PublicVariable.IndexUrl);
            WebElement pageNum = driver.findElementByCss("#app > div > section > div.pagination > div > ul > li");
            //预期结果 分页数目大于1
            assertNotEquals(Integer.parseInt(pageNum.getText()),1);
        }
    }

}

被测试项目源代码链接:https://github.com/911400586/Blog_System
自动化脚本源代码:https://github.com/911400586/Blog_Auto_Test

五.编写测试报告

点击下方连接查看详细测试报告
博客系统测试报告

六.项目总结

测试用例根据用户需求分析来设计,而且有整体框架,算是比较详细全面。
有待改善的地方:
系统中有一些模块的功能是类似的,导致设计测试用例的时候重复,略显冗余。
系统中的一些功能模块,设计出的测试用例覆盖率较低。

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

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

相关文章

jmeter性能测试如何实现分布式部署

jmeter什么要做分布式部署&#xff1f; jmeter是运行在JVM虚拟机上的&#xff0c;当模拟大量并发时&#xff0c;对运行机器的性能/网络负载会很大。 此时就需要使用jmeter的分布式部署功能&#xff0c;实现多台被控机器同时并发访问被测系统。 原理图&#xff1a; 准备工作&…

小型取暖器上亚马逊美国站UL1278标准如何办理?

小型取暖器上亚马逊美国站UL1278标准如何办理&#xff1f; 小型取暖器上亚马逊美国站UL1278标准如何办理&#xff1f; 冬季马上就要来临&#xff0c;随着气温一天一天的下降&#xff0c;取暖器就是这个冬季必不可少的好物了&#xff0c;试想一下冬天一家人围着取暖器&#xf…

《TCP/IP详解 卷一:协议》第5章的IPv4数据报的Checksum(校验和)字段的计算(这里才能解开你的困惑)

首先&#xff0c;我当你看过书&#xff0c;但是比较懵。 1&#xff0c;实例说明Checksum(校验和)的计算步骤 直奔主题&#xff0c;分析一下这个Checksum&#xff08;校验和&#xff09;怎么算出来的。 先用Wireshark随便抓一个UDP或TCP包分析一下。 如上面&#xff0c;我们得…

SIP 系统容器化实践

由于SIP系统相对成熟&#xff0c;目前互联网上的SIP系统方案大多数都是基于虚拟机来实现的。 本文是基于容器化实现SIP系统的方案以及遇到的问题总结。 本文会展示两个系统的SIP实现&#xff0c;分别是智能语音机器人和CTI系统&#xff0c;不会涉及太多的业务&#xff0c;只是对…

前端实验(一)单页面应用的创建

实验目的 掌握使用vite创建vue3单页面程序命令熟悉所创建程序的组织结构熟悉单页面程序运行原理能够编写简单的单页面程序 实验内容 创建一个名为vue-demo的单页面程序编写简单的单页面程序页面运行单页面程序 实验步骤 使用vite创建单页面程序 创建项目名为目录vue-demo的…

【缓存】Spring全家桶中@CacheEvict无效情况共有以下几种

Spring全家桶中CacheEvict无效情况共有以下几种 一、背景介绍二、原因分析三、解决方案 一、背景介绍 SpringBoot中使用Cacheable注解缓存数据&#xff0c;使用CacheEvict注解删除缓存。但是在项目使用过程中&#xff0c;发现使用CacheEvict注解删除缓存无效。 拓展&#xff…

GORM:在Go中轻松管理数据库

GORM综合介绍 - Go对象关系映射库 在现代软件开发中&#xff0c;高效的数据库管理对于构建强大的应用程序至关重要。GORM是Go开发人员寻求与数据库进行交互的简化方式的宝贵工具。GORM是Go对象关系映射的缩写&#xff0c;它为Go的面向对象世界与数据库的关系世界之间提供了桥梁…

【Flink】全网最详细4W字Flink全面解析与实践(上)

本文已收录至GitHub&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 流处理 & 批处理无界流Unbounded Streams有界流Bounded Streams Flink的特点和优势Flink VS Spa…

兴业银行养老金拉新项目上线啦,地推百搭项目

兴业银行养老金就在 ”聚量推客“ 申请开通 今年最火的银行拉新项目就是养老金的 单价高 数据好 目前开通养老金的银行有 兴业银行养老金拉新 交通银行养老金拉新 工商银行养老金拉新 招商银行养老金拉新 浦发银行养老金拉新 广发银行养老金拉新等。。还有很多都开通了…

Nignx及负载均衡动静分离

目录 一.Nignx简介 二.nginx搭载负载均衡 负载均衡 1.1启动nginx ​编辑 ​编辑 1.2开始 1.3导入前端数据 ​编辑 三.前端项目Linux部署(动静分离) 一.Nignx简介 Nginx是一个高性能的开源HTTP和反向代理服务器&#xff0c;也可以用作电子邮件&#xff08;SMTP/IMAP&am…

前端(二十七)——封装指南:Axios接口、常用功能、Vue和React中的封装技术

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;前端封装指南&#xff1a;Axios接口、常用功能、Vue和React中的封装技术 本文目录 小引前端封装以真实项目举个例子 Axios接口封装常用功能封装封装 Vue中的封装技术React中的封装技术Vue和React封装…

基于Java+SpringBoot+Vue+Uniapp小程序前后端分离租房管理系统设计与实现(支持支付宝支付、有需求解析文档50页、演示视频)

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

人工智能基础知识

目录 什么是人工智能&#xff1f; 教学环境搭建 向量和矩阵 如果你是关注计算机领域最新趋势的学生或从业者&#xff0c;你应该听说过人工智能、数据科学、机器学习、深度学习等术语。作为人工智能系列文章的第一篇&#xff0c;本文将解释这些术语&#xff0c;并搭建一个帮助…

Doris Manager集群的工具,运维更顺畅

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Spring Boot 使用断言抛出自定义异常,优化异常处理机制

文章目录 什么是断言&#xff1f;什么是异常&#xff1f;基于断言实现的异常处理机制创建自定义异常类创建全局异常处理器创建自定义断言类创建响应码类创建工具类测试效果 什么是断言&#xff1f; 实际上&#xff0c;断言&#xff08;Assertion&#xff09;是在Java 1.4 版本…

大模型初体验-阿里云百炼初级入门demo

背景 近期阿里云大模型百炼平台&#xff08;https://bailian.console.aliyun.com/#/home&#xff09;有限免活动&#xff0c;可以免费领取额度&#xff0c;有兴趣的朋友们可以试一下。限时免费活动_大模型服务平台-阿里云帮助中心 什么是阿里云百炼 阿里云百炼&#xff08;h…

SpringBoot_第七章(读写分离)

这里列举了三种读写分离实现方案,分别是如下三种 1&#xff1a;MybatisPlus&#xff08;读写分离&#xff09; 1.1&#xff1a;首先创建三个数据库1主2从 表名是user表 1.2&#xff1a;代码实例 1&#xff1a;导入pom <!--MybatisPlus的jar 3.0基于jdk8--><depend…

stm32 串口

目录 简介 串口通讯协议的物理层 电平标准 协议层 USART框图 总结 hal库代码 标准库代码 简介 USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步/异步收发器。USART是STM32内部集成的硬件外设&#xff0c;STM32F103系列…

在职一年多,一个29岁软件测试工程师的心声

简单的先说一下&#xff0c;坐标西安&#xff0c;16届本科毕业&#xff0c;目前在跳槽&#xff0c;算上国庆节前的面试&#xff0c;一共有面试了5家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09;其中成…

如何打造一支敏捷测试团队

文章目录 摘要01 从测试角度理解敏捷理念什么是敏捷&#xff1f;测试人员应该怎样理解敏捷理念&#xff1f;敏捷宣言对于测试活动的启发与思考总结如下。敏捷原则12条敏捷实践框架为什么要做敏捷 02 什么是敏捷测试03 敏捷测试为什么会失败04 诊断脑暴会的成果示例敏捷测试原则…