要使用ddt首先先安装ddt模块:pip install ddt。ddt数据驱动只能适用于unittest子类的类装饰器。
单个参数参数化:
from ddt import ddt,data,unpack import unittest from selenium import webdriver import time search_data = ('selenium', 'pytest', 'python') #单个参数 @ddt class testDDT(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://www.baidu.com/') # todo 把数据改成变量存储运行时,需要在前面加* @data(*search_data) def testddt(self, data): self.driver.find_element_by_css_selector('#kw').send_keys(data) self.driver.find_element_by_css_selector('#su').click() def tearDown(self): time.sleep(3) self.driver.quit() if __name__ == '__main__': unittest.main()
上面这段代码在搜索百度的时候,会搜索3次,分别搜索selenium, pytest, python。同一段代码,代码不变,数据在变。提高了代码的复用性。
说下@ddt和@data这2个装饰器分别表示什么意思。
@ddt固定写法,这个不用纠结,使用ddt要在类上面加个装饰器@ddt,加了装饰器你才能使用ddt里面的方法。
@data装饰我们的测试方法 ,可以理解为一个for循环,循环遍历元组里面每个数据 ,然后依次传递给被装饰的方法的一个参数,有几条数据 就执行几次用例
@unpack自动拆包data里面的数据
多个参数参数化:
from ddt import ddt,data,unpack import unittest from selenium import webdriver import time testData = (["selenium","pytest"],["python","yield "]) #多个参数 @ddt class testDDT(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://www.baidu.com/') # todo 把数据改成变量存储运行时,需要在前面加* @data(*testData) @unpack def testddt(self, data1,data2): self.driver.find_element_by_css_selector('#kw').send_keys(data1,data2) time.sleep(1) self.driver.find_element_by_css_selector('#su').click() def tearDown(self): time.sleep(1) self.driver.quit() if __name__ == '__main__': unittest.main()