当前位置:网站首页>webUI测试框架设计思路详解
webUI测试框架设计思路详解
2022-07-29 19:23:00 【飘飞雪】
前言
自动化测试中,最重要的就是框架的搭建,一个好的自动化测试框架可以大大降低维护成本,提高效率。这篇文章就简单介绍一下UI自动化测试框架的搭建思路。
基于POM+DDT+pytest+selenium+allure搭建的web自动化测试框架:https://github.com/tdx1997tdx/web_auto_testing
POM设计模式
POM,全程Page Object Model,是测试业界UI自动化框架的主流设计模式。整个框架做到代码与数据分离,逻辑代码与测试代码分离,POM的结构如下:
- 基类:主要生产一系列在页面对象中可以被调用的函数。本身作为一个工具库的存在。
- 页面对象类:逻辑代码部分。结合实际业务,提取所有可以被自动化执行的页面。类中包含页面的核心元素与页面的核心流程。
- 测试用例类:测试代码部分。用于拼接各类的页面对象,实现最终的测试流程。
- 测试数据类:用于提取所有在实际测试过程中需要应用的数据内容。
DDT数据驱动测试
数据驱动测试,由外部数据集合来驱动测试用例,一组不同的数据来执行相同的操作(一份脚本),测试数据和测试操作进行完全的分离的脚本设计模式,从数据文件读取输入数据,通过变量的参数化,将测试数据传入测试脚本,不同的数据文件对应不同的测试用例。
ddt优势如下:
代码复用率高,一次编写多条数据复用逻辑
异常排查效率高,测试执行隔离,数据间无影响
代码可维护性高,提高代码的易读性
项目实战讲解
项目结构介绍

- base_page:基类主要生产一系列在页面对象中可以被调用的函数。本身作为一个工具库的存在。
- page_object:页面对象类,逻辑代码部分。结合实际业务,提取所有可以被自动化执行的页面。类中包含页面的核心元素与页面的核心流程。
- test_case:存放测试用例代码实现,用于拼接各类的页面对象,实现最终的测试流程。
- data:存放测试数据,ddt实现的核心。
- config:存放通用配置
- report:存放allure测试报告
- log:存放日志
- utils:存放一些通用工具包
base_page
POM中基类,主要封装一些selenium中常用的方法
base_page.py
from selenium.webdriver import Keys
from config.config import url as index_url
class BasePage:
# 构造函数
def __int__(self, driver):
self.driver = driver
# 访问url
def visit(self, url):
self.driver.get(url)
def visit_index(self):
self.driver.get(index_url)
# 元素定位
def locate(self, loc):
return self.driver.find_element(*loc)
# 输入文本
def input(self, loc, text):
self.locate(loc).send_keys(text)
# 单击
def click(self, loc):
self.locate(loc).click()
# refresh
def refresh_page(self):
self.driver.refresh()
# 按下回车键
def enter(self, loc):
self.locate(loc).send_keys(Keys.ENTER)
page_object
存放页面对象以及页面的核心业务流
业务主页面:
index_page.py
from selenium.webdriver.common.by import By
from base_page.base_page import BasePage
class IndexPage(BasePage):
uri = "/"
# 核心元素
search_input = (By.XPATH, '//*[@id="layout"]/div/div[1]/div[2]/div/span/div[1]/span/span[1]/input')
def __init__(self, driver):
super().__int__(driver)
# 核心业务流
def search(self, txt):
self.visit_index()
self.input(self.search_input, txt)
self.enter(self.search_input)
测试用例中,我们只关系搜索功能,所以抽象出核心元素和核心业务流
- 核心元素:图片中框起来的部分,也就是搜索输入框
- 核心业务流:
- 进入页面
- 定位输入框,并输入内容
- 点击回车搜索内容
test_case
测试用例类,使用pytest框架搭建
from selenium import webdriver
from config.chrome_options import options
from page_object.login_page import LoginPage
from page_object.index_page import IndexPage
import allure
import pytest
from utils.json_tool import load_json
from utils.log_tool import logger
import time
@allure.feature('搜索模块测试')
class TestSearch:
def setup_class(self):
self.driver = webdriver.Chrome(options=options())
lp = LoginPage(self.driver)
lp.login_with_cookie()
def teardown_class(self):
self.driver.quit()
@pytest.mark.parametrize("test_input,story,title", load_json("./data/search_data.json"))
def test_search(self, test_input, story, title):
""" 用例描述:搜索测试 """
# 动态添加模块和标题
allure.dynamic.story(story)
allure.dynamic.title(title)
ip = IndexPage(self.driver)
ip.search(test_input["search_txt"])
logger.info(str(test_input) + "finish")
time.sleep(2)
@pytest.mark.parametrize和load_json组成ddt的核心,下面看看data中json文件的定义:
[
{
"data": {
"search_txt": "tdx"
},
"story": "用例1:输入tdx",
"title": "输入测试tdx"
},
{
"data": {
"search_txt": "mytdx"
},
"story": "用例2:输入mytdx",
"title": "输入测试mytdx"
},
{
"data": {
"search_txt": "三国"
},
"story": "用例3:输入三国",
"title": "输入测试三国"
}
]
我们封装个load_json方法读取数据进行数据驱动测试
import json
# 读取json文件内容,转化成数据驱动的格式
def load_json(path):
with open(path) as f:
data = json.load(f)
res = []
for i in data:
res.append((i["data"], i["story"], i["title"]))
return res
data
data中存放ddt的相关数据,做到数据与代码分离
search_data.json
[
{
"data": {
"search_txt": "tdx"
},
"story": "用例1:输入tdx",
"title": "输入测试tdx"
},
{
"data": {
"search_txt": "mytdx"
},
"story": "用例2:输入mytdx",
"title": "输入测试mytdx"
},
{
"data": {
"search_txt": "三国"
},
"story": "用例3:输入三国",
"title": "输入测试三国"
}
]
成果展示
自动化测试流程
测试报告

边栏推荐
- 数字孪生万物可视 | 联接现实世界与数字空间
- 项目分析(三个小众的嵌入式产品)
- 经验分享|编写简单易用的在线产品手册小妙招
- 【AutoSAR 五 方法论】
- FPGA设计8位异步、同步二进制计数器
- 专家建议|经济低迷周期下如何制订求存的增长战略
- 2022暑假 动态规划总结
- Test push | Ali Fliggy, Baidu, 58 (recruitment), Zhihu, Huanxin Network, Baiguoyuan, Ali (Lazada), Shenzhicheng, Yuanrong Qixing are recruiting
- FPGA设计8-3线优先编码器与3-8线译码器
- OpenCV - 图像二值化处理 腐蚀膨胀 边缘检测 轮廓识别
猜你喜欢
随机推荐
First-line big factory software test interview questions and answer analysis, the strongest version of 2022...
【Autosar vLinkGen 链接器脚本生成器】
函数指针与block[通俗易懂]
不用Swagger,那我用啥?
Test push | Ali Fliggy, Baidu, 58 (recruitment), Zhihu, Huanxin Network, Baiguoyuan, Ali (Lazada), Shenzhicheng, Yuanrong Qixing are recruiting
【中标麒麟系统Your trial is EXPIRED and no VALID licens 关闭弹窗】
"Additional price" can not exchange for safety, the death of Lexus LM, whose fault is it?
swagger @ApiModel @ApiModelProperty注解属性说明「建议收藏」
HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界
解决宝塔mysql 远程root 无法连接问题
记录一个相当坑爹的WSL局域网访问问题
AI全流程开发难题破解之钥
大中型网站列表页翻页过多怎么优化?
低代码搭建高效管理房屋检测系统案例分析
shell 图形化跳板机
面试突击:为什么 TCP 需要 3 次握手?
敏捷组织 | 企业克服数字化浪潮冲击的路径
Gesture password unlock WeChat applet project source code
不堆概念、换个角度聊多线程并发编程
JS实现倒计时代码实例「建议收藏」







![[数学基础]高等数学相关概念学习](/img/59/3e1608de63c60201b3e7aaaf032d42.png)

