一、前言
Unittest第三方库parameterized类似Unittest的DDT、[email protected],可以实现参数化用户数据驱动,传入多组参数,自动生成多个用例,避免写多个方法
二、使用parameterized实现数据驱动
- 方式一:将参数写到方法上(parameterized)
代码如下:
import csv
import unittest
from time import sleep
from unittest import TestCase
# import unittest
# 修饰的类,参数是给所有的用例使用的
# import paramunittest
# import parameterized
from parameterized import parameterized
from selenium import webdriver
from logModule.log1 import myLog
from regCSV2.regCSV import register
class regTest(TestCase):
def setUp(self):
self.md = regTest()
def tearDown(self):
self.md = None
@parameterized.expand([
('yangyang1','','123456','123456','请设置邮箱'),
('yangyang2','abcdeqq.com','123456','123456','无效的邮箱地址'),
('yangyang3','@sina.com','123456','123456','无效的邮箱地址'),
('yangyang4','abcde@163com','123456','123456','无效的邮箱地址')
])
def testReg(self,username,email,password,repassword,exurl):
# 将所有参数整个成一个列表
data = [username,email,password,repassword,exurl]
driver = webdriver.Chrome()
# 这是实例化一个注册对象
reg = register()
driver.get("http://localhost:8088/XXX/index.php")
# 调用注册对象的注册方法
reg.register1(driver,data)
expectValue = driver.find_element_by_css_selector('#register-form > div > dl:nth-child(2) > dd > span > font').text
# 断言 + 打印日志
try:
# print(expectValue)
self.assertEqual(data[4], expectValue, "预期结果和实际结果不一致")
myLog(__file__, self._testMethodName, expectValue, data[4], "用例成功")
except:
myLog(__file__, self._testMethodName, expectValue, data[4], "用例失败")
driver.quit()
if __name__ == "__main__":
unittest.main(verbosity=1)
- 方法二:将方法写到类上(paramunittest)
代码如下:
import csv
import unittest
from time import sleep
from unittest import TestCase
# import unittest
import paramunittest
from selenium import webdriver
from regCSV2.regCSV import register
@paramunittest.parametrized(
('yangzxc22','[email protected]','123456','123456','http://localhost:8088/XXX/index.php?c=user&a=register&step=submit'),
('yangzxc92','[email protected]','123456','123456','http://localhost:8088/XXX/index.php?c=user&a=register&step=submit'),
('yangzxc6692','[email protected]','123456','123456','http://localhost:8088/XXX/index.php?c=user&a=register&step=submit'),
('yangzxc2','[email protected]','123456','123456','http://localhost:8088/XXX/index.php?c=user&a=register&step=submit')
)
class regTest(TestCase):
def setParameters(self,username,email,password,repassword,exurl):
self.username = username
self.email = email
self.password = password
self.repassword = repassword
self.exurl = exurl
def testReg(self):
driver = webdriver.Chrome()
driver.get("http://localhost:8088/XXX/index.php?c=user&a=register")
driver.find_element_by_id("username").send_keys(self.username)
driver.find_element_by_id("email").send_keys(self.email)
driver.find_element_by_id("password").send_keys(self.password)
driver.find_element_by_id("repassword").send_keys(self.repassword)
driver.find_element_by_id("captcha").send_keys("aaaa")
driver.find_element_by_link_text("立即注册").click()
actualValue = driver.current_url
print(actualValue) # 实际结果
self.assertEqual(self.exurl, actualValue, "预期结果和实际结果不一致")
driver.quit()
if __name__ == "__main__":
unittest.main(verbosity=1)
三、使用DDT模块实现数据驱动
import csv
import unittest
from time import sleep
from unittest import TestCase
# import unittest
from ddt import ddt,data
from selenium import webdriver
from regCSV2.ExcelUtil import ExcelUtil
from regCSV2.regCSV import register
@ddt
class regTest(TestCase):
filePath = r"C:\XXX\regRepassword.xls"
# 调用转换为字典的方法,也可调用转换为列表的,根据自己的需要可以修改ExcelUtil的代码。
data1 = ExcelUtil(filePath, "regRepassword").dict_data()
def setUp(self):
self.md = regTest()
def tearDown(self):
self.md = None
@data(*data1) # data1的数据会传给aa
def testReg(self,aa):
# 将所有数据整合成一个列表
datas = [aa["username"],aa["email"],aa["password"],aa["repassword"]]
print(datas)
driver = webdriver.Chrome()
reg = register()
driver.get("http://localhost:8088/verydows/index.php")
# 调用注册的方法
reg.register1(driver,datas)
expectValue = driver.find_element_by_xpath('//*[@id="register-form"]/div/dl[4]/dd/span/font').text
self.assertEqual(aa["expected"], expectValue, "预期结果和实际结果不一致")
driver.quit()
if __name__ == "__main__":
unittest.main()
- ExcelUtil模块的代码如下:
#这个模块的作用是将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]] = str(values[x])
r.append(s)
j+=1
return r
def list_data(self):
if self.rowNum <= 1:
print("总行数小于1")
else:
r = []
j=0
for i in range(self.rowNum-1):
s = []
# 从第一行取对应values值
values = self.table.row_values(j)
# print(values)
k = 0
for x in range(self.colNum):
s.append(str(values[x]))
r.append(s)
j+=1
return r
if __name__ == "__main__":
filepath = r"C:\XXX\regRepassword.xls"
#sheetName = "Sheet1"
data = ExcelUtil(filepath, "regRepassword").dict_data()
print(data)
- 如果你使用字典,那么自动化用例数据如下:
- 如果你使用列表,则不用写第一行就行