关于博客系统的测试报告

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.梯度压测线程组

看到这里有很多的选项具体的含义如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值