即根据业务逻辑将测试数据从测试脚本中拆分出来,使其成为独立的变参,实现测试脚本在不同数据集合下高度复用的目的。
ddt库python中的ddt库科技将测试中的变量参数化,其包含一组类和方法用于数据驱动测试。
pip install ddt
将之前淘宝登录的例子数据驱动化
import unittest
from ddt import ddt, data, unpack
from selenium import webdriver
from selenium.webdriver.common.by import By
@ddt
class HomePageTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
# create a new Firefox session
cls.driver = webdriver.Chrome()
cls.driver.implicitly_wait(30)
cls.driver.maximize_window()
# navigate to the application home page
cls.driver.get("https://www.taobao.com/")
@data(("login_id1", "pwd1"),("login_id2". "pwd2"))
@unpack
def test_register_new_user(self, login_id, pwd): # 参数声明
driver=self.driver
driver.find_element(By.LINK_TEXT, "亲,请登录").click() # 模拟点击
login_user = driver.find_element(By.ID, "fm-login-id")
login_password=driver.find_element(By.ID, "fm-login-password") # 定位密码框页面元素
# self.assertEqual("40", login_password.get_attribute("maxlength")) # 验证密码输入框最大长度
# 检查某个元素是否可见和可用
# self.assertTrue(login_password.is_displayed())
# self.assertTrue(login_password.is_enabled())
# 模拟用户输入和登录,注意:很多情况下会有滑块和验证码验证
login_user.send_keys(login_id) # 登录账号传参
login_password.send_keys(pwd) # 登录密码传参
login_button=driver.find_element(By.LINK_TEXT, "登录")
login_button.click()
通过外部文件数据驱动
1.通过csv文件传入数据
import csv # 导入csv包
import unittest
from ddt import ddt, data, unpack
from selenium import webdriver
from selenium.webdriver.common.by import By
def get_data(file_name):
rows=[]
data_file=open(file_name, "rb")
reader=csv.reader(data_file)
next(reader,None) # 跳过csv表头
for row in reader:
rows.append(row)
return rows
@ddt
class HomePageTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
# create a new Firefox session
cls.driver = webdriver.Chrome()
cls.driver.implicitly_wait(30)
cls.driver.maximize_window()
# navigate to the application home page
cls.driver.get("https://www.taobao.com/")
@data(*get_data("testdata.csv"))
@unpack
def test_register_new_user(self, login_id, pwd): # 参数声明
driver=self.driver
driver.find_element(By.LINK_TEXT, "亲,请登录").click() # 模拟点击
login_user = driver.find_element(By.ID, "fm-login-id")
login_password=driver.find_element(By.ID, "fm-login-password") # 定位密码框页面元素
# self.assertEqual("40", login_password.get_attribute("maxlength")) # 验证密码输入框最大长度
# 检查某个元素是否可见和可用
# self.assertTrue(login_password.is_displayed())
# self.assertTrue(login_password.is_enabled())
# 模拟用户输入和登录,注意:很多情况下会有滑块和验证码验证
login_user.send_keys(login_id) # 登录账号传参
login_password.send_keys(pwd) # 登录密码传参
login_button=driver.find_element(By.LINK_TEXT, "登录")
login_button.click()
2.通过excel文件传入数据
xlrd:读Excel文件库
xlwd:写Excel文件库
openpyxl:提供了Excel读写功能
import csv # 导入csv包
import unittest
from ddt import ddt, data, unpack
from selenium import webdriver
from selenium.webdriver.common.by import By
def get_data(file_name):
rows=[]
book=xlrd.open_workbook(file_name)
sheet=book.sheet_by_index(0)
for row_idx in range(1, sheet.nrows):
rows.append(likst(sheet.row_values(row_idx,0,sheet.ncols)))
return rows
@ddt
class HomePageTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
# create a new Firefox session
cls.driver = webdriver.Chrome()
cls.driver.implicitly_wait(30)
cls.driver.maximize_window()
# navigate to the application home page
cls.driver.get("https://www.taobao.com/")
@data(*get_data("testdata.xlsx"))
@unpack
def test_register_new_user(self, login_id, pwd): # 参数声明
driver=self.driver
driver.find_element(By.LINK_TEXT, "亲,请登录").click() # 模拟点击
login_user = driver.find_element(By.ID, "fm-login-id")
login_password=driver.find_element(By.ID, "fm-login-password") # 定位密码框页面元素
# self.assertEqual("40", login_password.get_attribute("maxlength")) # 验证密码输入框最大长度
# 检查某个元素是否可见和可用
# self.assertTrue(login_password.is_displayed())
# self.assertTrue(login_password.is_enabled())
# 模拟用户输入和登录,注意:很多情况下会有滑块和验证码验证
login_user.send_keys(login_id) # 登录账号传参
login_password.send_keys(pwd) # 登录密码传参
login_button=driver.find_element(By.LINK_TEXT, "登录")
login_button.click()
page Object模式
在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织。
即创建一个对象来对应页面的一个应用。
优点如下:
- 抽象出对象,可以尽量降低修改页面代码对测的影响。
- 可以在多个测试用例中复用一部分测试代码。
- 测试代码变得更易读、灵活、可维护。



