相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动。
一、使用 ddt 执行数据驱动测试
1. 安装 ddt
(1) Pip install ddt
(2) 通过 pycharm 设置来安装,如图所示:
2. 设计一个简单的数据驱动测试
测试逻辑:
(1) 打开百度首页
(2) 在搜索框输入一个搜索关键词
(3) 单击搜索按钮
(4) 验证搜索结果页面是否包含预期关键字串,包含则认为测试通过,否则认为测试执行失败。
参考代码:
import unittest, time
from selenium import webdriver
import ddt
@ddt.ddt
class TestDemo(unittest.TestCase):
def serUp(self):
self.driver = webdriver.Firefox()
@ddt.data(["神奇动物在哪里","叶茨"],["疯狂动物城","古德温"])
@ddt.unpack
def tset_dataDrienByObji(self,testdata,expectdata):
url = "http://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()
time.sleep(3)
self.assertTrue(expectdata in self.driver.page_source)
except Exception as msg:
print(msg)
def terDown(self):
self.driver.quit()
if __name__=='__main__':
unittest.main()
代码解释:
(1) 在测试类 TestDemo 前声明使用 ddt (@ddt.ddt)
(2) 在测试方法前使用@ddt.data()添加该测试方法需要得测试数据,@ddt.data接受一个可迭代的类型,以此来判断需要执行的次数。
(3) 最后使用@unpack 进行修饰,也就是在测试方法被调用过程中,对测试数据进行解包,将每组测试数据中的第一个数据传给 testdata 形参,将每组测试数据中的第二个测试数据传给 expectdata 形参。
二、使用数据文件进行数据驱动
1、通过 csv 文件获取数据
结合前面的测试脚本,我们在@data 装饰附中使用外部的 csv 文件来换掉之前的测试数据。
(1) 利用 excel 建立数据文件,通过另存为建立 csvdata.csv 文件,内容为上例所用的测试数据。
(2) 编写 get_data()方法,其中包括路径、csv 文件名。这个方法调用 csv 库去读取文件并返回列表 rows,其内容为测试数据。函数代码如下:
def get_csvdata(file_name):
rows=[]
data_file=open(file_name,"r")
reader=csv.reader(data_file)
for row in reader:
rows.append(row)
return rows
(3) 用 get_data() 方法获取的数据提供给@ddt.data(),如下所示:@ddt.data(*get_csvdata("testdata.csv"))
2、通过 excel 获取数据
用 Excel 来维护测试数据是最常用的做法,这还可以帮助非技术人员很轻松地添加一行需要测试的数据。结合前面的测试脚本,我们在@data 装饰附中使用外部的 excel 文件来换掉之前的测试数据。
(1) 利用 excel 建立数据文件 exdata.xlsx 文件,内容如下图所示:
测试数据 | 断言结果 |
---|---|
神奇动物在哪里 | 叶茨 |
神奇动物在哪里 | 古德温 |
大话西游之月光宝盒 | 周星驰 |
(2) 读取 Excel 文件,需要安装 xlrd 库,安装命令如下:
Pip install xlrd Pycharm 下安装见上例
(3) 编写 get_xldata()方法,其中包括路径、excel 文件名。这个方法调用 xlrd 库去读
取文件并返回列表 rows,其内容为测试数据。
函数代码如下:
def get_xldata(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(list(sheet.row_values(row_idx,0,sheet.ncols)))
return rows
(4) 用 get_xldata() 方法获取的数据提供给@ddt.data(),如下所示:@ddt.data(*get_xldata("exdata.xlsx"))