当前位置:网站首页>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": "输入测试三国"
}
]
成果展示
自动化测试流程
测试报告
边栏推荐
- C语言进阶 —— 枚举与联合
- 记录一个相当坑爹的WSL局域网访问问题
- UE4选不中半透明物体(半透明显示快捷键是啥)
- 牛客网剑指offer刷题练习之重构二叉树
- 低代码搭建高效管理房屋检测系统案例分析
- [Binary tree] The number of good leaf node pairs
- 【组成原理 五 系统总线】
- Really touch the fish and lead the teacher: The programmer brother works 10 minutes a day with an annual salary of 570,000. I broke the defense...
- easyExce模板填充生成Excel的实际操作,多sheet页处理
- 私域增长 | 私域会员:9大连锁行业15个案例集锦
猜你喜欢
随机推荐
PromptBERT: Improving BERT Sentence Embeddings with Prompts
关于Image scaleType的属性详解,以及每一个属性的区别
第二增长曲线 | 企业创新突破停滞困境的驱动指南
不堆概念、换个角度聊多线程并发编程
搭建自己的以图搜图系统 (一):10 行代码以图搜图
面试突击:为什么 TCP 需要 3 次握手?
2.5w字 + 36 张图爆肝操作系统面试题 学不吐你
MATLAB程序设计与应用 2. 第2章 MATLAB数据及其运算 2.1 MATLAB数值数据 && 2.2 MATLAB矩阵的表示 && 2.3 变量及其操作
专家建议|经济低迷周期下如何制订求存的增长战略
UE4选不中半透明物体(半透明显示快捷键是啥)
【Autosar 启动流程详解】
【Autosar vLinkGen 链接器脚本生成器】
Small programs use npm packages
Build your own image search system (1): 10 lines of code to search images by image
ESP8266-Arduino编程实例-LittleFS及数据上传
Xcode如何利用预览(Preview)让SwiftUI视图快速适配不同尺寸的设备
【AutoSAR 七 工具链简介】
【体系结构 一 概述】
记录一个相当坑爹的WSL局域网访问问题
【AutoSAR 十三 NVM】