当前位置: 首页 > news >正文

个人博客系统自动化测试报告

目录

  • 一.项目背景
  • 二.项目简介
  • 三.功能测试
  • 四.测试用例
  • 五.自动化测试脚本(使用Selenium进行Web自动化测试(Python))
    • 1.创建驱动对象
    • 2.登录界面
    • 3.博客列表界面
    • 4.博客详情页
    • 5.博客发布界面
    • 6.注销测试
  • 六.环境准备
  • 七.测试总结

一.项目背景

在当今数字化时代,互联网的迅猛发展已深刻改变了人们的生活与交流方式。信息传播的速度与广度达到了前所未有的程度,人们渴望在这个信息洪流中找到一个能够自由表达自我、分享见解与经验的平台。博客作为一种个人或团体发布内容的网络日志形式,应运而生并迅速风靡全球。

二.项目简介

本项目基于SSM框架实现,包含4个界面:登录界面、博客发表界面、博客列表界面以及博客详情界面。
登录后即可查看自己已发布的博客,也可以发布博客,通过使用Selenium定位web元素、对获取到的元素进行操作等,对个人博客系统进行测试,测试的核心内容包括用户登录、博客列表、用户信息、查看全文、详情页内容、发布博客、退出账号等。该博客系统可以实现发布个人博客,记录博客发布日期、时间、标题、博客发布者等信息。

三.功能测试

1. 登录界面
用户名与密码已存储在数据库中,登录成功即可跳转到列表页

在这里插入图片描述

在该项目中暂时只存贮了2个用户名和对应的密码:
用户名:zhangsan 密码:123456
用户名:lisi 密码:123456
在这里插入图片描述

如果用户名错误
在这里插入图片描述
如果密码错误
在这里插入图片描述

如果用户名或密码为空
在这里插入图片描述

2.博客列表界面
用用户名:zhangsan 密码:123456登录成功后,来到博客列表界面
在这里插入图片描述

3.博客详情界面
在博客列表界面中,选择任意一个博客对应的按钮:查看全文,就能进入博客详情界面
在这里插入图片描述

4.博客发布界面
在上面3个界面的任意一个界面里点击右上角的按钮“写博客”,就能进入博客发布界面
在这里插入图片描述


四.测试用例

在这里插入图片描述

五.自动化测试脚本(使用Selenium进行Web自动化测试(Python))

1.创建驱动对象

不管我们要对哪个界面进行自动化测试,第一步就是要打开浏览器,因此我们将打开浏览器这一步放在一个单独的文件(Utils.py)中(这里我们创建的是edge浏览器驱动的对象)。有时我们想知道自动化测试的结果是什么。就可以截图显示

步骤:

  1. 首先定义一个类Driver
  2. 定义一个类成员和构造函数以及有关截图的函数
import datetime
import os.path
import sys
import time
from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium.webdriver.edge.service import Service as EdgeService

class Driver:
    driver=""
    def __init__(self):
        self.driver=webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))
        # 隐式等待
        self.driver.implicitly_wait(3)
    
    # 截图
    def getScreenShot(self):
        dirname=datetime.datetime.now().strftime("%Y-%m-%d")
        # 如果不存在../images/dirname,就创建该目录
        if not os.path.exists("../images/"+dirname):
            os.mkdir("../images/"+dirname)
        filename=datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")
        # 能知道调用本接口的接口名
        funcname=sys._getframe().f_back.f_code.co_name+"-"
        # 目标:../images/2025-3-14/接口名-2025-3-14-202101.png
        self.driver.save_screenshot("../images/"+dirname+"/"+funcname+filename+".png")

# 创建Driver对象
BolgDriver=Driver()

创建1个运行文件RunTest(即程序的主入口),运行各个测试类中的函数

if __name__=="__main__":

2.登录界面

  1. 创建博客登录的测试文件BlogLogin.py
  2. 引入Utils文件(需要浏览器驱动)和其它依赖
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

from common.Utils import BolgDriver

class BlogLogin:
    url=""
    driver=""
    def __init__(self):
        self.url="http://8.137.19.140:9090/blog_login.html"
        self.driver=BolgDriver.driver
        self.driver.get(self.url)
    #正常登录
    def LoginSucTest(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()
        #查找头像,用户名和github地址
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > img")
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > a")
        #截图
        BolgDriver.getScreenShot()
        #回到登录界面
        self.driver.back()

    #异常登录
    def LoginFailTest(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("zhang")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        #出现警告弹窗:用户不存在
        WebDriverWait(self.driver,3).until(expected_conditions.alert_is_present())
        alert=self.driver.switch_to.alert
        assert alert.text=="用户不存在"
        alert.accept()
        #截图
        BolgDriver.getScreenShot()

        # 输入正确的账号和错误的密码
        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()
        # 出现警告弹窗:密码错误
        WebDriverWait(self.driver, 3).until(expected_conditions.alert_is_present())
        alert = self.driver.switch_to.alert
        assert alert.text == "密码错误"
        alert.accept()
        #截图
        BolgDriver.getScreenShot()

        # 输入空的账号
        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, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        # 出现警告弹窗:账号或密码不能为空
        WebDriverWait(self.driver, 3).until(expected_conditions.alert_is_present())
        alert = self.driver.switch_to.alert
        assert alert.text == "账号或密码不能为空"
        alert.accept()
        #截图
        BolgDriver.getScreenShot()

        # 输入空的密码
        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("zhang")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        # 出现警告弹窗:账号或密码不能为空
        WebDriverWait(self.driver, 3).until(expected_conditions.alert_is_present())
        alert = self.driver.switch_to.alert
        assert alert.text == "账号或密码不能为空"
        alert.accept()
        #截图
        BolgDriver.getScreenShot()

RuntTest.py

from tests import BlogLogin

from common.Utils import BolgDriver


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

    BolgDriver.driver.quit()

运行成功
在这里插入图片描述

3.博客列表界面

  1. 创建博客列表的测试文件BlogList.py
  2. 引入Utils文件(需要浏览器驱动)和其它依赖
from selenium.webdriver.common.by import By

from common.Utils import BolgDriver

class BlogList:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://8.137.19.140:9090/blog_list.html"
        self.driver = BolgDriver.driver
        self.driver.get(self.url)
    # 正常登录
    def BlogListByLogin(self):
        # 查找头像,用户名和github地址
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > img")
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3")
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > a")
        # 截图
        BolgDriver.getScreenShot()

    # 异常登录
    def BlogListByNotLogin(self):
        self.driver.back()
        # 截图
        BolgDriver.getScreenShot()
        #如果成功回到登录界面,那么找不到头像
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > img")

RuntTest.py

from common.Utils import BolgDriver
from tests import BlogLogin
from tests import BlogList

if __name__=="__main__":
    BlogLogin.BlogLogin().LoginSucTest()
    BlogList.BlogList().BlogListByLogin()

    BolgDriver.driver.quit()

运行成功
在这里插入图片描述

4.博客详情页

  1. 创建博客列表的测试文件BlogDetail.py
  2. 引入Utils文件(需要浏览器驱动)和其它依赖
from selenium.webdriver.common.by import By

from common.Utils import BolgDriver

class BlogDetail:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=24712"
        self.driver = BolgDriver.driver
        self.driver.get(self.url)
    def BlogDeatilByLogin(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")
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.operating > button:nth-child(1)")
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.operating > button:nth-child(2)")
        # 截图
        BolgDriver.getScreenShot()

RuntTest.py

from common.Utils import BolgDriver
from tests import BlogLogin
from tests import BlogList
from tests import BlogDetail

if __name__=="__main__":
    BlogLogin.BlogLogin().LoginSucTest()
    BlogList.BlogList().BlogListByLogin()
    BlogDetail.BlogDetail().BlogDeatilByLogin()

    BolgDriver.driver.quit()

运行成功
在这里插入图片描述

5.博客发布界面

  1. 创建博客列表的测试文件BlogDetail.py
  2. 引入Utils文件(需要浏览器驱动)和其它依赖
from selenium.webdriver.common.by import By

from common.Utils import BolgDriver

class BlogPublish:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://8.137.19.140:9090/blog_edit.html"
        self.driver = BolgDriver.driver
        self.driver.get(self.url)
    # 正常登录
    def BlogPublishByLogin(self):
        # 填写博客标题,按“发布文章“按钮
        self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("aa")
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
        # 如果博客列表的最下面的博客标题是”aa“,说明发布成功
        text=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(792) > div.title").text
        assert text=="aa"
        # 截图
        BolgDriver.getScreenShot()
	
	# 异常登录
    def BlogPublishByNotLogin(self):
        self.driver.back()
        # 截图
        BolgDriver.getScreenShot()
        # 如果成功回到登录界面,那么找不到头像
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > img")

RuntTest.py:正常登录时

from common.Utils import BolgDriver
from tests import BlogLogin
from tests import BlogList
from tests import BlogDetail
from tests import BlogPublish

if __name__=="__main__":
    BlogLogin.BlogLogin().LoginSucTest()
    BlogList.BlogList().BlogListByLogin()
    BlogDetail.BlogDetail().BlogDeatilByLogin()
    BlogPublish.BlogPublish().BlogPublishByLogin()

    BolgDriver.driver.quit()

运行成功
在这里插入图片描述

RuntTest.py:异常登录时,返回登录界面

from common.Utils import BolgDriver
from tests import BlogLogin
from tests import BlogList
from tests import BlogDetail
from tests import BlogPublish

if __name__=="__main__":
    BlogLogin.BlogLogin().LoginSucTest()
    BlogPublish.BlogPublish().BlogPublishByNotLogin()

    BolgDriver.driver.quit()

运行失败在这里插入图片描述

6.注销测试

from selenium.webdriver.common.by import By

from common.Utils import BolgDriver

class LogOut:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=24713"
        self.driver = BolgDriver.driver
        self.driver.get(self.url)
    def LogOutTest(self):
        # 点击右上角的“注销”按钮
        self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()
        # 如果当前页面的网址是登陆界面的网址,说明注销成功
        curUrl=self.driver.current_url
        assert curUrl=="http://8.137.19.140:9090/blog_login.html"

RuntTest.py

from common.Utils import BolgDriver
from tests import BlogLogin
from tests import BlogList
from tests import BlogDetail
from tests import BlogPublish
from tests import Logout

if __name__=="__main__":
    BlogLogin.BlogLogin().LoginSucTest()
    BlogDetail.BlogDetail().BlogDeatilByLogin()
    Logout.LogOut().LogOutTest()

    BolgDriver.driver.quit()

在这里插入图片描述

六.环境准备

系统:windows11

浏览器:版本 122.0.2365.92 (正式版本) (64 位)

测试工具:
PyCharm Community Edition 2024.3.4、
​​​Selenium4.9.0 、
WebDriver-manager 4.0.2

七.测试总结

Selenium 支持多种主流浏览器,如 Chrome、Firefox、Safari、Edge 等。 这意味着我们可以使用相同的测试脚本在不同的浏览器上执行测试。本次测试对个人的博客系统的登录,查看全文,发布博客、注销登录等核心功能进行测试。并用selenium编写自动化测试脚本,使某些测试任务大幅度缩短测试周期,比手动测试更高效。避免了手动测试中可能出现的人为疏忽和错误。

总而言之,自动化测试是一种有效的测试方法,可以提高测试效率、降低测试成本、提高测试覆盖率。 但是,自动化测试并非万能的,需要根据具体的项目情况选择合适的测试方法,并合理地利用自动化测试工具。

相关文章:

  • logparser日志分析详解
  • not in not exists
  • 设计模式-策略模式、命令模式
  • 使用vite脚手架搭建react项目
  • 内网穿透的应用-全流程解析如何通过VNC实现Windows与MacOS远程桌面的无缝连接
  • vue2升级Vue3--native、对inheritAttrs作用做以解释、声明的prop属性和未声明prop的属性
  • c语言题目 拷贝函数参数
  • c# 利用mv-cs200-10gc工业相机,识别液注的高度
  • 3DS模拟器使用(pc+安卓)+金手指+存档互传
  • Java蓝桥杯
  • 万邦大数据
  • 词向量:优维大模型语义理解的深度引擎
  • 【华为OD机考真题】- 用户调度问题(Java)
  • C++相关基础概念之入门讲解(上)
  • 全面!陕西省10市企业技术中心申报条件奖补和认定补助材料、时间汇集
  • linux ptrace 图文详解(二) PTRACE_TRACEME 跟踪程序
  • # 使用OpenAI Agents实现智能代理的生命周期管理
  • 32、构造函数
  • CentOS 系统安装 docker 以及常用插件
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
  • 焦点访谈丨售假手段又翻新,警惕化肥“忽悠团”的坑农套路
  • 秦洪看盘|热门股或将退潮,短线波动难免
  • 俄罗斯哈巴罗夫斯克市首次举办“俄中论坛”
  • 5月LPR下调:1年期、5年期以上品种均下调10个基点
  • 大巴车高速上撞山致2死2伤,广东肇庆警方通报
  • 花旗回应减员传闻:持续评估人力资源战略,将为受影响的个人提供支持