我的博客系统自动化测试设计

news2024/10/5 0:17:51

我的博客系统测试设计

  • 一、项目描述
  • 二、项目功能描述
  • 三、测试计划
    • 1、功能测试
      • 1.1 测试用例
      • 1.2 测试步骤

一、项目描述

  1、采用前后端分离的来实现我的博客系统,使用MySQL 数据库存储用户和博客信息。
  2、前端页面包含用户注册、登录、我的博客列表页、博客主页面、添加博客页面、修改博客页以及博客详情页;
  3、我的博客系统实现了登录注册、发布博客、修改博客、查看博客详情、数量统计、删除博客、注销等主要功能。可以实现对博客记录,时间、标题、内容以及阅读量等进行查看。

二、项目功能描述

  1、注册:在登陆页面点击“注册”按钮,跳转到注册页面,注册页面输入“用户名”、“密码”以及“确认密码”,首先会进行非空校验以及密码一致性校验,然后会根据用户名查看用户是否存在,如不存在,则加入数据库中,注册成功,点击弹窗,进入登录界面;如果存在会返回提示信息,注册失败。
  2、登录:输入用户名和密码,首先会进行非空校验,为空则给出提示信息;如果不为空则查询数据库用户名是否存在,存在的话就校验密码是否正确,两个都校验通过则登陆成功,点击弹窗进入我的博客列表页面;如果用户名不存在或者密码错误,则提示“用户名或密码错误”,登录失败,点击弹窗,停留在登录界面。
  3、写博客:在我的博客列表页面,点击写博客按钮,进入添加博客页面,输入博客标题以及博客内容,点击发布文章,这个时候会弹窗“添加成功!是否继续添加?”点击“”,则停留在添加博客页面,点击“”,则进入带我的博客列表页面,并且第一条博客是我最新添加的博客。
  4、查看详情:在我的博客列表页,点击第一条最新添加的博客,进入博客详情页面,展示当前博客的标题、内容、发布时间以及阅读量等信息。每浏览一次阅读量+1;
  5、修改博客:在我的博客博客列表页面点击修改博客按钮,那么会进入博客编辑页,此时编辑页的标题以及正文的内容就是我所点击的博客的标题和正文。
  6、删除博客:在我的博客列表页面,点击每个博客对应的删除按钮,则会删除该博客,并且文章数量-1;
  7、博客主页:博客主页是分页展示所有的博客,也可以对博客进行查看详情,如果在首页,点击首页按钮,提示“已经在首页了”;如果只有一页,点击上一页,下一页,末页都不跳转,如果页面数量不是1页,点击相应的页面跳转按钮,会有相应的页面切换。
  8、退出登录:点击注销按钮,会提示弹窗“确认注销?”,点击确认则进入登录界面,点击取消则不退出登录,保留在当前页面。

三、测试计划

1、功能测试

1.1 测试用例

在这里插入图片描述

1.2 测试步骤

(1)注册测试
正常注册测试:
RegSuccess.csv文件:

xulin, 123456, 123456, http://localhost:8080/login.html, http://localhost:8080/reg.html
@Order(3)
    @ParameterizedTest
    @CsvFileSource(resources = "RegSuccess.csv")
    void regSuccess(String uname, String pwd, String pwd2, String login_url, String reg_url) throws InterruptedException {
        //打开博客登陆页面
        webDriver.get(login_url);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //找到注册按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        //进入到注册页面
        // 获取 页面的url   看是不是等于 “http://localhost:8080/reg.html”
        String curUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(reg_url,curUrl);
        //输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(uname);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(pwd);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入确认密码
        webDriver.findElement(By.cssSelector("#password2")).sendKeys(pwd2);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //点击注册
        webDriver.findElement(By.cssSelector("#submit")).click();
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //这里会有“注册成功”弹窗  确认
        sleep(2000);
        webDriver.switchTo().alert().accept();
        //页面跳转到登录
        // 获取 页面的url   看是不是等于 “http://localhost:8080/login.html”
        curUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(login_url, curUrl);
    }

在这里插入图片描述
在这里插入图片描述
异常注册测试:
RegFailed.csv 文件:

lisi, 1234, 1234, http://localhost:8080/login.html, http://localhost:8080/reg.html
"", 1234, 1234, http://localhost:8080/login.html, http://localhost:8080/reg.html
lisi, "", 1234, http://localhost:8080/login.html, http://localhost:8080/reg.html
lisi, 123456, 1234, http://localhost:8080/login.html, http://localhost:8080/reg.html
@Order(2)
    @ParameterizedTest
    @CsvFileSource(resources = "RegFailed.csv")
    void regFailed(String uname, String pwd, String pwd2, String login_url, String reg_url) throws InterruptedException {
        //打开博客登陆页面
        webDriver.get(login_url);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //找到注册按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        //进入到注册页面
        // 获取 页面的url   看是不是等于 “http://localhost:8080/reg.html”
        String curUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(reg_url,curUrl);
        //输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(uname);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(pwd);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入确认密码
        webDriver.findElement(By.cssSelector("#password2")).sendKeys(pwd2);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //点击注册
        webDriver.findElement(By.cssSelector("#submit")).click();
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //这里会有“注册失败”弹窗  确认
        sleep(2000);
        webDriver.switchTo().alert().accept();
        //页面跳转到登录
        // 获取 页面的url   看是不是等于 “http://localhost:8080/reg.html”
        curUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(reg_url, curUrl);
    }

在这里插入图片描述
在这里插入图片描述

(2)登录测试
正常登录测试:

/**
     * 输入正确的账号、密码  登陆成功
     */

    // @Test
    @Order(3)
    @ParameterizedTest
    @CsvFileSource(resources = "LoginSuccess.csv")
    //@CsvSource( {"lisi, 123, http://localhost:8080/myblog_list.html"})
    void loginSuccess(String uname, String pwd, String blog_list_url) throws InterruptedException {
        //打开博客登陆页面
        webDriver.get("http://localhost:8080/login.html");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(uname);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(pwd);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //点击登录
        webDriver.findElement(By.cssSelector("#submit")).click();
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //这里会有“登陆成功”弹窗  确认
        sleep(2000);
        webDriver.switchTo().alert().accept();
        //页面跳转到列表页
        // 获取 页面的url   看是不是等于 “http://localhost:8080/myblog_list.html”
        String curUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(blog_list_url, curUrl);
        //列表页展示用户信息 lisi
        //获取用户名
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String curUName = webDriver.findElement(By.cssSelector("#username")).getText();
        Assertions.assertEquals(uname, curUName);
    }

在这里插入图片描述

在这里插入图片描述
异常登录测试:
LoginFailed.csv 文件

lisi, 1234, http://localhost:8080/login.html
"", 123, http://localhost:8080/login.html
lisi, "", http://localhost:8080/login.html
xulin, 123, http://localhost:8080/login.html
 @Order(4)
    @ParameterizedTest
    @CsvFileSource(resources = "LoginFailed.csv")
    void loginFailed(String uname, String pwd, String login_url) throws InterruptedException {
        //打开博客登陆页面
        webDriver.get(login_url);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(uname);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(pwd);
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //点击登录
        webDriver.findElement(By.cssSelector("#submit")).click();
        //sleep(200);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //这里会有“登陆失败”弹窗  确认
        sleep(2000);
        webDriver.switchTo().alert().accept();
        //页面跳转到列表页
        // 获取 页面的url   看是不是等于 “http://localhost:8080/login.html”
        String curUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(login_url, curUrl);
    }

在这里插入图片描述
在这里插入图片描述

(3)发布博客测试
正常发布测试:

@ParameterizedTest
    @CsvSource({"http://localhost:8080/myblog_list.html"})
    void addBlog(String myBlog_url) throws InterruptedException {
        //获取当前文章数量
        String text = webDriver.findElement(By.cssSelector("#artcount")).getText();
        int blogNum = Integer.parseInt(text);

        //找到 “写博客”按钮  点击
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //进入添加博客界面
        // 通过Js讲鼻涕进行输入
        ((JavascriptExecutor) webDriver).executeScript("document.getElementById(\"title\").value=\"我的测试\"");
        sleep(3000);
        //*[@id="editorDiv"]/div[1]/div[5]/div[1]/div/div
        //找到输入框
        //#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div
        WebElement input = webDriver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span"));
        new Actions(webDriver).moveToElement(input).click().sendKeys("我的测试数据我的测试数据").perform();

        sleep(2000);
        webDriver.findElement(By.cssSelector("#submit")).click();

        //显示等待  等待confirm 弹窗出现
        Wait<WebDriver> wait = new WebDriverWait(webDriver, Duration.ofSeconds(2));
        wait.until(ExpectedConditions.alertIsPresent());
        //弹窗处理
        webDriver.switchTo().alert().dismiss();
        //我的博客列表页面
        String currentUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(myBlog_url,currentUrl);

        //博客数量
        text = webDriver.findElement(By.cssSelector("#artcount")).getText();
        int newBlogNum = Integer.parseInt(text);
        Assertions.assertEquals(blogNum,newBlogNum-1);
    }

在这里插入图片描述
在这里插入图片描述
异常发布测试:

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

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

相关文章

Linux(文件系统和日志分析)

1.inode & block 1.1 inode的内容 stat 文件名&#xff1a; 查看文件的元信息 df -i&#xff1a;查看每个分区的inode数量 [rootlocalhost ~]# df -i 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 devtmpfs 478387 382 4…

03-JAVA设计模式-策略模式

策略模式 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是行为设计模式之一&#xff0c;它使你能在运行时改变对象的行为。在策略模式中&#xff0c;一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中&#xff0c;…

C# winfrom 超详细UI创建过程 实现双色球选号器UI界面设计过程

一、 效果展示 1. 无点击效果展示&#xff1a;不选中——双色球为灰色&#xff0c;字体也为灰色 2.点击双色器效果展示&#xff1a;选中——双色球为红或者蓝&#xff0c;字体为白色 二、 使用控件标注说明 三、界面特点介绍 双色球代码控制生成---------由于红色33个球&…

Linux内核广泛采用的侵入式数据结构设计

Linux内核广泛采用的侵入式数据结构设计恐怕很难应用到一般程序开发中。基本上是个高维十字链表&#xff0c;一个节点(struct)可以同时位于多个hash/list/tree中。我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪…

【网络原理】IP协议的地址管理和路由选择

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 【网络…

Arthas:阿里出品,线上问题快速搞定!

前面我们通过JVM线程分析及内存分析来让大家从服务器资源异常情况下排查代码问题&#xff0c;类似这种的解决方式&#xff0c;更多的是在服务器资源占用已经异常显现&#xff0c;我们就可以按照这种方式去排查和解决。 但实际工作中&#xff0c;可能会出现&#xff1a;接口的TP…

什么是网络安全CTF?

什么是网络安全CTF? CTF 的意义&#xff1a; 如何入门 CTF&#xff1a; 推荐的在线 CTF 平台&#xff1a; 什么是网络安全CTF? CTF (Capture The Flag) 是一种网络安全竞赛&#xff0c;参赛者需要解决各种安全挑战&#xff0c;例如破解密码、利用漏洞、分析恶意软件等&am…

二极管钳位型光伏逆变并网建模simulink仿真

整理了二极管钳位型光伏逆变并网建模simulink仿真&#xff0c;效果明显&#xff0c;附赠仿真报告。适合小白 二极管钳位型光伏逆变并网是将光伏发电系统中的直流电能转换为交流电能&#xff0c;并与电网连接。在此仿真中使用最大功率点追踪&#xff08;MPPT&#xff09;技术&a…

【C语言】编译与链接

1.翻译环境与运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 1.翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令&#xff08;二进制指令&#xff09; 2.执行环境&#xff0c;它用于实际执行代码 2.翻译环境 那么翻译环境是怎么将源代码…

【Docker】docker部署lnmp和wordpress网站

环境准备 docker&#xff1a;192.168.67.30 虚拟机&#xff1a;4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

vue3学习笔记-快速上手

创建第一个vue3的应用 之前看书学习vue,书籍对应的版本是vue2,今天群里看小伙伴聊天&#xff0c;觉得他们说得对 &#xff0c;反正是从零开始学&#xff0c;而且vue2都不维护了&#xff0c;那为什么不直接学习vue3呢&#xff0c;于是乎&#xff0c;又开启了从0学vue3之路。 参考…

Linux之进程间通信(二)

system V system V共享内存是内核中专门设计的通信的方式, 粗粒度划分操作系统分为进程管理, 内存管理, 文件系统, 驱动管理.., 粒度更细地分还有 进程间通信模块. 对于操作系统, 通信的场景有很多, 有以传送数据, 快速传送数据, 传送特定数据块, 进程间协同与控制以目的, 它…

一键设置jdk环境脚本

自动化脚本 一、使用方法 创建一个txt文本&#xff0c;放在和jdk存放的同一目录下&#xff0c;复制粘贴进我的代码&#xff0c;利用全局替换&#xff0c;将jdk1.8,改成你自己的jdk包名字&#xff0c;再重新把这个文件保存为.vbs文件。然后运行就行了 MsgBox "Runing s…

线上社交app的搭建,圈子社交系统,小程序+app+H5三端,源码交付,支持二开!

在科技飞速发展的大背景下&#xff0c;年轻人社交不再局限于面对面&#xff0c;线上社交app已深入各大年轻人的手机中。相比于传统交友方式&#xff0c;线上社交app为用户提供了更加新奇的交友体验。同时&#xff0c;它还可以吸引更多的朋友&#xff0c;提高用户的整体交友体验…

第4篇:创建Nios II工程之Hello_World<三>

Q&#xff1a;接着我们再来完成Nios II软件工程设计部分。 A&#xff1a;从Quartus Tools选择Nios II Software Build Tools for Eclipse&#xff0c;打开Nios II SBT软件&#xff0c;Workspace指定到hello_world工程的software文件夹路径&#xff1b;再从File-->New-->…

Java学习13

目录 一.内部类: 1.概念&#xff1a; 2.内部类的分类&#xff1a; &#xff08;1&#xff09;定义在外部类的局部位置上&#xff08;通常在方法体中&#xff09;&#xff1a; 1. 局部内部类&#xff08;有类名&#xff09; 2.匿名内部类&#xff08;无类名-重点&#xff01;…

Linux 基础命令使用创建用户

浏览网站的时候图片&#xff0c;看到一个小练习。创建用户分别位于不同的用户组。 解答下面的题目 2、建立用户使用 useradd&#xff0c;设置密码使用passwd的命令。大概不会使用命令可以借助man来解答。 先建立用户组&#xff1a; groupadd group1 # group1 不存在先建立&…

Redis底层数据结构之ZSkipList

目录 一、概述二、ZSkipList结构三、和平衡树和哈希表的对比 redis底层数据结构已完结&#x1f44f;&#x1f44f;&#x1f44f;&#xff1a; ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis…

可替代IBM DOORS的现代化需求管理解决方案Jama Connect,支持数据迁移及重构、实时可追溯性、简化合规流程

作为一家快速发展的全球性公司&#xff0c;dSPACE一直致力于寻找保持领先和优化开发流程的方法。为推进其全球现代化计划&#xff0c;dSPACE开始寻找可以取代传统需求管理平台&#xff08;IBM DOORS&#xff09;的需求管理解决方案。 通过本次案例&#xff0c;您将了解dSPACE为…

【YOLO 系列】基于YOLO V8的火灾烟雾监控检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

摘要&#xff1a; 火灾烟雾的及时检测对于人们的生命财产安全至关重要。然而&#xff0c;在大多数情况下&#xff0c;火灾往往在被发现时已经进展到了难以控制的阶段&#xff0c;这导致了严重的后果。为了解决这一问题&#xff0c;我们提出了基于深度学习技术的火灾烟雾检测系…