C++ 方向 Web 自动化测试实战博客系统思路
在软件测试领域,自动化测试凭借其高效、可重复的优势,成为保障项目质量的重要手段。本文将以博客系统为实际案例,从测试用例设计、脚本开发到测试报告补充,完整拆解 C++ 方向 Web 自动化测试的实施流程,为大家提供可落地的实战指南。
1 编写 Web 测试用例:覆盖核心场景
测试用例是自动化测试的基础,需全面覆盖博客系统的关键功能模块与异常场景。本次实战围绕登录、博客列表、博客编辑、博客详情 4 大核心模块,设计了正向与异常场景的测试用例,具体如下:
模块 | 场景类型 | 具体场景 | 预期结果 |
---|---|---|---|
登录页面 | 正常登录 | 账号 admin / 密码 123、账号 lisi / 密码 123 | 成功跳转至博客列表页 |
登录页面 | 异常登录 | 账号为空、密码为空、账号错误、密码错误 | 弹窗提示错误信息,不跳转页面 |
博客列表页 | 登录状态 | 直接访问 / 从菜单进入 | 页面正常打开,显示博客列表(数量>10) |
博客列表页 | 未登录状态 | 直接输入链接访问 | 弹窗提示登录,自动跳转至登录页面 |
博客编辑页 | 登录状态 | 正常填写标题 + 内容 | 提交成功,新增博客显示在列表页 |
博客编辑页 | 登录状态 | 不写标题 / 标题 + 内容都不写 | 提交失败,提示必填项错误 |
博客编辑页 | 未登录状态 | 直接访问 / 从登录页进入 | 页面可打开,但无法提交博客 |
博客详情页 | 登录状态 | 从列表页点击博客进入 | 页面正常打开,显示标题、发布时间、内容 |
博客详情页 | 未登录状态 | 直接访问链接 | 弹窗提示登录,自动跳转至登录页面 |
2 自动化测试脚本开发:模块化设计
脚本开发采用 Python+Selenium 框架,遵循 “模块化、可复用” 原则,将驱动管理、页面操作、用例执行拆分到不同文件,降低代码耦合度。
(1)公共工具类:common/Utils.py
负责初始化 Chrome 驱动、截图功能,避免重复代码。核心逻辑如下:
- 利用
webdriver_manager
自动安装匹配的 ChromeDriver,无需手动配置环境; - 截图按 “日期 + 用例名 + 时间” 命名,保存在
../images/
目录下,便于问题追溯; - 定义全局
BlogDriver
对象,供所有用例文件调用。
import datetime
import os.path
import sys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManagerclass Driver:driver = ""def __init__(self):options = webdriver.ChromeOptions()# 初始化Chrome驱动self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)# 截图方法:按用例名和时间命名def getScreenShot(self):dirname = datetime.datetime.now().strftime('%Y-%m-%d')if not os.path.exists("../images/" + dirname):os.mkdir("../images/" + dirname)# 获取调用该方法的用例名case_name = sys._getframe().f_back.f_code.co_namefilename = f"{case_name}-{datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')}.png"self.driver.save_screenshot(f'../images/{dirname}/{filename}')# 全局驱动对象,供其他模块调用
BlogDriver = Driver()
(2)页面操作类:cases 目录下分模块实现
每个页面(登录、列表、详情)对应一个类,封装该页面的元素定位与操作方法,符合 “页面对象模型(POM)” 设计思想。
登录页面:cases/BlogLogin.py
封装正常登录(loginSucTest
)与异常登录(loginFailTest
)方法,通过 CSS 选择器定位用户名、密码输入框和提交按钮,用assert
断言登录结果。import time from selenium.webdriver.common.by import By from common.Utils import BlogDriverclass BlogLogin:def __init__(self):self.url = "http://192.168.47.135:8653/blog_system/blog_login.html"self.driver = BlogDriver.driverself.driver.get(self.url)# 正常登录测试:admin/123def loginSucTest(self):time.sleep(2) # 等待页面加载self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 断言:登录成功后显示列表页专属元素(左侧头像)self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > img")BlogDriver.getScreenShot() # 截图留存self.driver.back() # 返回登录页,供后续用例使用# 异常登录测试:密码错误(admin/111)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("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("111")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 断言:提示“用户名或密码错误!”expect = "用户名或密码错误!"actual = self.driver.find_element(By.CSS_SELECTOR, "body").textassert expect == actualBlogDriver.getScreenShot()self.driver.back()
博客列表页:cases/BlogList.py
验证登录状态下列表页的元素显示(如博客数量>10),以及点击博客跳转至详情页的功能。from selenium.webdriver.common.by import By from common.Utils import BlogDriverclass BlogList:def __init__(self):self.url = "http://192.168.47.135:8653/blog_system/blog_list.html"self.driver = BlogDriver.driverself.driver.get(self.url)# 列表页测试:前提是已登录def ListTest(self):# 断言:显示左侧头像(确认登录状态)self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > img")# 断言:博客数量>10articles = self.driver.find_elements(By.CSS_SELECTOR, "body > div.container > div.right > div")assert len(articles) > 10# 点击第一篇博客,跳转至详情页self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > a").click()# 断言:页面标题为“博客详情页”assert self.driver.title == "博客详情页"BlogDriver.getScreenShot()
博客详情页:cases/BlogDetail.py
验证详情页的核心元素(标题、发布时间、内容)是否正常显示。from selenium.webdriver.common.by import By from common.Utils import BlogDriverclass BlogDetail:def __init__(self):self.url = "http://192.168.47.135:8653/blog_system/blog_detail.html?blogId=15"self.driver = BlogDriver.driver# 若从列表页跳转,无需重复访问URLif self.driver.title != "博客列表页":self.driver.get(self.url)# 详情页元素校验def DetailCheck(self):BlogDriver.getScreenShot()# 断言:显示标题、发布时间、内容self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > h3")self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.date")self.driver.find_element(By.CSS_SELECTOR, "#content")
(3)用例执行入口:cases/RunCases.py
整合所有测试用例,按 “登录→列表→详情” 的流程执行,最后关闭驱动。
from common.Utils import BlogDriver
from tests import BlogLogin, BlogList, BlogDetailif __name__ == "__main__":# 执行登录成功用例BlogLogin.BlogLogin().loginSucTest()# 执行列表页用例BlogList.BlogList().ListTest()# 执行详情页用例BlogDetail.BlogDetail().DetailCheck()# 关闭浏览器BlogDriver.driver.quit()