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

个人博客系统测试报告

1.项目背景

本项目是基于 SSM 框架(Spring、Spring MVC、MyBatis)开发的 个人博客系统,包括用户登录、博客发布、编辑、删除、查看等功能,提供博客列表页和详情页展示博客内容。用户登录后可以查看自己和其他用户的博客,并通过系统记录博客的发布时间、标题和发布者信息。项目采用 Selenium 自动化测试 进行功能验证,测试内容涵盖用户登录、博客列表展示、用户信息校验、博客数量统计、查看详情、博客发布与编辑、删除博客等,确保系统的稳定性和功能完整性。

2.测试内容

2.1.功能测试

2.2.1.编写测试用例

1. 登录测试

(1)介绍

系统已在数据库中存储了用户名和密码,用户成功登录后会跳转至博客列表页面;执行注销操作后,将返回登录页面。

(2)测试用例

  • (a)界面展示

  • (b)输入正确的账号和密码(如:账号 lisi,密码 123456

    • 预期结果:成功登录,并跳转至博客列表页面。
    • 实际结果
  • (c)输入错误的账号或密码(如:账号 lisi,密码 123

    • 预期结果:提示“账号或密码错误”。
    • 实际结果

2. 博客列表页及博客数量测试

(1)简介

登录成功后,系统将跳转至博客列表页面,该页面显示博客的总数量、当前用户的头像和用户名,并提供博客的基本信息(如标题、发布时间及部分内容)。

(2)测试用例

  • (a)列表页展示(博客数量大于 0)

3. 博客详情页(点击“查看全文”)

(1)简介

用户点击任意一篇博客的“查看全文”按钮,即可进入博客详情页面,查看完整内容。

  • 若文章属于当前用户,则页面提供“编辑”和“删除”选项。
  • 若文章属于其他用户,则仅支持阅读,不提供编辑和删除权限。

(2)测试用例

  • (a)详情页界面
    • ① 其他用户的博客详情页
      • 预期结果:页面显示博客标题和内容,不包含“编辑”和“删除”按钮。
      • 实际结果
    • ② 当前用户的博客详情页
      • 预期结果:页面显示博客标题和内容,并提供“编辑”和“删除”按钮。
      • 实际结果

4. 博客编辑与发布

(1)简介

用户可通过博客列表页右上角的“写博客”按钮进入博客编辑页面,并进行新博客的撰写和发布。

(2)测试用例

  • (a)登录后跳转至博客列表页
  • (b)点击“写博客”按钮,跳转至博客编辑页面
  • (c)输入标题和内容
    • 预期结果:标题和内容不能为空,且输入的内容符合规范。
    • 实际结果
  • (d)点击“发布文章”按钮
    • 预期结果:博客成功发布,并跳转回博客列表页;新发布的文章位于列表顶部,并显示文章标题、发布时间及部分内容(若博客内容较长)。
    • 实际结果

5. 删除博客

(1)简介

在博客列表页面,点击当前用户发布的博客的“查看全文”按钮,进入详情页面后点击“删除”按钮,即可删除该博客,并返回博客列表页。删除后,该博客将不再显示。

(2)测试用例

  • (a)博客列表页展示
  • (b)点击“查看全文”按钮,进入博客详情页
  • (c)点击“删除”按钮
    • 预期结果:弹窗提醒,确定后博客成功删除,返回博客列表页,且该文章不再显示,文章数量减少1。
    • 实际结果

6. 退出当前账号

(1)简介

用户在博客列表页面点击“注销”按钮后,将返回登录页面,并清空账号和密码输入框内容。

(2)测试用例

  • (a)博客列表页展示
  • (b)点击右上角“注销”按钮
    • 预期结果:成功退出,跳转至登录页面,且账号和密码输入框为空。
    • 实际结果

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

2.2.1 安装 WebDriverManager 和 Selenium

WebDriverManager 是用于管理 Web 驱动程序的工具,在进行 Selenium 测试时,浏览器需要对应的 WebDriver 进行控制和操作。WebDriverManager 能够自动检测本地浏览器版本并下载匹配的驱动程序(如 ChromeDriver、FirefoxDriver 等),避免手动下载和配置的繁琐过程,提高测试效率和稳定性。


2.2.2 创建测试项目

  1. 在项目中打开 File → Settings,进入设置界面。

  2. 在“Project: 当前项目名”下,检查是否已安装 seleniumwebdriver-manager 依赖。

  3. 若未安装,可使用以下命令进行安装:

pip install selenium webdriver-manager

2.2.3 编写自动化测试脚本

1.公共工具(Utils.py)

测试目标

  • 提供 WebDriver 实例,供各测试脚本调用。

  • 统一管理浏览器驱动,支持截图功能。

测试步骤

  1. Utils.py 中定义 BlogDriver 类,初始化 Edge 浏览器驱动。

  2. 提供 get_driver() 方法,返回 WebDriver 实例。

  3. 提供 screenshot() 方法,支持测试过程中截图。

import datetime
import os
import sys
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium import webdriver
from selenium.webdriver.edge.service import Service


class Driver:
    driver = None

    def __init__(self):
        """初始化WebDriver并启动浏览器"""
        options = webdriver.EdgeOptions()
        options.page_load_strategy = 'eager'
        # options.add_argument('-headless')  # 启动无界面模式
        edge_driver_path = EdgeChromiumDriverManager().install()
        self.driver = webdriver.Edge(service=Service(edge_driver_path), options=options)

    def getScreenShot(self):
        """保存当前页面的截图到指定目录"""
        dirname = datetime.datetime.now().strftime('%Y-%m-%d')
        screenshot_dir = os.path.join(os.path.dirname(os.getcwd()), 'images', dirname)

        # 如果截图目录不存在,则创建
        if not os.path.exists(screenshot_dir):
            os.makedirs(screenshot_dir)

        # 根据方法名和时间戳生成唯一的文件名
        filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime(
            '%Y-%m-%d-%H%M%S') + ".png"

        # 保存截图
        screenshot_path = os.path.join(screenshot_dir, filename)
        self.driver.save_screenshot(screenshot_path)


# 创建BlogDriver实例
BlogDriver = Driver()

2.登录功能自动化测试(BlogLogin.py)

测试目标

  • 验证博客系统的登录功能是否正常,包括各种异常情况的处理。

测试步骤

  1. 创建 BlogLogin.py,引入 Utils.py 及相关依赖。

  2. 定义 BlogLogin 类,管理登录测试用例。

  3. 实现以下测试方法:

    • 正常登录:输入正确的用户名和密码,验证是否成功跳转到主页。

    • 错误登录:测试以下情况:

      • 空用户名

      • 空密码

      • 无效用户名

      • 无效密码

    • 个人资料页面注销

      1. 进入个人资料页面。

      2. 点击注销按钮。

      3. 验证是否跳转到登录页面。

  4. RunTest.py 中调用 BlogLogin 进行测试。

import time
from common.Utils import BlogDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.alert import Alert

class BlogLogin:
    url = ''
    driver = ''
    def __init__(self):
        """初始化登录页面并打开指定URL"""
        self.url = "http://8.137.19.140:9090/blog_login.html"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    def loginSucTest1(self):
        """测试用户 'zhangsan' 的登录成功"""
        self._login('zhangsan', '123456')
        self._verify_login_success()
        self.driver.back()

    def loginSucTest2(self):
        """测试用户 'lisi' 的登录成功"""
        self._login('lisi', '123456')
        self._verify_login_success()
        self.driver.back()

    def _login(self, username, password):
        """封装的登录方法,接收用户名和密码"""
        WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#username')))
        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(username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(password)
        self.driver.find_element(By.CSS_SELECTOR, '#submit').click()

    def _verify_login_success(self):
        """验证用户是否成功登录"""
        BlogDriver.getScreenShot()
        try:
            WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'body > div.container > div.left > div > h3')))
        except:
            pass
        assert self.driver.find_element(By.CSS_SELECTOR, 'body > div.container > div.left > div > h3') is not None

    def test_login_empty_username_empty_password(self):
        """测试用户名和密码为空时的登录行为"""
        self._login('', '')
        self._verify_alert('账号或密码不能为空')
        self.driver.back()

    def test_login_empty_username_valid_password(self):
        """测试用户名为空,密码有效时的登录行为"""
        self._login('', '123456')
        self._verify_alert('账号或密码不能为空')
        self.driver.back()

    def test_login_empty_username_invalid_password(self):
        """测试用户名为空,密码无效时的登录行为"""
        self._login('', '123')
        self._verify_alert('账号或密码不能为空')
        self.driver.back()

    def test_login_invalid_username_empty_password(self):
        """测试用户名无效,密码为空时的登录行为"""
        self._login('123', '')
        self._verify_alert('账号或密码不能为空')
        self.driver.back()

    def test_login_valid_username_empty_password(self):
        """测试用户名有效,密码为空时的登录行为"""
        self._login('123', '')
        self._verify_alert('账号或密码不能为空')
        self.driver.back()

    def test_login_valid_username_invalid_password(self):
        """测试用户名有效,密码无效时的登录行为"""
        self._login('lisi', '123')
        self._verify_alert('密码错误')
        self.driver.back()

    def test_login_invalid_username_valid_password(self):
        """测试用户名无效,密码有效时的登录行为"""
        self._login('123', '123456')
        self._verify_alert('用户不存在')
        self.driver.back()

    def test_login_invalid_username_invalid_password(self):
        """测试用户名无效,密码无效时的登录行为"""
        self._login('123', '123')
        self._verify_alert('用户不存在')
        self.driver.back()

    def _verify_alert(self, expected_alert_text):
        """验证弹出警告框的文本内容"""
        BlogDriver.getScreenShot()
        alert = WebDriverWait(self.driver,5).until(EC.alert_is_present())
        assert alert.text == expected_alert_text
        alert.accept()

    def test_logout_via_profile(self):
        """测试通过个人资料页面登出"""
        self._login('zhangsan', '123456')
        self.driver.find_element(By.CSS_SELECTOR, '#submit').click()
        self.driver.get('http://8.137.19.140:9090/blog_list.html')
        WebDriverWait(self.driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'body > div.nav > a:nth-child(6)')))
        self.driver.find_element(By.CSS_SELECTOR,'body > div.nav > a:nth-child(6)').click()
        BlogDriver.getScreenShot()
        WebDriverWait(self.driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'body > div.container-login > div > h3')))
        self.driver.back()

结果演示:


3.用户注销自动化测试(BlogCancellation.py)

测试目标

  • 确保用户注销功能正确,注销后无法访问受保护页面。

测试步骤

  1. 创建 BlogCancellation.py,引入 Utils.py 及相关依赖。

  2. 定义 BlogCancellation 类,管理注销测试用例。

  3. 实现以下测试方法:

    • 注销功能测试

      1. 登录后,点击注销按钮。

      2. 验证是否跳转到登录页面。

      3. 确保用户名和密码输入框为空。

    • 未登录访问受保护页面

      1. 访问博客管理页面。

      2. 确保系统跳转到登录页面。

  4. RunTest.py 中调用 BlogCancellation 进行测试。

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from common.Utils import BlogDriver


class BlogCancellation:
    url = ''
    driver = ''
    def __init__(self):
        """初始化 WebDriver 并打开博客列表页"""
        self.url = 'http://8.137.19.140:9090/blog_list.html'
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    def test_logout_success(self):
        """测试用户注销后是否正确跳转回登录页,并限制访问受保护页面"""
        # 点击注销按钮
        self.driver.find_element(By.CSS_SELECTOR, 'body > div.nav > a:nth-child(6)').click()
        BlogDriver.getScreenShot()
        # 等待页面跳转到登录页(10秒内出现登录标题)
        WebDriverWait(self.driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'body > div.container-login > div > h3')))
        # 确保用户名和密码框为空
        assert self.driver.find_element(By.CSS_SELECTOR,'#username').get_attribute('value') == ''
        assert self.driver.find_element(By.CSS_SELECTOR,'#password').get_attribute('value') == ''
        # 测试访问受保护的页面,确保被重定向到登录页
        protected_pages = [
            "http://8.137.19.140:9090/blog_list.html",
            "http://8.137.19.140:9090/blog_detail.html?blogId=24428",
        ]
        for page in protected_pages:
            self.driver.get(page)
            WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, 'body > div.container-login > div > h3'))
            )
        # 额外检查:尝试编辑博客,确保未登录状态下不能提交
        self.driver.get("http://8.137.19.140:9090/blog_edit.html")
        try:
            self.driver.find_element(By.CSS_SELECTOR, '#title').send_keys('1')
            self.driver.find_element(By.CSS_SELECTOR, '#submit').click()
            WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'body > div.container-login > div > h3')))
        except:
            print("未登录用户无法提交博客,测试通过")

结果演示: 


4. 博客列表页及博客数量自动化测试(BlogList.py)

测试目标

  • 验证博客列表页是否正确加载博客内容,并确保未登录状态下无法访问博客列表。

测试步骤

  1. 创建 BlogList.py,引入 Utils.py 及相关依赖。

  2. 定义 BlogList 类,管理博客列表测试用例。

  3. 实现以下测试方法:

    • 已登录状态

      1. 登录后访问博客列表页面。

      2. 检查博客标题、内容、按钮等元素是否存在。

      3. 验证博客数量是否大于 0。

    • 未登录状态

      1. 直接访问博客列表页面。

      2. 系统应拒绝访问并返回错误提示。

  4. RunTest.py 中调用 BlogList 进行测试。

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver

class BlogList:
    """博客列表页测试类"""
    url = ''
    driver = ''
    def __init__(self):
        """初始化 WebDriver 并打开博客列表页"""
        self.url = 'http://8.137.19.140:9090/blog_list.html'  # 博客列表页 URL
        self.driver = BlogDriver.driver  # 获取 WebDriver 实例
        self.driver.get(self.url)  # 打开博客列表页

    def test_account_name_display(self):
        """测试用户名称是否正确显示"""
        BlogDriver.getScreenShot()  # 截图用于调试
        user_name = self.driver.find_element(By.CSS_SELECTOR, 'body > div.container > div.left > div > h3').text
        assert user_name in ['zhangsan', 'lisi'], f"用户名不匹配,当前显示:{user_name}"

    def test_article_count_display(self):
        """测试文章统计信息是否正确显示"""
        BlogDriver.getScreenShot()
        article_text = self.driver.find_element(By.CSS_SELECTOR, 'body > div.container > div.left > div > div:nth-child(4) > span:nth-child(1)').text
        assert article_text == '文章', f"页面上未找到'文章'文本,当前文本:{article_text}"

    def test_category_display(self):
        """测试分类信息是否正确显示"""
        BlogDriver.getScreenShot()
        category_text = self.driver.find_element(By.CSS_SELECTOR, 'body > div.container > div.left > div > div:nth-child(4) > span:nth-child(2)').text
        assert category_text == '分类', f"页面上未找到'分类'文本,当前文本:{category_text}"

    def test_blog_title_exists(self):
        """测试博客标题是否存在"""
        BlogDriver.getScreenShot()
        assert self.is_element_present(By.CSS_SELECTOR, 'body > div.container > div.right > div:nth-child(1) > div.title'), "博客标题未找到"

    def test_blog_date_exists(self):
        """测试博客发布日期是否存在"""
        BlogDriver.getScreenShot()
        assert self.is_element_present(By.CSS_SELECTOR, 'body > div.container > div.right > div:nth-child(1) > div.date'), "博客发布日期未找到"

    def test_blog_content_exists(self):
        """测试博客内容简介是否存在"""
        BlogDriver.getScreenShot()
        assert self.is_element_present(By.CSS_SELECTOR, 'body > div.container > div.right > div:nth-child(1) > div.desc'), "博客内容简介未找到"

    def test_blog_button_exists(self):
        """测试博客详情按钮是否存在"""
        BlogDriver.getScreenShot()
        assert self.is_element_present(By.CSS_SELECTOR, 'body > div.container > div.right > div:nth-child(1) > a'), "博客详情按钮未找到"

    def test_navigation_to_blog_list(self):
        """测试导航栏跳转到博客列表页"""
        self.driver.find_element(By.CSS_SELECTOR, 'body > div.nav > a:nth-child(4)').click()
        WebDriverWait(self.driver, 5).until(EC.title_is('博客列表页'))
        assert self.driver.title == '博客列表页', f"页面跳转失败,当前页面标题:{self.driver.title}"

    def test_navigation_to_blog_editor(self):
        """测试导航栏跳转到博客编辑页"""
        self.driver.find_element(By.CSS_SELECTOR, 'body > div.nav > a:nth-child(5)').click()
        try:
            WebDriverWait(self.driver, 5).until(EC.title_is('博客编辑页'))
        except:
            pass
        assert self.driver.title == '博客编辑页', f"页面跳转失败,当前页面标题:{self.driver.title}"

    def test_logout_redirect_to_login_page(self):
        """测试退出账号是否跳转到登录页"""
        self.driver.find_element(By.CSS_SELECTOR, 'body > div.nav > a:nth-child(6)').click()
        try:
            WebDriverWait(self.driver, 5).until(EC.title_is('博客登录页'))
        except:
            pass
        assert self.driver.title == '博客登陆页', f"退出登录失败,当前页面标题:{self.driver.title}"

    def is_element_present(self, by, selector):
        """检查页面元素是否存在"""
        try:
            WebDriverWait(self.driver, 5).until(EC.presence_of_element_located((by, selector)))
            return True
        except:
            return False

结果演示: 

注意:未登录状态下访问博客列表可能导致找不到页面元素,应正确处理异常。


5. 博客详情页自动化测试(BlogDetail.py)

测试目标

  • 确保博客详情页的功能正常,包括编辑和删除权限。

测试步骤

  1. 创建 BlogDetail.py,引入 Utils.py 及相关依赖。

  2. 定义 BlogDetail 类,管理博客详情测试用例。

  3. 实现以下测试方法:

    • 当前用户可编辑和删除

      1. 登录并访问自己的博客详情页。

      2. 确保编辑和删除按钮存在。

    • 其他用户不可编辑或删除

      1. 登录并访问其他用户的博客详情页。

      2. 确保页面上无编辑和删除按钮。

  4. RunTest.py 中调用 BlogDetail 进行测试。

import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.alert import Alert
from common.Utils import BlogDriver
from selenium.webdriver.common.by import By

class BlogDetail:
    url = ''
    driver = ''
    def __init__(self):
        """初始化 WebDriver 并打开博客详情页"""
        self.url = 'http://8.137.19.140:9090/blog_detail.html?blogId=24713'
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    def test_current_user_can_edit(self):
        """测试当前用户是否能编辑博客"""
        WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((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(1)').click()
        BlogDriver.getScreenShot()
        # 确保页面跳转到博客编辑页
        assert self.driver.title == '博客编辑页', f"编辑页面标题错误:{self.driver.title}"

    def test_current_user_can_delete(self):
        """测试当前用户是否能删除博客"""
        # 等待删除按钮可点击
        WebDriverWait(self.driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'body > div.container > div.right > div > div.operating > button:nth-child(2)')))
        self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div > div.operating > button:nth-child(2)').click()
        # 等待弹出确认框
        alert = WebDriverWait(self.driver,5).until(EC.alert_is_present())
        assert alert.text == '确定删除?', f"弹窗提示不匹配:{alert.text}"
        alert.accept()
        BlogDriver.getScreenShot()
        # 等待页面跳转至博客列表页
        WebDriverWait(self.driver, 10).until(EC.title_is('博客列表页'))
        assert self.driver.title == '博客列表页', f"页面标题错误:{self.driver.title}"

    def test_other_users_cannot_edit_delete(self):
        """测试其他用户无法编辑或删除博客"""
        edit_buttons = self.driver.find_elements(By.CSS_SELECTOR,'body > div.container > div.right > div > div.operating > button:nth-child(1)')
        delete_buttons = self.driver.find_elements(By.CSS_SELECTOR,'body > div.container > div.right > div > div.operating > button:nth-child(2)')
        BlogDriver.getScreenShot()
        # 确保没有编辑和删除按钮
        assert not edit_buttons, "其他用户能看到编辑按钮"
        assert not delete_buttons, "其他用户能看到删除按钮"

结果演示: 

这里注意下,因为博客每天都会清空 ,所以

self.url = 'http://8.137.19.140:9090/blog_detail.html?blogId=24713'

 要改成当天lisi发的一篇文章自动化测试才能正确运行

或者不嫌麻烦的话可以补完这句

def urlget():
    BlogDriver.driver.get('http://8.137.19.140:9090/blog_list.html')
    WebDriverWait(BlogDriver.driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'body > div.container > div.right > div:nth-child(1) > a')))
    BlogDriver.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div:nth-child(1) > a').click()
    url = BlogDriver.driver.current_url
    return url

 把div:nth-child(1)的1改成循环到找到lisi发的文章就可以了,条件可以用找到编辑按钮?

    WebDriverWait(BlogDriver.driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'body > div.container > div.right > div:nth-child(1) > a')))

下面用 

class BlogDetail:
    driver = ''
    def __init__(self):
        """初始化 WebDriver 并打开博客详情页"""
        self.url = urlget()
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

也能解决问题 


6.博客编辑页自动化测试(BlogEdit.py)

测试目标

  • 确保博客发布后页面能正确跳转。

测试步骤

  1. 创建 BlogEdit.py,引入 Utils.py 及相关依赖。

  2. 定义 BlogEdit 类,管理博客编辑测试用例。

  3. 实现以下测试方法:

    • 博客发布测试

      1. 登录并进入博客编辑页面。

      2. 输入标题、内容,点击提交。

      3. 确保页面跳转到博客列表。

  4. RunTest.py 中调用 BlogEdit 进行测试。

from common.Utils import BlogDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BlogEdit:
    url = ''
    driver = ''
    def __init__(self):
        """初始化WebDriver并打开博客编辑页面"""
        self.url = 'http://8.137.19.140:9090/blog_edit.html'
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    def test_publish_redirect_list(self):
        """测试发布博客后是否跳转到博客列表页"""
        # 输入博客标题
        self.driver.find_element(By.CSS_SELECTOR, '#title').send_keys('789')
        # 提交博客
        self.driver.find_element(By.CSS_SELECTOR, '#submit').click()
        BlogDriver.getScreenShot()
        # 等待页面跳转到博客列表页,并验证跳转是否成功
        try:
            WebDriverWait(self.driver, 10).until(EC.title_is('博客列表页'))
        except:
            pass
        # 确保页面标题为'博客列表页'
        assert self.driver.title == '博客列表页', f"页面标题错误,实际为:{self.driver.title}"

结果演示: 


7.  测试执行入口(RunCases.py)

测试目标

  • 统一管理测试脚本的执行。

测试步骤

  1. 创建 RunCases.py,引入所有测试脚本。

  2. 依次调用各测试类的测试方法。

  3. 运行测试并记录测试结果。

import time
from common.Utils import BlogDriver
from cases import BlogLogin, BlogList, BlogEdit, BlogDetail, BlogCancellation

def run_blog_login_tests():
    """运行登录模块的所有测试"""
    print("登录模块测试中...")
    BlogLogin.BlogLogin().loginSucTest1()  # 测试用户名 zhangsan 的登录
    BlogLogin.BlogLogin().loginSucTest2()  # 测试用户名 lisi 的登录
    BlogLogin.BlogLogin().test_login_empty_username_empty_password()  # 测试用户名和密码都为空
    BlogLogin.BlogLogin().test_login_empty_username_valid_password()  # 测试用户名为空,密码有效
    BlogLogin.BlogLogin().test_login_invalid_username_invalid_password()  # 测试用户名和密码无效

def run_blog_list_tests():
    """运行博客列表页的所有测试"""
    print("博客列表页测试中...")
    BlogList.BlogList().test_account_name_display()  # 测试用户名是否正确显示
    BlogList.BlogList().test_article_count_display()  # 测试文章数是否正确显示
    BlogList.BlogList().test_category_display()  # 测试分类信息是否正确显示
    BlogList.BlogList().test_blog_title_exists()  # 测试博客标题是否存在
    BlogList.BlogList().test_blog_date_exists()  # 测试博客发布日期是否存在
    BlogList.BlogList().test_blog_content_exists()  # 测试博客内容简介是否存在
    BlogList.BlogList().test_blog_button_exists()  # 测试博客详情按钮是否存在
    BlogList.BlogList().test_navigation_to_blog_list()  # 测试博客列表跳转
    BlogList.BlogList().test_navigation_to_blog_editor()  # 测试博客编辑页跳转
    BlogList.BlogList().test_logout_redirect_to_login_page()  # 测试登出后是否跳转到登录页

def run_blog_edit_tests():
    """运行博客编辑页的所有测试"""
    print("博客编辑页测试中...")
    BlogEdit.BlogEdit().test_publish_redirect_list()  # 测试发布后是否跳转到博客列表页

def run_blog_detail_tests():
    """运行博客详情页的所有测试"""
    print("博客详情页测试中...")
    BlogDetail.BlogDetail().test_current_user_can_edit()  # 测试当前用户是否能编辑博客
    BlogDetail.BlogDetail().test_current_user_can_delete()  # 测试当前用户是否能删除博客
    BlogDetail.BlogDetail().test_other_users_cannot_edit_delete()  # 测试其他用户是否能编辑或删除博客

def run_blog_cancellation_tests():
    """运行博客注销的所有测试"""
    print("博客注销模块测试中...")
    BlogCancellation.BlogCancellation().test_logout_success()  # 测试注销是否成功并限制访问

def run_all_tests():
    """运行所有测试"""
    run_blog_login_tests()  # 运行登录相关测试
    run_blog_list_tests()   # 运行博客列表相关测试
    BlogLogin.BlogLogin().loginSucTest1()  # 重新登录
    run_blog_edit_tests()  # 运行博客编辑相关测试
    run_blog_detail_tests()  # 运行博客详情页相关测试
    run_blog_cancellation_tests()  # 运行博客注销相关测试
    print("测试已成功通过!",end='')

if __name__ == "__main__":
    try:
        run_all_tests()
    except Exception as e:
        print(f"错误发生: {e}")
    finally:
        BlogDriver.driver.quit()  # 结束所有测试后关闭浏览器

全部演示一遍: 


3.各函数作用总览

BlogCancellation.py

  1. __init__(self): 初始化 WebDriver 并打开博客列表页。
  2. test_logout_success(self): 测试用户注销后是否正确跳转回登录页,并限制访问受保护页面。

RunCases.py

  1. 运行函数,测试所有函数是否正确执行。

Utils.py

  1. __init__(self): 初始化 WebDriver。
  2. getScreenShot(self): 用于保存截图的函数。

BlogDetail.py

  1. __init__(self): 初始化 WebDriver 并打开博客详情页。
  2. test_current_user_can_edit(self): 测试当前用户是否能编辑博客。
  3. test_current_user_can_delete(self): 测试当前用户是否能删除博客。
  4. test_other_users_cannot_edit_delete(self): 测试其他用户无法编辑或删除博客。

BlogEdit.py

  1. __init__(self): 初始化 WebDriver 并打开博客编辑页面。
  2. test_publish_redirect_list(self): 测试发布博客后是否跳转到博客列表页。

BlogList.py

  1. __init__(self): 初始化 WebDriver 并打开博客列表页。
  2. test_account_name_display(self): 测试用户名称是否正确显示。
  3. test_article_count_display(self): 测试文章统计信息是否正确显示。
  4. test_category_display(self): 测试分类信息是否正确显示。
  5. test_blog_title_exists(self): 测试博客标题是否存在。
  6. test_blog_date_exists(self): 测试博客发布日期是否存在。
  7. test_blog_content_exists(self): 测试博客内容简介是否存在。
  8. test_blog_button_exists(self): 测试博客详情按钮是否存在。
  9. test_navigation_to_blog_list(self): 测试导航栏跳转到博客列表页。
  10. test_navigation_to_blog_editor(self): 测试导航栏跳转到博客编辑页。
  11. test_logout_redirect_to_login_page(self): 测试退出账号是否跳转到登录页。

BlogLogin.py

  1. __init__(self): 初始化登录页面并打开指定URL。
  2. loginSucTest1(self): 测试用户 'zhangsan' 的登录成功。
  3. loginSucTest2(self): 测试用户 'lisi' 的登录成功。
  4. _login(self, username, password): 登录方法,接收用户名和密码。
  5. _verify_login_success(self): 验证用户是否成功登录。
  6. test_login_empty_username_empty_password(self): 测试用户名和密码为空时的登录行为。
  7. test_login_empty_username_valid_password(self): 测试用户名为空,密码有效时的登录行为。
  8. test_login_empty_username_invalid_password(self): 测试用户名为空,密码无效时的登录行为。
  9. test_login_invalid_username_empty_password(self): 测试用户名无效,密码为空时的登录行为。
  10. test_login_valid_username_empty_password(self): 测试用户名有效,密码为空时的登录行为。
  11. test_login_valid_username_invalid_password(self): 测试用户名有效,密码无效时的登录行为。
  12. test_login_invalid_username_valid_password(self): 测试用户名无效,密码有效时的登录行为。
  13. test_login_invalid_username_invalid_password(self): 测试用户名无效,密码无效时的登录行为。
  14. _verify_alert(self, expected_alert_text): 验证弹出警告框的文本内容。
  15. test_logout_via_profile(self): 测试通过个人资料页面登出。

4.测试环境与执行方式

运行环境
  • Python 版本:3.13

  • 依赖库:selenium

  • 浏览器:Microsoft Edge   版本 134.0.3124.68 (正式版本) (64 位)

  • WebDriver:msedgedriver 需正确配置

运行方式
  1. 安装 selenium 依赖:

    pip install selenium
  2. 确保 msedgedriver 已正确安装。

  3. 运行 RunCases.py 以执行完整的测试流程:

    python RunCases.py
结果验证
  • 所有测试案例执行完成后,测试日志将会记录各个测试步骤的执行结果。

  • 关键页面截图将在 images/ 目录中保存,以供参考。

  • 若有测试失败,请参考日志进行问题排查,并根据错误信息调整代码或系统设置。

5.自动化测试的特点与亮点

特点:该自动化测试框架结合了Selenium WebDriver与自定义的功能模块,能够有效地进行博客网站的功能验证。通过编写多种测试用例,涵盖了从登录、发布博客到页面跳转等各个功能场景。每个测试用例都封装为独立的函数,测试目标明确,执行步骤清晰,能够快速验证网站功能是否正常工作。自动化脚本可以反复执行,提高了测试的覆盖率和效率,同时能够通过截图等方式记录测试过程中的异常情况。通过使用Selenium WebDriver的等待机制,可以确保页面元素完全加载后再进行操作,从而减少因页面加载问题而引起的测试失败。

亮点:

  1. 驱动复用:在测试中采用了统一的BlogDriver类来创建WebDriver实例,避免了每个测试用例中重复创建WebDriver对象的问题,提升了测试效率和性能。

  2. 功能清晰的测试用例:每个测试用例封装成一个独立的函数,清晰地定义了测试的目标和验证条件,增强了代码的可读性和可维护性。

  3. 完善的等待机制:通过结合显式等待和隐式等待,解决了由于页面渲染速度与测试执行速度不一致的问题,确保了每个操作都在页面元素完全加载后执行,提高了自动化测试的稳定性和效率。

  4. 截图功能:在每个测试用例中都加入了截图功能,能够在测试执行过程中自动保存截图,这有助于在测试失败时快速定位问题,提高了调试效率。

  5. 自动化的重复执行:该框架能够轻松地重复执行测试用例,帮助在不同的时间段或多次执行中检查系统的稳定性和可靠性。

  6. 页面元素检查:通过对页面元素的存在性和可见性进行验证,确保用户交互的每个元素都能够正常显示,避免了因页面渲染错误导致的功能不完整问题。

 6.完整测试代码连接

GitHub - bbppooii/Personal-Blog-System-Automated-Testing: 个人博客系统测试报告

bbppooi/个人博客系统自动化测试 - Gitee.com 


http://www.kler.cn/a/586940.html

相关文章:

  • C++程序设计语言笔记——抽象机制:模板
  • eclipse-mosquitt之docker部署安装与使用
  • 现在有分段、句子数量可能不一致的中英文文本,如何用python实现中英文对照翻译(即每行英文对应相应的中文)
  • MySQL事务及索引复习笔记
  • Qt从入门到入土(十) -数据库操作--SQLITE
  • JAVA EE(10)——线程安全——synchronized JUC(java.util.concurrent) 的常见类 线程安全的集合类
  • 机器学习编译器(二)
  • Java中的访问修饰符有哪些
  • Swagger 从 .NET 9 中删除:有哪些替代方案
  • 洛谷 P4933 大师
  • LRU(最近最少使用)算法实现
  • 探索Maas平台与阿里 QWQ 技术:AI调参的魔法世界
  • 车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介
  • 德语A1学习
  • 批量ip反查域名工具
  • 删除有序数组中的重复项(26)
  • [网络] 网络基础概念--socket编程预备
  • Ubuntu 24 常用命令方法
  • 【Git】配置Git
  • 按钮权限的设计及实现