1.项目背景

 个人博客是人们在网络上展现自己个性的一种方式。自从互联网走进千家万户,大受人们喜爱。大家都喜欢通过网络来获取各种各样的信息。而在网络上,你也可以畅所欲言,而个人博客也是其中一种。在个人博客上,你可以发表自己的心路旅程,发表自己的工作经验,发表技术博客等等。
首先介绍一下什么是博客,它也被称为网络日志。博客其实就是一个网页,它是由各种各样的帖子组成。这些帖子可以是你某一天观看电影的感慨,也可以是阅读到某篇书籍的读后感,更可以是你在自己技术领域的心得。它就是一个网页,但是大家可以在上面用文字或者图片分享自己的心情等,它提供的内容可以用来进行交流。
博客最开始的时候是论坛下的一个子系统。最早参与博客的都是一些信息技术的一些专家和学者,讨论的都是专业技能。直到发现了博客的商业价值,一些开放了自发式的博客,大家也都发现了博客分享和讨论的趣味。越来越多的人参与进来,博客也越来越风靡盛行。基于SSM框架实现的个人博客系统,由四个页面构成:用户登录页、博客编辑发布页、博客列表页以及博客详情页。登录即可查看自己与其他用户已发布的博客,也可以使用自己的账号发布博客,通过使用Selenium定位web元素、对获取到的元素进行操作等,对个人博客系统进行测试,测试的核心内容包括用户登录、博客列表、用户信息、博客数量、查看全文、详情页内容、写博客、删除博客、编辑发布博客、退出账号等。该博客系统可以实现发布个人博客,记录博客发布日期、时间、标题、博客发布者等信息。


1.1测试目标及测试任务概况

 设计测试用例一般需要包含:页面测试,功能测试,性能测试,兼容性测试,安全性测试,易用性测试6大方面。但是本博客系统是一个Web网站,主要针对核心功能来进行测试,此博客系统的测试功能点以脑图的形式展示如下:

2.测试内容

2.1编写测试用例

1.用户登录功能测试
(1)介绍:用户名以及密码已经在后端写入了数据库是已经存在的,登录成功后就会跳转到列表页面;执行用户注销操作后,也会回到登录页面。

(2)测试用例展示

当账号密码输入正确时(以账号:zhangsan;密码:123456为例),可正常跳转博客页面.

当账号密码输入出错误时(以账号:zhangsan;密码:12345为例),博客页面出现报错弹窗.

2.博客首页功能测试

(1)介绍:博客列表页可以查看当前博客发布数量、当前用户的头像、用户名、查看已发布博客的有限博客信息(包括标题、时间、相关内容)等信息。

(2)测试用例展示:

a)列表页展示

  前置条件:用户已登录

  预期结果:列表页显示用户发布的博客简介(标题、发布时间、内容简介),并在左侧正确显示用户发布的博客文章数量以及分类数

  实际结果:

  正常显示用户发布的博客简介

3.博客详情页

(1)介绍:选择任意一篇博客,点击”查看全文“按钮,即可进入博客详情页,此时可以看到该篇博客的所有内容。如果所查看的文章所是当前用户发布的即可进行"编辑"和"删除"操作,如果所查看的文章是其他用户所发布的,则对文章的权限是"只读"。

  (2)测试用例展示:

实际结果:

4.博客编辑功能测试

(1)介绍:在页面右上角点击”写博客“,即可进入博客编辑页面,此时可以进行新博客的写入操作。

(2)测试用例展示:

a)输入正确合法的文章标题以及内容,并且点击发布按钮

  前置条件:用户已登录

  预期结果:发布成功,自动跳转到博客列表,可以在博客列表中查看到新发布的文章

  实际结果:

b)文章标题或者文章内容为空

  前置条件:用户已登录

  预期结果:发布失败,并且有弹窗提示

2.2使用Selenium进行Web自动化测试(Python)

2.2.1  安装WebDriverManager驱动管理程序和selenium 类库

  WebDriverManager是一个用于管理Web驱动程序的工具,主要用于自动化测试领域。在进行 Selenium 测试时,需要一个与浏览器相匹配的 Web 驱动程序,以便控制和操作浏览器。 

  WebDriverManager能够自动下载和管理浏览器驱动程序,会自动检测本地系统中安装的浏览器,并下载对应的浏览器驱动程序(如ChromeDriver、FirefoxDriver等)。这避免了手动下载和配置驱动程序的繁琐过程,提高了自动化测试的效率和稳定性,以便在自动化测试中使用这些浏览器。

2.2.2在项目中安装selenium和webdriver-manager两个包

在python解释器中选择webdriver-manager和selenium(注意版本)下载

2.2.2依照测试用例,编写自动化测试脚本

1.创建浏览器对象
  创建浏览器对象,请求访问URL对应的页面,成功进入对应页面之后才可以进行后续一系列的测试操作。而浏览器对象是多个功能测试用例都会调用到的,频繁的创建调用会消耗性能,所以单独创建一个文件,存放创建浏览器对象和其他频繁调用的功能代码,以及其他必要的配置代码内容。

  此次我创建了一个包common,将文件utils放在其中,utils文件中创建了一个Driver类,定义了一个构造函数(用来初始化浏览器对象,方便后面的复用)与一个创建屏幕截图函数(方便后面自动化测试时截图观察情况)。

2.博客"登录"功能自动化测试
①创建登录自动化测试脚本文件(此项目以"BlogLogin.py"为例)

②导入utils文件以及其他必要的依赖项

③创建登录测试类(此项目以"BlogLogin"为例)

④分别编写构造函数,登录成功(正确账号正确密码),登录失败(账号密码为空)

注意项:在向输入框中输入信息时要先清空输入框内容,否则效果相当于追加写;在登录失败时会跳出弹窗,此时注意要先点击弹窗否则无法继续后续测试操作

import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC





class BlogLogin:
    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.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
        # 添加屏幕截图
        BlogDriver.getScreeShot()
        # 重新加载登录页面
        self.driver.get(self.url)





#异常登录的测试用例
    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()


        WebDriverWait(self.driver, 5).until(EC.alert_is_present())
        alert = self.driver.switch_to.alert
        alert.accept()




login=BlogLogin()
# login.LoginSucTest()
login.LoginFailTest()

3."博客首页"功能自动化测试
①创建博客列表自动化脚本文件(此项目以"BlogList.py"为例)

②导入utils文件以及其他必要的依赖项

③创建博客列表测试类(此项目以"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 LiseTestByLogin(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()

4."博客详情页"功能自动化测试

①创建博客详情页自动化脚本文件(此项目以"BlogDetail.py"为例)

②导入utils文件以及其他必要的依赖项

③创建博客详情页测试类(此项目以"BlogDetail"为例)

④编写构造函数,博客详情页函数(点击本用户发布的博客),博客详情页函数(其他用户发布的博客)

⑤本用户发布的博客详情页需要有博客标题,发布时间,发布内容,编辑按钮,删除按钮

⑥其他用户发布的博客详情页只有博客标题,发布时间与发布内容

前置条件:博客列表页需要有本用户发布的博客文章,与其他用户发布的博客文章

from selenium.webdriver.common.by import By

from common.Utils import BlogDriver

#测试博客详情页
class BlogDetail:
    url = ""
    driver = ""
    def __init__(self):
        self.url="http://8.137.19.140:9090/blog_detail.html?blogId=44697"
        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,"#detail > p")
        #屏幕截图
        BlogDriver.getScreeShot()

5."博客编辑与发布"功能自动化测试
①创建博客编辑于发布自动化脚本(此项目以"BlogEdit.py"为例)

②导入utils文件以及其他必要的依赖项

③创建博客编辑与发布测试类(此项目以"BlogEdit"为例)

④编写构造函数,登录状态下编辑发布博客函数,未登录状态下编辑发布博客函数

⑤未登录状态下发布博客应自动跳转回博客登录首页

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()
        actual=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(43) > div.title").text
        assert actual == "自动化测试创建"



6.最后在RunTest.py文件中整体测试一遍,确定自动化脚本无误

from  tests import BlogLogin
from  tests import BlogList
from  common.Utils import BlogDriver
from  tests import BlogDetail
from tests import BlogEdit

if __name__ == "__main__":
    BlogLogin.BlogLogin().LoginFailTest()
    BlogLogin.BlogLogin().LoginSucTest()

    #登录成功后就可以调用博客首页测试用例
    BlogList.BlogList().LiseTestByLogin()

    BlogDetail.BlogDetail().DetailTestByLogin()

    BlogEdit.BlogEdit().EditSucTestByLogin()

    #指定浏览器退出
    BlogDriver.driver.quit()

2.2.3自动化测试的亮点与特点

特点:

  在此框架下,自动化测试的设计紧密围绕个人项目的特定需求展开,测试用例经过精心策划,随后利用Selenium这一强大的自动化测试工具,将功能点与测试步骤清晰地转化为自动化脚本。相较于手动测试,自动化测试能够执行更多轮次、更密集的检测,显著提升测试效率。

  自动化测试的引入,将繁琐的重复性测试工作交由机器处理,解放了测试人员的时间和精力,使他们能够专注于构思更多、更优质的测试用例,进而提升测试的精确度和测试团队的整体积极性。此外,自动化测试以其固有的一致性和可重复性,确保了测试结果的客观性和公正性,极大地增强了软件产品的可信度。

亮点:

驱动复用,性能优化:
自动化测试框架仅需一次性创建测试驱动,避免了在每个测试用例中重复创建驱动所带来的性能损耗,从而提升了测试执行的整体效率。

函数化测试用例,提升可读性:
每个测试用例都被封装为一个独立的函数,测试功能点一目了然,代码结构清晰,显著增强了代码的可读性和可维护性。

隐式等待,应对页面渲染延迟:
针对页面渲染速度滞后于程序执行速度的问题,自动化测试框架内置了隐式等待机制,有效避免了因页面元素尚未加载完成而导致的测试失败,进一步提升了自动化测试的效率和稳定性。

通过整合这些特点与亮点,自动化测试不仅优化了测试流程,还显著提升了软件产品的质量和用户的信任度。

3.web自动化总结与反思

3.1常见bug及解决方法

1. 元素定位失败

原因:
元素未加载完成(页面未完全加载或异步内容未渲染)。

元素被隐藏或位于<iframe>中。

定位方式错误(如动态ID、XPath/CSS选择器错误)。

解决方法显式等待:使用WebDriverWait等待元素出现

2. 浏览器驱动问题

原因:
未下载浏览器驱动(如ChromeDriver)。驱动版本与浏览器版本不匹配。驱动路径未正确配置。

解决方法:
使用webdriver-manager自动管理驱动

3. 超时错误

原因:
页面加载时间过长或网络延迟,异步请求未完成。

解决方法
调整隐式/显式等待时间:

4.性能测试

一、用 Apifox怎么测
1. 建一个测试集合
新建一个项目文件夹,专门放这次性能测试的请求。

2. 给每个页面配一个请求
需要测试的页面有:登录页、首页、列表页、编辑页。每个页面单独设置一个请求。

3. 设置公共环境参数
把网站的根地址(比如 http://localhost:8080)和登录用的用户名、密码设成全局变量,方便调用。

统一设置请求头,比如告诉服务器返回 JSON 格式,以及模拟某个浏览器访问。

二、用 JMeter 怎么测
1. 搭测试框架
新建一个“测试计划”,相当于一个总容器。

添加“线程组”,用来模拟多个用户同时访问,比如 100 个人一起点。

2. 配置页面的请求
为每个需要测的页面(登录、首页、列表、编辑)分别创建一个 HTTP 请求采样器,就是告诉 JMeter 去访问哪个网址、用什么方式。

3. 看测试结果
添加两个看结果的窗口:

查看结果树:能看到每个请求发出去和返回的详细内容,方便排查问题。

汇总报告:把平均响应时间、错误率、吞吐量等关键数据统计成表格。

最后把收集到的结果整理分析一下。

4.1不同接口的性能测试

4.1.1登录接口

4.1.2用户信息接口

4.1.3博客列表页接口

4.1.4博客详情页接口

4.1.5添加博客接口

4.2聚合报告

4.3Transactions per Second(吞吐量)

吞吐量(Throughput)是性能测试中一个非常关键的指标,通俗来说就是:系统在单位时间内能处理多少请求或事务。你可以把它想象成“收费站一小时能通过多少辆车”:如果收费站一小时能过 1000 辆车,那吞吐量就是 1000 辆/小时。对应到网站或接口,就是一秒能处理多少个请求(常用单位:TPS,即每秒事务数;或者 QPS,每秒查询数)。

4.4Response Times Over Time(响应时间)

响应时间(Response Time)通俗来说就是:从你发出请求,到系统返回结果,总共花了多长时间。你可以把它想象成“你去食堂点菜,从跟阿姨说‘来份红烧肉’,到阿姨把菜递给你,中间等了多久”:如果阿姨手很快,3 秒就把菜给你,那响应时间就是 3 秒。对应到网站或接口,就是你点击按钮(比如登录),到页面上给出结果(比如“登录成功”或跳转)所经过的总时间。

4.5Active Threads Over Time(活跃线程状态)

4.6生成性能测试报告

在接口文件目录下输入cmd打开命令提示符,输入下面的指令

jmeter -n -t 登录接口-000046.jmx -l first.jtl -e -o ./first/.

回车键运行后文件夹中会显示HTML文件,此时点击HTML文件进入浏览器中

4.7查看性能报告

5.完整项目链接

https://gitee.com/tang-hanjiang/class104

Jmeter性能测试报告:class104: C语言代码 - Gitee.comhttps://gitee.com/tang-hanjiang/class104/tree/master/backups

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐