所谓数据驱动测试,简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入、输出与期望值的参数化,避免在测试中使用硬编码的数据。
这种方法对于测试步骤相同而使用不同的输入值和期望值的测试场景尤为重要
数据驱动的模式不仅可以帮助增加类似复杂条件场景下的测试覆盖,还可以极大的减少对测试代码的编写和维护工作
一、结合ddt模块及字典数据类型实现数据驱动测试
ddt模块在使用ddt.data将数据引入到测试用例时候,需要的参数是字典形式,所以我们可以先构造字典,然后直接使用。
import unittest
from selenium import webdriver
import time
#导包
from ddt import ddt,data
# import ddt
#操作步骤:
# 1、创建含有多个字典的列表
# 2、使用@ddt注解测试类
# 3、创建一个方法把数据取出来
# 4、使用@data注解单元测试用例
@ddt
class verydows_reg(unittest.TestCase):
paraValue = [{"username":"test","email":"test000@163.com","password":"123456","rep":"123456","expect":"用户名不符合格式要求"},
{"username":"","email":"test000@163.com","password":"123456","rep":"123456","expect":"请设置用户名"}]
#定的这个方法不是测试用例,是一个普通方法,帮我们取到数据
def very_reg(self,username,email,password,repassword,expect):
driver = webdriver.Chrome()
# 1、打开verydows电商网站的首页
driver.get("http://xx.xx.xx.xx/verydows/")
# 2、点击首页的免费注册按钮,跳转到注册页面
driver.find_element_by_link_text("免费注册").click()
# 3、输入合法格式的用户名
driver.find_element_by_id("username").send_keys(username)
# 4、输入和法格式的邮箱
driver.find_element_by_id("email").send_keys(email)
# 5、输入和法格式的密码
driver.find_element_by_id("password").send_keys(password)
# 6、输入和法格式的确认密码
driver.find_element_by_id("repassword").send_keys(repassword)
# 7、点击我已同意(已默认勾选了)
# 8、点击注册按钮,注册成功
driver.find_element_by_link_text("立即注册").click()
#强制等待一会
time.sleep(5)
#断言是否成功
# actualValue = driver.find_element_by_xpath('/html/body/div[4]/div[1]/div[2]/div[1]/div[1]/h3/font[1]').text
actualValue = driver.find_element_by_xpath('//*[@id="register-form"]/div/dl[1]/dd/span/font').text
expectValue = expect
self.assertEqual(actualValue,expectValue)
# 9、关闭浏览器
driver.quit()
def setUp(self):
pass
#参数化测试用例
@data(*paraValue)
def test_very_01(self,para):
self.very_reg(para["username"],para["email"],para["password"],para["rep"],para["expect"])
def tearDown(self):
pass
if __name__ == '__main__':
unittest.main()
二、结合ddt模块及xlrd模块实现数据驱动测试
1、将数据文件中数据读入脚本并处理成字典
2、设计一个模块,实现将excel文件中数据读入脚本并处理成字典格式
import xlrd
class ExcelUtil():
def __init__(self, excelPath, sheetName="Sheet1"):
self.data = xlrd.open_workbook(excelPath)
self.table = self.data.sheet_by_name(sheetName)
# 获取第一行作为key值
self.keys = self.table.row_values(0)
# print(self.keys)
# 获取总行数
self.rowNum = self.table.nrows
# print(self.rowNum)
# 获取总列数
self.colNum = self.table.ncols
# print(self.colNum)
def dict_data(self):
if self.rowNum <= 1:
print("总行数小于1")
else:
r = []
j=1
for i in range(self.rowNum-1):
s = {}
# 从第二行取对应values值
values = self.table.row_values(j)
# print(values)
for x in range(self.colNum):
s[self.keys[x]] = values[x]
r.append(s)
j+=1
return r
if __name__ == "__main__":
filepath = r"./verydows_reg.xlsx"
#sheetName = "Sheet1"
data = ExcelUtil(filepath)
print(data)
for i in data.dict_data():
print(i)
3、设计自动化测试脚本,使用ddt模块实现数据驱动
import unittest
from selenium import webdriver
import time
import csv
import xlrd
from ddt import ddt,data
from ExcelUtil import ExcelUtil
@ddt
class verydows_reg(unittest.TestCase):
filepath = r"./verydows_reg.xlsx"
#使用ExcelUtil创建对象datas
datas = ExcelUtil(filepath)
datadict = datas.dict_data()
def setUp(self):
pass
#是一个普通方法,定义的测试用例的步骤
def reg_01(self,us,em,pa,repa,ex):
driver = webdriver.Chrome()
# 1、打开verydows电商网站的首页
driver.get("http://xx.xx.xx.xx/verydows/")
# 2、点击首页的免费注册按钮,跳转到注册页面
driver.find_element_by_link_text("免费注册").click()
# 3、输入合法格式的用户名
driver.find_element_by_id("username").send_keys(us)
# 4、输入和法格式的邮箱
driver.find_element_by_id("email").send_keys(em)
# 5、输入和法格式的密码
driver.find_element_by_id("password").send_keys(pa)
# 6、输入和法格式的确认密码
driver.find_element_by_id("repassword").send_keys(repa)
# 7、点击我已同意(已默认勾选了)
# 8、点击注册按钮,注册成功
driver.find_element_by_link_text("立即注册").click()
#强制等待一会
time.sleep(5)
#断言是否成功
# actualValue = driver.find_element_by_xpath('/html/body/div[4]/div[1]/div[2]/div[1]/div[1]/h3/font[1]').text
actualValue = driver.find_element_by_xpath('//*[@id="register-form"]/div/dl[1]/dd/span/font').text
expectValue = ex
self.assertEqual(actualValue,expectValue)
# 9、关闭浏览器
driver.quit()
#定义一个单元测试用例,并且是用@data进行注解
@data(*datadict)
def test_verydows_01(self,para):
self.reg_01(para["username"],para["email"],para["password"],para["repassword"],para["expect"])
def tearDown(self):
pass
if __name__ == '__main__':
unittest.main()