web博客系统的自动化测试
目录
- 前言
- 测试用例
- 编写自动化脚本
- 测试准备
- 博客登录页相关测试用例
- 登陆成功
- 登录失败
- 博客首页相关测试用例
- 登陆成功
- 登录失败
- 博客详情页相关测试用例
- 登录成功
- 登录失败
- 博客编辑页相关测试用例
- 登陆成功
- 登录失败
- 编写测试文档
- 测试类型内容
前言
本次测试是运用个人写的一个博客系统进行自动化测试。博客包含登录页,博客首页,博客详情页,博客编辑页。那么我们就进行以上页面进行自动化测试。这里用Edge浏览器进行测试。
测试用例
我们设计测试用例的时候,一般都是用思维导图/脑图来进行列表,尽量思维多一些散发,用最少得测试用例覆盖的相对全面。
编写自动化脚本
我们可以根据上述的测试用例进行自动化脚本的编写,我们需要用到pycharm软件,并且要根据页面进行分类,来保证代码的清晰性和可读性。
测试准备
我们对web页面进行测试的时候,需要创建浏览器对象,然后请求url对页面进行访问,所以我们需要一个特殊的类就是until.py来做一些准备工作。
import datetime
import os.pathfrom selenium import webdriver
#因为我用的是Edge浏览器,所以要用edge的service
from selenium.webdriver.edge.service import Serviceclass Diver:diver=""def __init__(self):options=webdriver.EdgeOptions()self.diver=webdriver.Edge(service=Service(verbose = True))def getScreamShot(self):#屏幕截图dirname=datetime.datetime.now().strftime("%Y-%m-%d")if not os.path.exists("../images/"+dirname):os.mkdir("../images/"+dirname)#有路径filename=datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S")self.driver.save_screenshot("../images/"+dirname+"/"+filename)BlogDriver=Diver()
Edge其他的web使用方法请查阅:https://learn.microsoft.com/zh-cn/microsoft-edge/webdriver-chromium/?tabs=python
博客登录页相关测试用例
登录页的测试我们是根据登录成功和登录失败的区分的。
登陆成功
测试登录成功的流程:我们需要①先获取页面的元素(用户名框,密码框,登录按钮);②获取元素输入成功登录的密码和用户名,因为我们③登陆成功后首页会有用户名显示,我们可以用这来判断是否登录成功。④退出页面
from selenium.webdriver.common.by import By
from common.until import BlogDriverclass BlogLogin:driver=""url=""def __init__(self):self.driver=BlogDriver.diverself.url="http://8.137.19.140:9090/blog_login.html"self.driver.get(self.url)self.driver.implicitly_wait(1)def LoginSucTest(self):#捕获页面元素,输入正确的用户名密码 zhangsan 123456self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#登录成功后,能找到用户昵称,说明登录成功autul=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")if autul==None:print("登录不一致,失败")returnself.driver.quit()login=BlogLogin().LoginSucTest()
登录失败
登录失败就很多种情况了,比如说用户名不对,密码对,用户名对,密码不对,密码和用户名都不用,我们可以用其中一种测试就可以。并且通过手动输入,我们会发现他会出现弹窗!所以我们要处理弹窗。
所以我们在登录页如果出现弹窗,那么证明登录失败了,我们只需要解决弹窗就可以了。
from time import sleepfrom selenium.webdriver.common.by import By
from common.until import BlogDriverclass BlogLogin:driver=""url=""def __init__(self):self.driver=BlogDriver.diverself.url="http://8.137.19.140:9090/blog_login.html"self.driver.get(self.url)self.driver.implicitly_wait(1)def LoginSucTest(self):#捕获页面元素,输入正确的用户名密码 zhangsan 123456self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#登录成功后,能找到用户昵称,说明登录成功autul=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")if autul==None:print("登录不一致,失败")returnself.driver.quit()def LoginFailTest(self):#捕获页面元素,输入正确的用户名,错误的密码 zhangsan 1234567self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234567")#密码不对self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#存在弹窗证明登录失败,处理弹窗sleep(2)#这里必须休眠,是因为处理速度太快了,会造成他找不到alert=self.driver.switch_to.alertalert.accept()self.driver.quit()
login=BlogLogin().LoginFailTest()
博客首页相关测试用例
对博客首页的测试,我们要分为登录成功后的测试和登录失败的测试。
登陆成功
我们要测试登录成功情况下的,所以我们就需要让用户先登录成功,这个时候我们可以用这个形式。
#runTest.py
from time import sleep
from common.until import BlogDriver
from test import Bloglogin
from test import BlogListif __name__=="__main__":Bloglogin.BlogLogin().LoginSucTest()sleep(2)#登录成功之后,测试列表BlogList.BlogList().ListTestByLogin()sleep(2)#统一退出BlogDriver.diver.quit()
我们测试用例中需要测试他是否存在,所以直接检查是否存在即可,如果不存在会报错!
#博客首页测试
from selenium.webdriver.common.by import Byfrom common.until import BlogDriverclass BlogList:driver=""url=""def __init__(self):self.driver=BlogDriver.diverself.url="http://8.137.19.140:9090/blog_list.html"self.driver.get(self.url)def ListTestByLogin(self):#测试首页博客列表中的标题存在self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > div.title")#测试首页博客列表中的内容存在self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > div.desc")#测试首页博客列表中的查看存在self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > a")#测试首页的用户名是否存在self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")bloglist=BlogList().ListTestByLogin()
登录失败
因为登录失败的情况下,我们会出现弹窗,如果是弹窗的话,不解决弹窗是没有办法锁定任何元素的,那么我么你直接访问博客列表详情页会怎么样呢?
当我手动测试的时候,他会直接返回登录页。
经过我们测试,发现登录失败,在访问此页面,就会报错没有找到这些元素,也就是说登录失败,是没有办法访问博客列表页的。
from time import sleep
from common.until import BlogDriver
from test import Bloglogin
from test import BlogListif __name__=="__main__":Bloglogin.BlogLogin().LoginFailTest()sleep(2)#登录失败之后,测试列表BlogList.BlogList().ListTestByLogin()sleep(2)#统一退出BlogDriver.diver.quit()
博客详情页相关测试用例
对博客详情页的测试,我们要分为登录成功后的测试和登录失败的测试。
登录成功
当我们登录成功的时候,进入列表页,点击查看全文后,就可以查看博客的详细内容,包括标题、时间、内容、最好查看一下用户名。
from selenium.webdriver.common.by import Byfrom common.until import BlogDriverclass BlogDetail:driver = ""url = ""def __init__(self):self.driver = BlogDriver.diverself.url = "http://8.137.19.140:9090/blog_detail.html?blogId=7681"self.driver.get(self.url)#登录状态下的博客详情页def BlogDetaulTest(self):#进入列表,要点击查看内容#检查标题self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.title")#时间self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.date")#内容self.driver.find_element(By.CSS_SELECTOR, "#detail > p")#用户名self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
登录失败
登录失败,会发现我们找不到元素,也就是无法进入博客详细页。
from time import sleep
from common.until import BlogDriver
from test import Bloglogin
from test import BlogList
from test import BlogDetailif __name__=="__main__":Bloglogin.BlogLogin().LoginFailTest()sleep(2)#失败,列表点击后,查看内容BlogDetail.BlogDetail().BlogDetaulTest()sleep(2)#统一退出BlogDriver.diver.quit()
博客编辑页相关测试用例
对博客编辑页的测试,我们要分为登录成功后的测试和登录失败的测试。
登陆成功
如果登录成功,我们可以通过点击写博客,进行博客的编辑。我们需要写标题,然后内容,然后点击发布。
但是根据以下代码编写后发现,我们无法对MD外部插件进行空时,这个时候我们可以对md上述符号进行控制,编辑一部分内容。
from selenium.webdriver.common.by import Byfrom common.until import BlogDriverclass BlogEdit:driver = ""url = ""def __init__(self):self.driver = BlogDriver.diverself.url = "http://8.137.19.140:9090/blog_edit.html"self.driver.get(self.url)#正确发布博客def EditSucTest(self):#进入列表页,点击写博客self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(5)").click()#成功发布博客:标题写入,内容存在self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("自动化测试")self.driver.find_element(By.CSS_SELECTOR, "#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll").send_keys("博客内容测试博客内容测试博客内容测试博客内容测试")#点击发布文章self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
登录失败
因为登录页面右上角,直接有点写博客按钮,所以我们可以直接访问网页,模拟没有登录的时候是否可以返回呢?
结果就是直接返回了登录页面。
from time import sleep
from common.until import BlogDriver
from test import Bloglogin
from test import BlogList
from test import BlogDetail
from test import BlogEditif __name__=="__main__":#点击写博客,然后编辑BlogEdit.BlogEdit().EditSucTest()sleep(5)#统一退出BlogDriver.diver.quit()
编写测试文档
测试文档包括以下几部分:项目背景、项目简介、测试计划、测试工具、设计的测试类型(功能测试、性能测试、自动化测试)、测试类型测内容、项目测试的bug简述、测试结论等。
测试类型内容
这里主要写你的测试类型中的内容,比如测试用例和测试的脚本。
相关文章:
web博客系统的自动化测试
目录 前言测试用例编写自动化脚本测试准备博客登录页相关测试用例登陆成功登录失败 博客首页相关测试用例登陆成功登录失败 博客详情页相关测试用例登录成功登录失败 博客编辑页相关测试用例登陆成功登录失败 编写测试文档测试类型内容 前言 本次测试是运用个人写的一个博客系…...
【论文阅读】Multi-level Semantic Feature Augmentation for One-shot Learning
用于单样本学习的多层语义特征增强 引用:Chen, Zitian, et al. “Multi-level semantic feature augmentation for one-shot learning.” IEEE Transactions on Image Processing 28.9 (2019): 4594-4605. 论文地址:下载地址 论文代码:https:…...
网络知识面试
1、http状态码 101: 切换请求协议 200:(请求成功)。服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 301 : (永久移动,永久性重定向,会缓存) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。…...
图片预览 图片上传到服务器
首先要明白 理解 multipart/form-data:multipart/form-data是一种在HTTP请求中使用的MIME类型,主要用于在客户端和服务器之间传输包含文件或二进制数据的表单数据。它通过一个边界(boundary)来分隔不同的表单字段和文件数据。…...
前端:base64的作用
背景 项目中发现,img标签中写src,读取一个png图片,只有16kb,速度特别慢。 解决办法,将图片转为base64,然后读取,速度特别快17ms就解决。 定义:base64是一种基于64个可打印字符(A-…...
Django在fitler过滤不等于的条件
提问 django 在API接口fitler的时候如何过滤 category 不等于6的 解答 为了在AoYuStudentFilter中设置过滤category不等于6的条件,需要使用django_filters库中的exclude方法。不过直接在FilterSet中使用exclude可能不那么直观,因为FilterSet主要设计用…...
Spring Boot英语知识分享网站:技术与实践
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
京准电钟:NTP网络校时服务器从入门到精准
京准电钟:NTP网络校时服务器从入门到精准 京准电钟:NTP网络校时服务器从入门到精准 1.前言 由计算机网络系统组成的分布式系统,若想协调一致进行:IT行业的“整点开拍”、“秒杀”、“Leader选举”,通信行业的“同步…...
C++趣味编程玩转物联网:用树莓派Pico控制四位数码管
数码管是一种常用的数字显示器件,广泛应用于电子时钟、记分牌和智能设备显示界面。在本项目中,我们将通过树莓派Pico板控制一个四位数码管模块,展示从 0000 到 9999 的数字动态显示。这不仅是一次硬件和软件结合的实践,还可以帮助…...
DRM(数字权限管理技术)防截屏录屏----视频转hls流加密、web解密播放
提示:视频转hls流加密、web解密播放 需求:研究视频截屏时,播放器变黑,所以先研究的视频转hls流加密 文章目录 [TOC](文章目录) 前言一、工具ffmpeg、openssl二、后端nodeexpress三、web播放四、文档总结 前言 HLS流媒体协议&a…...
实验三 z变换及离散时间LTI系统的z域分析
实验原理 有理函数z 变换的部分分式展开 【实例2-1】试用Matlab 命令对函数 X ( z ) 18 18 3 − 1 − 4 z − 2 − z − 3 X\left(z\right)\frac{18}{183^{-1} -4z^{-2} -z^{-3} } X(z)183−1−4z−2−z−318 进行部分分式展开,并求出其z 反变换。 B[18]; A…...
Python中的DrissionPage详解
文章目录 Python中的DrissionPage详解一、引言二、DrissionPage的基本使用1、安装与启动2、元素定位与操作 三、高级功能1、截图功能2、数据提取3、与其他库的集成 四、具体使用示例五、总结 Python中的DrissionPage详解 一、引言 DrissionPage是一个强大的Python库ÿ…...
python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表
excel表格是大家经常用到的文件格式,各行各业都会跟它打交道。之前文章我们介绍了使用openpyxl和xlrd库读取excel表数据,使用xlwt库创建和编辑excel表,在办公自动化方面可以方便我们快速处理数据,帮助我们提升效率。 python之open…...
go语言怎么实现bash cmd里的mv功能?
在Go语言中实现类似于Bash命令行中的mv命令的功能,主要是通过文件系统的操作来完成的。mv命令可以用来移动文件或目录,也可以用来重命名文件或目录。在Go语言中,可以使用标准库中的os和io/ioutil包来实现这些功能。 以下是一个简单的例子&…...
Vue前端面试进阶(五)
使用Element UI开发的实际项目 在实际项目中,我使用Element UI来快速构建用户界面。Element UI是一套为开发者、设计师和产品经理准备的基于Vue 2.0的桌面端组件库,它提供了丰富的UI组件,极大地提高了开发效率。然而,在使用过程中…...
面试手撕题积累
1、实现滑动窗口限流,允许每分钟最多有100个请求 阿里一面题。 核心: 时间窗口管理:滑动窗口会根据时间流逝不断更新,需要记录请求的时间戳,并根据当前时间计算窗口内的请求数量。 限流判断:每次请求到来…...
notepad++文件github下载
1、github下载网址:Releases notepad-plus-plus/notepad-plus-plus GitHub 2、找到操作系统支持的软件: 3、CSDN下载链接:https://download.csdn.net/download/u013083576/90046203...
.NET新知识点笔记
using 用法介绍 using (SqlCommand cmd new SqlCommand(SQLString, connection)) 为什么使用上面的using 而不直接使用下述的来直接 SqlCommand cmd new SqlCommand(SQLString, connection)如果你需要使用一个对象,这个对象需要占用很多紧缺的资源&am…...
数据结构:链表进阶
链表进阶 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3.链表面试题4.LinkedList的使用5.1 什么是LinkedList4.2 LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 通过源码知道,ArrayList底层使用数组来存储元素࿱…...
Python 爬虫入门教程:从零构建你的第一个网络爬虫
网络爬虫是一种自动化程序,用于从网站抓取数据。Python 凭借其丰富的库和简单的语法,是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识,并实现一个简单的爬虫项目。 1. 什么是网络爬虫? 网络爬虫&#x…...
Java面试题、八股文——JVM篇最终篇
1.如何选择垃圾收集器? 选择合适的垃圾收集器(Garbage Collector, GC)对于优化Java应用程序的性能至关重要。不同的应用场景和系统需求可能需要不同类型的垃圾收集器来满足。以下是一些考虑因素以及常见的垃圾收集器选项,帮助您做…...
Spring Boot整合Redis Stack构建本地向量数据库相似性查询
Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中,数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统,不仅可以用作缓存、消息代理,还可以扩展为向量数据库,实现高效的相…...
shell脚本基础学习_总结篇(完结)
细致观看可以,访问shell脚本学习专栏,对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义: 2. 主要特点: 3. shell脚本的基本结构 4. S…...
什么是 C++ 中的函数对象?它有什么特点?
在 C 中,函数对象(Function Object)是一种可调用对象,它允许像函数一样被调用,但实际上它可能并不是真正的函数。函数对象可以是以下几种类型之一: 普通函数: 一个普通的、定义在命名空间或类…...
css:项目
这是一个完整的网站制作的流程 美工会先制作一个原型图: 原型图写的不详细,就是体现一个网页大致的布局 然后美工再做一个psd样例图片 然后再交给程序员 项目 模块化开发:把代码的不同的样式封装起来,需要用到相同样式的标签就…...
macOS 开发环境配置与应用开发指南
macOS 开发环境配置与应用开发指南 macOS作为苹果公司推出的操作系统,因其稳定性、优雅的用户界面和强大的开发支持,已成为开发者和创意专业人士的首选平台之一。无论是开发iOS、macOS桌面应用,还是Web应用、跨平台程序,macOS都提…...
[A-19][V06]ARMv8/v9-内存虚拟化原理
ver0.2 [看前序文章有惊喜,关注W\X\G=Z+H=“浩瀚架构师”,可以解锁全部文章] 前言 前一篇文章,我们介绍了ARM内存的属性,算是一个小小的里程碑点,接下来我们会把注意力重新拉回虚拟化的赛道。我们从[V-05] 虚拟化基础-异常模型(Exception model)之后,花了很多笔墨介绍…...
registry 删除私有仓库镜像
原文链接:https://blog.csdn.net/yogima/article/details/122172744 如果需要彻底删除,只需进行register 磁盘删除镜像 彻底删除了,就可以到达彻底删除的目的。 如果只需要软删除,则只需进行通过API删除。 curl --header "Ac…...
UPLOAD LABS | UPLOAD LABS 靶场初识
关注这个靶场的其它相关笔记:UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01:UPLOAD LABS 靶场简介 UPLOAD LABS 靶场是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列文件上传漏洞的实验环境,用于帮助用户了解文件上传漏洞的…...
Samba服务器常见问题处理
指定的网络文件夹目前是以其他用户名和密码进行映射的。要用其他用户名和密码进行连接,首先请断开所有现有的连接到网络共享的映射 解决方案 单击“开始”菜单,选择“运行…”。 在弹出的窗口中,输入cmd 进入命令行模式,并输入…...
中关村网站建设公司/网络优化培训
这里的电压环带宽,反应的是电压环响应指令能力。即输出电压跟踪指令电压的能力。 指令响应能力需要有一个指标来衡量,例如用输入阶跃指令来看输出的上升、超调等 或者用输入正弦指令看输出正弦分量与指令的幅度差和相位差,这就是我们说的带…...
网站按域名跳转不同的页面/短视频营销策划方案
如果访问存储器时使用bp寻址,则默认的段寄存器是“SS”,即堆栈段。SS堆栈段通常是指采用堆栈方式工作的一段内存区域;在采用段式内存管理方式进行程序内存分配的架构中,堆栈段用来存放局部变量和函数返回地址。段寄存器是因为对内…...
电子商务网站开发费用/h5网站制作平台
5V 输入升压开关型双节锂电池充电管理芯片 -FS5080ES FS5080ES 是一款 3.6V-5.5V/2A 输入, 1A 输出,双节锂电池/锂离子电池充电的异步升压充电控制器。具有完善的充电保护功能。针对不同的应用场合,芯片可以通过方便地调节外部电阻的阻值来改…...
重庆本地建站/郑州seo外包阿亮
1.首先你要有一个github账号,如果没有的话,登录网址注册:https://github.com/ 2.进入你的github 点击右上角的号 选择 New repository 3.取一个Repository name,不能和自己的其他项目冲突 PS:Repository name: 仓库名称Description(可选…...
wordpress高阶教程/怎么让某个关键词排名上去
目录 Bash 的变量和运算符 什么是变量 变量的分类 用户自定义变量 变量定义 变量调用 变量查看 变量删除 Bash 的变量和运算符 什么是变量 在定义变量时,有一些规则需要遵守:变量名称可以由字母、数字和下划线组成,但是不能以数字…...
模板网站建设公司电话/网站建设需要多少钱
前言:最近因项目需求,需要打包linux-qt程序给客户先用一下子。百度一大堆终于找了几个靠谱的来综合一下,留为备用吧。由于是先遣版所以仅制作为免安装程序的格式。正文:博主的qt是5.9.2的,程序名称为ocs,下…...