通过ddt 执行数据驱动测试
1.主要用途:
相同的测试脚本使用不同的测试数据来执行,将测试数据和测试行为完全分离,减少代码冗余。
2.ddt用法
(1) 在测试类 TestDemo 前声明使用 ddt (@ddt.ddt)
(2) 在测试方法前使用@ddt.data()添加该测试方法需要得测试数据,@ddt.data接受一个可迭代的类型,以此来判断需要执行的次数。
(3) 最后使用@unpack 进行修饰,也就是在测试方法被调用过程中,对测试数据进行解包,将每组测试数据中的第一个数据传给 testdata 形参,将每组测试数据中的第二个测试数据传给 expectdata 形参。
3.实践
先创建一个csv文件,内容如下,内容大意是:作品----相关人物的关系
coding吧:对代码中测试类中参数进行介绍,是根据rows来进行映射得到的,具体理解请看代码
testdata数据:神奇动物在哪里,疯狂动物城,大话西游之月光宝盒
expectdata数据:叶茨,古德温,周星驰
本代码主要目的:控制浏览器打开百度,在百度框搜索框中输入:testdata,然后在得到的页面结果中查找是否有expectdata的数据
#-*-coding:GBK -*-
import csv
from selenium import webdriver
import unittest
from time import sleep
import ddt
def get_csvdata(file_name): #读取csv文件,将每行数据存储到rows这个列表中
rows=[]
data_file=open(file_name,"r")
reader=csv.reader(data_file)
for row in reader:
rows.append(row)
return rows
@ddt.ddt
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(self):
self.driver=webdriver.Firefox()
@ddt.data(*get_csvdata("testdata.csv"))#读取rows中的数据,
@ddt.unpack #将列表中,每一个数据,来进行实参与形参的映射。
def test_data(self,testdata,expectdata): #这是一个测试函数。访问百度首页,这里用了webdriver.
url="https://www.baidu.com"
self.driver.get(url)
self.driver.implicitly_wait(10)
try:
self.driver.find_element_by_id("kw").send_keys(testdata)
self.driver.find_element_by_id("su").click()
sleep(3)
self.assertTrue(expectdata in self.driver.page_source)
except Exception as msg:
print(msg,testdata,expectdata)
@classmethod
def tearDownClass(self):
self.driver.quit()
if __name__=='__main__':
unittest.main()
效果
程序会根据从rows中获取的数据一行行执行。我这个csv中三行数据,所以就执行3次
---
------------------好久之前就该总结的了,一直没时间,现在简单记录一下。----------------------