yaml数据驱动案例
学习目标
- 掌握如何在项目中使用yaml动态修改数据
1.什么是数据驱动
将测试脚本中的数据独立出来,单独存放到文件中,便于对数据的管理.
2.测试项目
需求:
- 进入设置点击搜索按钮
- 输入搜索内容
- 点击返回
3.完成后目录结构
search_content # 项目
- base
- __init__.py # 初始化文件
- base_action.py # 封装的基本操作
- base_driver.py # 驱动初始化
- read_data.py # 数据解析文件
- data
- search_data.yaml
- page
- search_page.py
- script
- test_search.py
- pytest.ini
4. 代码
4.1 创建data目录,创建search_data.yaml
search_test_001:
input_text: "你好"
search_test_002:
input_text: "1234"
seearch_test_003:
input_text: "*&^%"
4.2 创建base/read_data.py 解析数据
Read_data.py
import yaml
import os
class ReadData:
def __int__(self, filename):
self.path = os.getcwd() + os.sep + "data" + os.sep + filename
def return_data(self):
with open(self.path, "r") as f:
data = yaml.load(f)
return data
Base_action.py
class BaseAction:
def __init__(self, driver):
self.driver = driver
def click_element(self, loc):
"""点击的基本操作"""
self.find_element(loc).click()
def input_element_content(self, loc, content):
"""输入框的基本操作"""
self.find_element(loc).clear()
self.find_element(loc).send_keys(content)
def find_element(self, loc):
"""抽取查找元素的基本动作"""
self.driver.implicitly_wait(10)
return self.driver.find_element(loc[0], loc[1])
Base_driver.py
from appium import webdriver
def init_driver(app_package, app_activity):
desired_caps = dict()
# 测试设备信息
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# app信息
desired_caps['appPackage'] = app_package # 抽取为常量
desired_caps['appActivity'] = app_activity # 抽取为常量
# 返回驱动对象
return webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
init.py
from appium.webdriver.webdriver import By
"""
1.应用的包名和启动名
"""
app_package = 'com.android.settings'
app_activity = ".Settings"
"""
2.搜索
"""
search_button = (By.XPATH, "//*[@content-desc='搜索']")
search_edit_text = (By.CLASS_NAME, "android.widget.EditText")
back_button = (By.CLASS_NAME, "android.widget.ImageButton")
4.3 编写测试脚本script/test_search.py
Test_search.py
import base
import pytest
from page.search_page import SearchPage
from base.base_driver import init_driver
from base.read_data import ReadData
def package_param_data():
"""解析数据"""
yaml_data = ReadData('search_data.yaml').return_data()
list_data = []
for i in yaml_data.keys():
list_data.append((i, yaml_data.get(i).get('input_text')))
return list_data
class Test_Search:
'''测试脚本'''
def setup_class(self):
self.driver = init_driver(base.app_package, base.base_driver)
def teardown_class(self):
self.driver.quit()
@pytest.mark.parametrize('test_id, input_text', package_param_data())
def test_search(self, test_id, input_text):
sp = SearchPage(self.driver)
# 调用操作类
# print("test_id:", test_id)
sp.input_search(input_text)
4.4 编写search_page.py
封装的是搜索的功能
import base
from base.base_action import BaseAction
class SearchPage(BaseAction):
def click_search(self):
"""点击搜索按钮"""
self.click_element(base.search_button)
def input_search(self, text):
"""输入搜索内容"""
self.input_element_content(base.search_edit_text, text)
def click_back(self):
self.click_element(base.back_button)
4.5 pytest的配置文件
Pytest.ini
[pytest]
addopts = -s
test_path = ./script
python_files = test_*
python_classes = Test*
python_functions = test_*
5. 总结
经过实现我们发现很多代码都是重复的,变化的只是要进行测试的功能模块,因此我们可以对此架构进行重复使用,更改的只是测试脚本文件、搜索功能的集体实现.
新增的是数据驱动这一块,后面也可以重复使用.重点要掌握yaml的数据驱动实现.