数据驱动
参数化, 数据驱动, DDT
数据驱动是思想, 参数化是实现数据驱动的手段形式。
DDT: data-driven testing 数据驱动测试
数据驱动: 如果有同一套代码,但是只有数据不一样。
就是当测试用例所有的逻辑都一样,只有数据不同的时候,我们可以把数据提取出来,
然后用数据去分别带入测试用例函数当中
数据驱动不是万能的,有些场景不适合用数据驱动。
数据驱动的好处:
- 实现了数据和代码的分离,好维护
- 简化代码,不需要写重复的函数名。
数据驱动的坏处:
- 数据驱动不方便调试
- 如果测试逻辑不通用,是不适合用数据驱动的。
import pytest
data = [
(1, 1, 2),
(3, 2, 4),
]
# @pytest.mark.parametrize('info', data)
# def test_add(info):
# # (1, 1, 2),
# param1, param2, expected = info
# # assert info[0] + info[1] == info[2]
# assert param1 + param2 == expected
@pytest.mark.parametrize('param1, param2, expected', data)
def test_add(param1, param2, expected):
assert param1 + param2 == expected
=======================================================
案例1:
import time
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from pages.login import Login
from pages.home import HomePage
class TestLogin:
@pytest.mark.parametrize("info",[("1356074449","666666666","十七"),
("19142706666", "666666666","十八")])
def test_login_without_username_and_password(self,get_driver,info):
"""测试没有用户名和密码的情况。
尽量通过测试用例的函数名称表示测试的测试点。
梳理测试步骤:、
1、打开浏览器
2、访问测试页面
3、点击提交
4、断言
"""
driver = get_driver
login_page = Login(driver)
home_page = HomePage(driver)
login_page.loan()
# 登录
login_page.login(info[0],info[1])
# 断言页面标题
time.sleep(1)
assert driver.current_url == home_page.url
user_elem = home_page.get_username()
assert user_elem == info[2]
===================================================================================
案例2:
赋值:username, password, expected = info
import time
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from pages.login import Login
from pages.home import HomePage
class TestLogin:
@pytest.mark.parametrize("info",[("13560745555","666666666","十七"),
("19142706666", "666666666","十八")])
def test_login_without_username_and_password(self,get_driver,info):
"""测试没有用户名和密码的情况。
尽量通过测试用例的函数名称表示测试的测试点。
梳理测试步骤:、
1、打开浏览器
2、访问测试页面
3、点击提交
4、断言
"""
username,password,expected = info
driver = get_driver
login_page = Login(driver)
home_page = HomePage(driver)
login_page.loan()
# 登录
login_page.login(username,password)
# 断言页面标题
time.sleep(1)
assert driver.current_url == home_page.url
user_elem = home_page.get_username()
assert user_elem == expected
==============================================================================
案例3:
data模块
success = [("13560748366","666666","十七"),
("19142706666", "666666","十八")
]
=============================================================
@pytest.mark.parametrize(“info”,data_login.success)
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from pages.login import Login
from pages.home import HomePage
from data import data_login
class TestLogin:
@pytest.mark.parametrize("info",data_login.success)
def test_login_without_username_and_password(self,get_driver,info):
"""测试没有用户名和密码的情况。
尽量通过测试用例的函数名称表示测试的测试点。
梳理测试步骤:、
1、打开浏览器
2、访问测试页面
3、点击提交
4、断言
"""
username,password,expected = info
driver = get_driver
login_page = Login(driver)
home_page = HomePage(driver)
login_page.loan()
# 登录
login_page.login(username,password)
# 断言页面标题
time.sleep(1)
assert driver.current_url == home_page.url
user_elem = home_page.get_username()
assert user_elem == expected
=========================================================================
URL 配置
yaml 文件,冒号后一定要空格。
编写读取yaml文件的程序:通用的。
host: “https://v4.ketangpai.com”
user1:
username: “13560748369”
password: “wtg444444”
==================================================================================
安装:pip install pyyaml
import yaml
from config.path import config_yaml_path
def read_yaml(fpath):
"""fpath: yaml 文件的路径"""
with open(fpath, encoding='utf-8') as f:
# 读取yaml 当中的数据
data = yaml.safe_load(f)
return data
# 获取yaml配置项
yaml_config = read_yaml(config_yaml_path)
================================================
管理项目下的路径
## 管理项目下的路径
import os
# 获取当前文件的路径
config_path = os.path.abspath(__file__)
print(config_path)
# config 目录
config_dir = os.path.dirname(config_path)
print(config_dir)
# lesson9 项目路径
root_dir = os.path.dirname(config_dir)
print(root_dir)
# 获取 data 目录路径
data_dir = os.path.join(root_dir, 'data')
print(data_dir)
if not os.path.exists(data_dir):
os.mkdir(data_dir)
# yaml 配置文件的路径
config_yaml_path = os.path.join(config_dir, 'config.yaml')
========================================================
拼接
host = yaml_config["host"]
url = host + "/User/login.html"
print(url)
==========================================================================
分层元素定位
# 存放元素定位
from selenium.webdriver.common.by import By
user_name_zl = (By.XPATH, '//input[@placeholder="邮箱/账号/手机号"]')
"""账号元素定位"""
password_ma = (By.XPATH, '//input[@placeholder="密码"]')
""""密码元素定位"""
login_dl = (By.XPATH, '//div[@class="padding-cont pt-login"]//a[@class="btn-btn"]')
"""登录按钮元素定位"""
elem_msg_locator = (By.XPATH, '//div[@class="atsx-form-explain"]')
"""元素: 账号不能为空,密码不能为空"""
======================================================
案例1:
import time
from common.yaml_handler import yaml_config
from locator import login_locator
host = yaml_config["host"]
class Login:
url = host + "/User/login.html"
def __init__(self,driver):
self.driver = driver
def login(self, username, password):
# 登录过程
self.driver.find_element(*login_locator.user_name_zl).send_keys(username)
self.driver.find_element(*login_locator.password_ma).send_keys(password)
# 定位登录按钮
yx_login = self.driver.find_element(*login_locator.login_dl)
yx_login.click()
time.sleep(1)
return self
# 封装URL
def loan(self):
"""访问页面"""
self.driver.get(self.url)
return self
def clear(self):
"""清空用户名和密码"""
self.driver.find_element(*login_locator.user_name_zl).clear()
self.driver.find_element(*login_locator.password_ma).clear()
def get_elem(self):
"""断言"""
elem = self.driver.find_elements(*login_locator.elem_msg_locator)
text = [el.text for el in elem]
return text
====================================================
案例2:
在类属性当中,直接赋值,元素定位
import time
from common.yaml_handler import yaml_config
from selenium.webdriver.common.by import By
host = yaml_config["host"]
class Login:
url = host + "/User/login.html"
# 存放元素定位
user_name_zl = (By.XPATH, '//input[@placeholder="邮箱/账号/手机号"]')
"""账号元素定位"""
password_ma = (By.XPATH, '//input[@placeholder="密码"]')
""""密码元素定位"""
login_dl = (By.XPATH, '//div[@class="padding-cont pt-login"]//a[@class="btn-btn"]')
"""登录按钮元素定位"""
elem_msg_locator = (By.XPATH, '//div[@class="atsx-form-explain"]')
"""元素: 账号不能为空,密码不能为空"""
def __init__(self,driver):
self.driver = driver
def login(self, username, password):
# 登录过程
self.driver.find_element(*self.user_name_zl).send_keys(username)
self.driver.find_element(*self.password_ma).send_keys(password)
# 定位登录按钮
yx_login = self.driver.find_element(*self.login_dl)
yx_login.click()
time.sleep(1)
return self
# 封装URL
def loan(self):
"""访问页面"""
self.driver.get(self.url)
return self
def clear(self):
"""清空用户名和密码"""
self.driver.find_element(*self.user_name_zl).clear()
self.driver.find_element(*self.password_ma).clear()
def get_elem(self):
"""断言"""
# actual = self.driver.find_elements(*self.elem_msg_locator)
# actual_value = []
# for el in actual:
# text = actual_value.append(el.text)
# return text
elem = self.driver.find_elements(*self.elem_msg_locator)
text = [el.text for el in elem]
return text

被折叠的 条评论
为什么被折叠?



