1.项目简介
博客系统是一款面向个人创作者、企业及技术爱好者设计的内容管理平台,旨在为用户提供高效、灵活的内容发布与管理解决方案。系统通过模块化架构实现多场景适配,兼顾轻量化与可扩展性,满足从个人记录到企业信息发布的多层次需求。
用户端提供直观的内容展示界面,支持文章分类检索、全文搜索及跨设备响应式布局。读者可通过评论、点赞与社交分享功能参与互动,增强内容传播效果。管理后台集成文章编辑(支持Markdown与富文本)、多用户权限管理及数据统计模块,管理员可实时监控访问流量、用户行为等关键指标,优化运营策略。扩展功能涵盖SEO工具、多语言切换及第三方登录接口,进一步提升平台适用性。
2.测试用例
设计一个项目的测试用例主要从以下六个方面进行,功能测试,性能测试,兼容性测试,安全测试,界面测试,易用性测试。
3.执行测试
3.1用户登录界面测试
3.1.1界面显示是否正常
页面包括用户名输入框和密码输入框,以及登录提交按钮(在输入密码时进行密文展示)
3.1.2登录功能是否正常
正确输入的情况:
错误输入的情况:
此时会出现输入错误提示框,点击确定后立即返回登陆界面
3.2博客首页测试
3.2.1界面显示是否正常
在登录界面输入正确的账号和密码后进入博客首页界面,并正确展示出用户名称,头像,以及文章分类和博客列表
3.2.2我的博客系统菜单栏是否正常
点击写博客会跳转到博客编辑页面,在此页面时再点击主页则退回到博客首页面,此时标题栏旁边的选项为发布文章
3.3博客详情页测试
3.3.1界面显示是否正常
页面存在用户名,文章分类,以及编辑,删除等元素,详情页中展示的内容正常没有出现乱码或空白的情况则正常
对博客的修改也是成功的
3.3.3删除博客功能是否正常
点击删除选项后会弹出确认提示框,再点击确认后博客就会被正常删除,点击取消则不变
3.4博客编辑页测试
3.4.1界面显示是否正常
3.4.2编辑发布博客功能是否正常
4.基于python以及Selenium实现的自动化测试
基于 Python 和 Selenium 的自动化测试通过模拟真实用户操作实现对 Web 应用程序的自动化验证,其核心原理依赖于 Selenium WebDriver 与浏览器内核的深度交互。测试脚本通过 Python 调用 Selenium 提供的 API 接口,将用户行为(如点击、输入、页面跳转)转换为浏览器可执行的指令。
基本步骤为:下载驱动->创建驱动->调用Selenium提供的接口来对页面进行我们的自动化操作
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
#下载驱动
ChromeIns=ChromeDriverManager().install()
#创建谷歌浏览器的驱动
driver=webdriver.Chrome(service=Service(ChromeIns))
#输入百度网址
driver.get("https://www.baidu.com")
time.sleep(2)
#输入关键词
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("牢大")
time.sleep(2)
#点击百度一下按钮
driver.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(2)
#关闭浏览器
driver.quit()
Until文件
由此可知我们在每一次进行测试之前都要进行下载驱动和创建驱动,浏览器对象是每个页面都会调用的(多次创建消耗性能),所以把创建浏览器对象单独拿出来放到一个文件中,这里使用Until.py 文件。
#Util
#创建一个浏览器对象
import datetime
import os.path
import sys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
class Driver:
driver = ""
def __init__(self):
options = webdriver.ChromeOptions()
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)
#隐式等待
#在页面内容较为丰富时,通常代码执⾏的速度⽐⻚⾯渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可
# 以使⽤selenium中提供的三种等待⽅法:强制,显示,隐式
self.driver.implicitly_wait(2)
#截图进阶
def getScreeShot(self):
#创建屏幕截图
#图片文件名称:./2024-05-08-173456.png
dirname = datetime.datetime.now().strftime("%Y-%m-%d")
#判断dirname文件夹是否已经存在,若不存在则创建文件夹
# ../images/2024-05-08
if not os.path.exists("../images/"+dirname):
os.mkdir("../images/"+dirname)
#2024-05-08-173456.png
#图片路径:../images/调用方法-2024-05-08/2024-05-08-173456.png
#图片路径:../images/LoginSucTest-2024-05-08/2024-05-08-173456.png
#图片路径:../images/LoginFailTest-2024-05-08/2024-05-08-173456.png
filename = sys._getframe().f_back.f_code.co_name+"-"+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
self.driver.save_screenshot("../images/"+dirname+"/"+filename)
BlogDriver = Driver()
RunTest文件
设置一个主函数(if __name__ == "__main__":),来测试个个页面是否能正常运行
from common.Utils import BlogDriver
from tests import BlogLogin
from tests import BlogList
from tests import BlogDetail
from tests import BlogEdit
from common.Utils import BlogDriver
if __name__ == "__main__":
#BlogLogin.BlogLogin().LoginFailTest()
BlogLogin.BlogLogin().LoginSucTest()
#登陆成功之后就可以调用博客首页测试首页的用例(登陆状态)
BlogList.BlogList().ListTestByLogin()
#测试登录状态下的博客详情页
BlogDetail.BlogDeail().DetailTestByLogin()
#博客编辑页面
BlogEdit.BlogEdit().EditSucTestByLogin()
#指定浏览器的退出
BlogDriver.driver.quit()
Blogtest文件
a.BlogLogin
通过driver进入登录界面,输入正确或不正确的账号密码
import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#测试博客登录页面
class BlogLogin:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.137.19.140:9090/blog_login.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
# 成功登录
def LoginSucTest(self):
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(2)
#self.driver.quit()
#失败登录
def LoginFailTest(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
# 能找到博客中登录失败的提醒
actual=self.driver.find_element(By.CSS_SELECTOR, "").text()
login = BlogLogin()
#login.LoginSucTest()
#login.LoginFailTest()
正确情况下进入博客列表页:
错误情况下出现密码错误提示框:
b.BlogList
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#博客首页测试用例
class BlogList:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.137.19.140:9090/blog_list.html"
self.driver = BlogDriver.driver
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")
#添加屏幕截图
BlogDriver.getScreeShot()
#测试首页(未登录情况下)
#未登录情况下会自动跳转到博客登录界面
测试成功,所有查找的元素都存在则无报错
c.BlogDetail
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#测试博客详情页
class BlogDeail:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=19181"
self.driver = BlogDriver.driver
self.driver.get(self.url)
#登陆状态下博客详情页的测试
def DetailTestByLogin(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,"#h2-u5728u8FD9u91CCu5199u4E0Bu4E00u7BC7u535Au5BA2")
#屏幕截图
BlogDriver.getScreeShot()
d.BlogEdit
import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#测试博客编辑页面
class BlogEdit:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.137.19.140:9090/blog_edit.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
#正确发布博客(登陆状态下)
def EditSucTestByLogin(self):
self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("自动化测试创建")
#找到编辑区域,输入关键词(编辑区域不可操作)
#菜单栏无法元素无法定位
#博客系统编辑区域默认情况下就不为空,可以暂不处理
#直接点击发布按钮来发布博客
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
#点击完成之后出现页面的跳转,页面跳转需要加载时间,可能会出现代码执行的速度比页面渲染的速度要快,导致元素查找不到,因此可以添加等待
#添加隐式等待和显示等待都可以,任选择一个
#隐式等待:创建浏览器对象之后就可以加上,因为隐式等待的作用域在driver整个生命周期
#显示等待:可以作用在当前代码中
#actual=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(10) > div.title").text
#assert actual == "自动化测试创建"
#屏幕截图
BlogDriver.getScreeShot()
总结:
通过本次学习,掌握了 Python 自动化测试的核心技术栈,能够独立完成 Web自动化测试脚本开发,并设计可维护的测试框架。未来需进一步结合工程化思维,提升测试覆盖率与执行效率,向测试开发全链路能力进阶。
5.软件测试-性能测试
基于jmeter实现的性能测试
1.在jmeter中实现一个简单的http请求
先创建一个线程组,可以包含多个http请求,但我们现在只创建一个
配置http请求相关内容
这些配置来源于login的Curl(bash)
创建一个查看结果树,来查看请求运行的结果
2.使用jmeter来模仿多个用户的访问
3.添加其他页面的http请求
可以看到这里添加博客列表页后出现了一个401的异常
我们先看一看出现错误的原因,原因是缺少了目标资源的有效认证凭证,说人话就是缺少了用户的登陆凭证,在访问列表页面时无法确认登录状态
我们先在postman上面实验一下,看看加上用户凭证能不能成功
结果成功了,我们在jmeter来实现一下
在jmeter中添加请求头的方法
在信息头管理器里面用户登录凭证用JSON表达式来表示(${token})
3.添加一个博客
这里发现失败了
使用网页和postman再发送,对比一下请求头和请求体
发现请求头中的 content-type 不一致
再次编辑博客页设置请求头参数
将content- type 设置为application/json
运行后,响应成功了
4.同步定时器
JMeter同步定时器的作⽤主要在于模拟多⽤⼾并发访问的场景,确保多个线程能够同时执⾏某个操
作,以达到真正的并发效果。
当多个线程同时启动时,它们可能会在不同的时间间隔内执⾏,这样就⽆法达到真正的并发效果。同
步定时器的作⽤就是将这些线程的执⾏时间同步,使它们在同⼀时间点执⾏。它可以在多个线程之间
制造⼀定的延迟,直到同时到达指定时间点,再同时执⾏后续的操作。
此外,同步定时器可以理解为集合点,当线程数量达到指定值后,再⼀起释放,可以瞬间产⽣很⼤的
压⼒。这样,可以更好地模拟真实的⽤⼾并发访问场景,提⾼测试的准确性和可靠性。
在性能测试过程中,为了真实模拟多个⽤⼾同时进⾏操作以度量服务器的处理能⼒,可以使⽤同步定
时器来设置集合点。不过,虽然通过加⼊集合点可以约束请求同时发送,但不能确保请求同时到达服
务器,所以只能说是较真实模拟并发。
5.事务控制器
JMeter事务控制器的作⽤主要⽤于测试执⾏嵌套测试元素所花费的总时间。这相当于模拟⽤⼾进⾏⼀
系列操作的测试。
在进⾏⻚⾯性能测试或API性能测试时,事务控制器是⼀个⾮常重要的⼯具。它可以帮助测试⼈员更准
确地评估系统性能,尤其是在涉及多个接⼝或操作的复杂场景中。例如,在订单提交的过程中,可能
需要调⽤多个接⼝,并且某些接⼝可能依赖于前⼀个接⼝的结果。在这种情况下,使⽤事务控制器可
以将这些接⼝统⼀视为⼀个事务进⾏性能测试,从⽽得到更接近真实场景的性能测试结果。
6.梯度压测线程组
看到这里有很多的选项具体的含义如下