博客系统功能测试

博客系统网址:http://8.137.19.140:9090/blog_list.html

主要测试内容

功能测试、界面测试、性能测试、易用性测试、安全测试、兼容性测试、弱网测试、安装卸载测试、压力测试…

测试方法及目的

利用selenium和python编写测试脚本,对博客系统进行的相关功能进行测试,找出该网址的潜在问题

测试思路讲解:本测试项目的规模比较小,仅需要对四个主要页面进行功能测试即可,因此本文直接从页面入手开始编写自动化测试脚本–即一个页面对应一个测试方法,不需要细分出多个功能进行单独测试。另外需要声明,本文使用的测试框架不够成熟,代码冗余繁多,仍有很多有待改进的地方,请各位看官老爷多多指教指教()

博客系统测试案例

功能测试
登录页测试案例
列表页测试案例
详情页测试案例编辑页测试案例

其他测试
其他测试案例

注意:本文仅针对该网页进行功能测试,其他测试(如界面测试、性能测试等)暂不列入测试范围

测试板块 ---- 四大页面

登录页面

登录页面展示
请添加图片描述
前提条件–用户处于登录状态下,且当前打开的是博客详情页的链接。主要测试功能–1.检查页面元素,检查文章标题、发布时间、内容等是否正确展示。2.点击编辑按钮,看是否正常跳转至对应文章的编辑页,若为成功跳转检查按键是否异常,用户的网络是否通畅,并返回对应异常信息等。

博客列表页

博客列表页内容展示
博客列表页
前提条件 – 用户已登陆账号,且已跳转至博客列表页面。主要测试功能–1.检查页面元素,检查用户头像、昵称、文章数、外部链接等信息是否展示错误等。
2.功能测试,点击外部链接,测试是否跳转至对应网站;点击查看全文看是否跳转至对应文章的详情页。

博客详情页

博客详情页展示
在这里插入图片描述前提条件–用户处于登录状态下,且当前打开的是博客详情页的链接。主要测试功能–1.检查页面元素,检查文章标题、发布时间、内容等是否正确展示。2.点击编辑按钮,看是否正常跳转至对应文章的编辑页,若为成功跳转检查按键是否异常,用户的网络是否通畅,并返回对应异常信息等。

编辑页面

编辑页面展示
在这里插入图片描述

前提条件,检查用户通过何种方式打开编辑页面,若用户通过右上角写博客方式进入,则标记为发布新博客,若用户通过详情页点击编辑进入编辑页面则标记为修改博客内容。主要测试功能–元素检查,若用户以新发布博客方式进入本页则仅需检查文本框以及图上的相关功能是否能够正常使用即可,若用户以修改内容的方式进入本页则除了上述功能外仍需查看文章标题及内容是否和打开的文章一致。

自动化代码示例

# 创建驱动对象 Utils
from selenium import webdriver# 在这个文件中配置好通用的信息
class Driver:driver = ""# 构造函数def __init__(self):self.driver = webdriver.Chrome()# driver = webdriver.Chrome()# if driver is None:#     raise RuntimeError("无法启动 Chrome WebDriver!")blogdriver = Driver()
# BlogLogin 测试登录功能
from common.Utils import blogdriver
from selenium.webdriver.common.by import By
import timeclass BlogLogin:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_login.html"self.driver = blogdriver.driverself.driver.get(self.url)# 元素检查def ElementsCheckUp(self):text = self.driver.find_element(By.CSS_SELECTOR,'body > div.container-login > div > h3').textprint(text)text = self.driver.find_element(By.CSS_SELECTOR, 'body > div.container-login > div > div:nth-child(2) > span').textprint(text)text = self.driver.find_element(By.CSS_SELECTOR, 'body > div.container-login > div > div:nth-child(3) > span').textprint(text)text = self.driver.find_element(By.CSS_SELECTOR, '#submit').textprint(text)#成功登录测试def LoginSuccess(self):# 清空文本框内容self.driver.find_element(By.CSS_SELECTOR,'#username').clear()self.driver.find_element(By.CSS_SELECTOR, '#password').clear()# 输入账号和密码self.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()time.sleep(5)# 检查是否登录成功 -- by用户名self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.left > div > h3')# 注销账号恢复初始状态self.driver.find_element(By.CSS_SELECTOR,'body > div.nav > a:nth-child(6)').click()# 异常登录测试 -- 账号和密码为空def LoginFail001(self):# 清空输入框,保证账号和密码为空self.driver.find_element(By.CSS_SELECTOR,'#username').clear()self.driver.find_element(By.CSS_SELECTOR, '#password').clear()# 点击提交self.driver.find_element(By.CSS_SELECTOR,'#submit').click()# 检查是否登录失败time.sleep(3)alert = self.driver.switch_to.alertassert alert.text == "账号或密码不能为空"# 关闭弹窗self.driver.switch_to.alert.accept()# 异常登录测试 -- 正确账号和错误密码def LoginFail002(self):# 清空输入框,保证账号和密码为空self.driver.find_element(By.CSS_SELECTOR,'#username').clear()self.driver.find_element(By.CSS_SELECTOR, '#password').clear()self.driver.find_element(By.CSS_SELECTOR,'#username').send_keys('zhangsan')self.driver.find_element(By.CSS_SELECTOR,'#password').send_keys('123')self.driver.find_element(By.CSS_SELECTOR,'#submit').click()# 检查是否登录失败time.sleep(3)alert = self.driver.switch_to.alertassert alert.text == "密码错误"# 关闭弹窗self.driver.switch_to.alert.accept()# 异常登录测试 -- 错误账号和正确密码def LoginFail003(self):# 清空输入框,保证账号和密码为空self.driver.find_element(By.CSS_SELECTOR,'#username').clear()self.driver.find_element(By.CSS_SELECTOR, '#password').clear()self.driver.find_element(By.CSS_SELECTOR,'#username').send_keys('zhanglisi')self.driver.find_element(By.CSS_SELECTOR,'#password').send_keys('123456')self.driver.find_element(By.CSS_SELECTOR,'#submit').click()# 检查是否登录失败time.sleep(3)alert = self.driver.switch_to.alertassert alert.text == "用户不存在"# 关闭弹窗self.driver.switch_to.alert.accept()# 异常登录测试 -- 错误账号和错误密码def LoginFail004(self):# 清空输入框,保证账号和密码为空self.driver.find_element(By.CSS_SELECTOR, '#username').clear()self.driver.find_element(By.CSS_SELECTOR, '#password').clear()self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys('zhangsanlisi')self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys('123')self.driver.find_element(By.CSS_SELECTOR, '#submit').click()# 检查是否登录失败time.sleep(3)alert = self.driver.switch_to.alertassert alert.text == "用户不存在"# 关闭弹窗self.driver.switch_to.alert.accept()
# BlogList 测试博客列表页
from common.Utils import blogdriver
from selenium.webdriver.common.by import By
import timeclass BlogList:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_list.html"self.driver = blogdriver.driverself.driver.get(self.url)def UnLoginTest(self):# self.driver.get('http://8.137.19.140:9090/blog_login.html')time.sleep(5)elmtext:str = self.driver.find_element(By.CSS_SELECTOR, 'div.container-login  h3').textprint(elmtext)assert elmtext == "登陆"def ElementCheckUpByLogin(self):time.sleep(3)# 清空文本框内容self.driver.find_element(By.CSS_SELECTOR, '#username').clear()self.driver.find_element(By.CSS_SELECTOR, '#password').clear()# 输入账号和密码self.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()time.sleep(10)# 检查是否登录成功 -- by用户名print(self.driver.find_element(By.CSS_SELECTOR, 'div.left h3').text)# 获取外部链接print(self.driver.find_element(By.CSS_SELECTOR, 'div.left a').text)# 获取文章总数print(self.driver.find_element(By.CSS_SELECTOR, 'div.left div:nth-child(5) > span:nth-child(1)').text)# 获取文章分类print(self.driver.find_element(By.CSS_SELECTOR, 'div.left div:nth-child(5) > span:nth-child(2)').text)# 获取列表页信息 -- 第一篇文章标题print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > div.title').text)# 第一篇文章发布的时间print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > div.date').text)# 第一篇文章内容print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > div.desc').text)# 查看原文信息print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > a').text)def SeeMoreByLogin(self):# 检查用户是否在登录状态下time.sleep(2)print(self.driver.find_element(By.CSS_SELECTOR, 'div.left h3').text)# 点击查看全文self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > a').click()time.sleep(2)# 检查是否跳转至详情页# print(self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(1)').text)# print(self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(2)').text)# 返回列表页,继续完成后续测试self.driver.back()def UpElementByLogin(self):# 点击主页self.driver.find_element(By.CSS_SELECTOR, 'div.nav > a:nth-child(4)').click()# 检查是否跳转至主页 -- 通过昵称和博客列表第一篇的标题time.sleep(2)print(self.driver.find_element(By.CSS_SELECTOR, 'div.left h3').text)print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > div.title').text)time.sleep(2)# 点击写博客self.driver.find_element(By.CSS_SELECTOR, 'div.nav > a:nth-child(5)').click()# 检查是否跳转成功 -- 通过发布博客print(self.driver.find_element(By.CSS_SELECTOR, '#submit').get_attribute('value'))self.driver.back()time.sleep(2)self.driver.find_element(By.CSS_SELECTOR,'body > div.nav > a:nth-child(6)').click()# 检查是否注销成功print(self.driver.find_element(By.CSS_SELECTOR, 'div.container-login h3').text)
# BlogDetail 测试博客详情页
from common.Utils import blogdriver
from selenium.webdriver.common.by import By
import timeclass BlogDetail:url = ''driver = ''def __init__(self):self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=91386"self.driver = blogdriver.driverself.driver.get(self.url)def UnLoginTest(self):# 未登录状态下打开博客详情页 -- 跳转至登录页面 --> 检测是否跳转至登录页time.sleep(3)print(self.driver.find_element(By.CSS_SELECTOR, 'div.container-login > div > h3').text)def ElementCheckUpByLogin(self):# 未登录 -- 跳转至登录界面time.sleep(3)# 清空文本框内容self.driver.find_element(By.CSS_SELECTOR, '#username').clear()self.driver.find_element(By.CSS_SELECTOR, '#password').clear()# 输入账号和密码self.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()time.sleep(5)# 检查是否登录成功 -- by用户名print(self.driver.find_element(By.CSS_SELECTOR, 'body > div.container > div.left > div > h3').text)# 打开详情页self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > a').click()time.sleep(2)# 检查是否跳转成功print(self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(1)').text)print(self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(2)').text)# 检查文章标题-时间-内容print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div > div.title').text)print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div > div.date').text)print(self.driver.find_element(By.CSS_SELECTOR, '#h2-u5728u8FD9u91CCu5199u4E0Bu4E00u7BC7u535Au5BA2').text)def FunctionTestByLogin(self):time.sleep(3)# 检查编辑按钮是否正常self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(1)').click()time.sleep(2)# 检查是否跳转成功print(self.driver.find_element(By.CSS_SELECTOR, '#submit').text)# 返回博客详情页面界面self.driver.back()time.sleep(3)# self.driver.find_element(By.CSS_SELECTOR, 'div.right > div > div.operating > button:nth-child(2)').click()
from common.Utils import blogdriver
from selenium.webdriver.common.by import By
import timeclass BlogEdit:url = ''driver = ''def __init__(self):self.url = "http://8.137.19.140:9090/blog_edit.html"self.driver = blogdriver.driverself.driver.get(self.url)def EditTestFromUrl(self):time.sleep(5)UpText = self.driver.find_element(By.CSS_SELECTOR, '#submit').get_attribute('value')if UpText == '发布文章':print("当前正在编辑文章,进入方式为使用URL")self.driver.find_element(By.CSS_SELECTOR, '#title').send_keys("哈哈哈")self.driver.find_element(By.CSS_SELECTOR,'#submit').click()self.driver.quit()

项目Bug

bug描述:文章总数与实际总数不一致
在这里插入图片描述
bug2描述:
用户未登录状态下仍能编辑博客,且点击发布博客后内容丢失,未能正常跳转至登录页登录后发布博客
在这里插入图片描述

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

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

相关文章

项目制作流程

一、使用 CRA 创建项目 npx create-react-app name 二、按照业务规范整理项目目录 (重点src目录) 三、安装插件 npm install sass -Dnpm install antd --savenpm install react-router-dom 四、配置基础路由 Router 1. 安装路由包 react-router-dom …

ngx_http_random_index_module 模块概述

一、使用场景 随机内容分发 当同一目录下存放多份等价内容(如多张轮播图、不同版本静态页面等)时,可通过随机索引实现负载均衡或流量分散。A/B 测试 通过目录请求自动随机分配用户到不同测试组,无需后端逻辑参与。动态“首页”选…

智能权限守护者:基于Python描述符的动态角色控制实现

智能权限守护者:基于Python描述符的动态角色控制实现 引言:当描述符遇见权限管理 在Python的魔法方法体系中,描述符(Descriptor)以其优雅的属性访问控制机制著称。当我们将描述符与RBAC(基于角色的访问控制)模型结合,就能创造出既灵活又安全的动态权限管理系统。本文…

Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器

目录 1. 回显服务器 -- echo server 1.1 相关函数介绍 1.1.1 socket() 1.1.2 bind() 1.1.3 recvfrom() 1.1.4 sendto() 1.1.5 inet_ntoa() 1.1.6 inet_addr() 1.2 Udp 服务端的封装 -- UdpServer.hpp 1.3 服务端代码 -- UdpServer.cc 1.4 客户端代码 -- UdpClient.…

Linux 内核等待机制详解:prepare_to_wait_exclusive 与 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函数解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 内核中用于将进程以独占方式加入等待队列的关键函数,其主要功能包括: 标记独占等待:通过设置 WQ_FLAG_EXCLUSIVE 标志,表明此等待条目是独占的。 安全入队:在自旋锁保护下,将条…

【Android构建系统】了解Soong构建系统

背景介绍 在Android7.0之前,Android使用GNU Make描述和执行build规则。Android7.0引入了Soong构建系统,弥补Make构建系统在Android层面变慢、容易出错、无法扩展且难以测试等缺点。 Soong利用Kati GNU Make克隆工具和Ninja构建系统组件来加速Android的…

信息学奥赛一本通 1539:简单题 | 洛谷 P5057 [CQOI2006] 简单题

【题目链接】 ybt 1539:简单题 洛谷 P5057 [CQOI2006] 简单题 【题目考点】 1. 树状数组 模板题及讲解:洛谷 P3374 【模板】树状数组 【解题思路】 解法1:树状数组 该有01构成数组初值都为0。 某位置的元素被修改奇数次后值为1&#x…

仓颉开发语言入门教程:搭建开发环境

仓颉开发语言作为华为为鸿蒙系统自研的开发语言,虽然才发布不久,但是它承担着极其重要的历史使命。作为鸿蒙开发者,掌握仓颉开发语言将成为不可或缺的技能,今天我们从零开始,为大家分享仓颉语言的开发教程,…

玉米籽粒发育

成熟玉米籽粒的结构 玉米籽粒的组成 成熟的玉米籽粒主要由以下三部分组成: 母体组织:包括种皮、胎座和花梗。种皮由珠被发育而来,起到保护种子的作用,并在种子的休眠和萌发中发挥重要作用。胚:包含根分生组织、茎分…

sherpa-ncnn:音频处理跟不上采集速度 -- 语音转文本大模型

目录 1. 问题报错2. 解决方法 1. 问题报错 报错: An overrun occurred, which means the RTF of the current model on your board is larger than 1. You can use ./bin/sherpa-ncnn to verify that. Please select a smaller model whose RTF is less than 1 fo…

Postman一直打不开的解决办法

Postman 是一款非常流行的开源 API 开发工具,主要用于构建、测试、调试和文档化应用程序接口(API)。但有时它的性能不会特别稳定,功能限制和扩展性不足;应用于开发、测试、运维等环节,尤其在开发 RESTful A…

问题|对只允许输入的变量是否进行了更改

“对只允许输入的变量是否进行了更改”这一问题的核心是:在编程中,某些变量被设计为仅用于输入(只读),但在代码中可能被意外修改,导致潜在错误。以下是详细解释: 1. 什么是“只允许输入的变量”…

RPC与SOAP的区别

一.RPC(远程过程调用)和SOAP(简单对象访问协议)均用于实现分布式系统中的远程通信,但两者在设计理念、协议实现及应用场景上存在显著差异。 二.对比 1.设计理念 2.协议规范 3.技术特性 4.典型应用场景 5.总结 三.总结…

c#的内存指针操作(仅用于记录)

c#也可以直接操作内存指针,如下为示例: unsafe {byte[] a {1,2,3};fixed (byte* p1 a, p2 &a[^1]){Debugger.Log(1, "test", $"max index:{p2-p1}");Debugger.Log(1, "test", $"address:{(long)p1:X}")…

Jsp技术入门指南【十三】基于 JSTL SQL 标签库实现 MySQL 数据库连接与数据分页展示

Jsp技术入门指南【十三】基于 JSTL SQL 标签库实现 MySQL 数据库连接与数据分页展示 前言一、回顾SQL标签的内容1. 什么是JSTL SQL标签?2.为什么要用SQL标签?3.第一步:引入SQL标签库4. SQL标签的核心功能:连接数据库标签常用属性&…

羽毛球订场小程序源码介绍

基于ThinkPHP、FastAdmin以及UniApp开发的羽毛球订场小程序源码,这款小程序旨在为羽毛球爱好者提供便捷的场地预订服务。 该小程序前端采用UniApp框架开发,具有良好的跨平台兼容性,可以一键发布至iOS和Android平台,极大地提高了开…

Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目

环境: Windows: win10, UE4.27, Visual Studio 2022 Community.Linux: 22.04 windows环境安装教程: 链接遇到的问题(问题:解决方案) 点击Linux打包按钮,跳转至网页而不是执行打包流程:用VS打开项…

SpringBoot 3.x 集成 MyBatisPlus

文章目录 集成 MyBatisPlus第 1 步:创建 SpringBoot 项目第 2 步:添加 MyBatisPlus 依赖第 3 步:编写 CRUD 代码创建 Entity创建 Mapper创建 Service编写 Controller第 4 步:执行初始化 SQL第 5 步:配置第 6 步:测试测试 ControllerMapper 层单元测试参考🚀 目标 1:基…

java基础-抽象类和抽象方法

1.abstract 可以修饰:类、方法 (1)修饰类: 类不能被实例化; 抽象类一定有构造器,便于子类实例化时调用; (2)修饰方法:抽象方法 只有方法的声明&#xff…

解决电脑问题(8)——网络问题

电脑网络出现问题的原因较为复杂,以下是从网络连接、网络配置以及网络环境等方面的常见问题及解决方法: 网络连接问题 检查物理连接:对于有线网络,检查网线是否插好,网线有无破损、断裂等情况。对于无线网络&#xff…