什么是数据驱动
当我们的测试脚本都是重复的,只有输入的数据变化时,每次更换一个数据执行,都要写一个测试脚本,这样会使我们的代码显得特别乱,特别冗余。
如果我们使用数据驱动,那么只用写一个脚本,在脚本执行的时候,他会自己不断更新数据。简单理解为:数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。
数据驱动ddt可以实现测试数据与测试脚本的分离,通过ddt来将测试数据加载到脚本中。采用数据驱动设计模式使一组数据对应一个测试用例,用例自动加载生成。
unittest测试框架下面没有数据驱动,所以在使用unittest框架的时候,还要使用数据驱动,就必须先下载安装ddt。
在cmd中先检查之前有没有下载过数据驱动:pip show ddt
当显示show 不是内部命令的时候,可以使用pip.exe show ddt
(可能需要升级一下pip的版本)
当显示没有安装过,直接使用下面的命令进行安装pip install ddt
测试用例,必须以test_开头,在执行测试脚本的时候,会自动执行,不以test_开头的脚本必须要调用才会执行。
使用ddt时,必须引入ddt的包from ddt import ddt,file_data,unpack,data
增加ddt数据的3种方式:
- @data(“王一博”,“Lisa”,“阿里巴巴”)
- @file_data(‘test_baidu_data.json’) test_baidu_data.json数据传入进去,可以一次性添加许多个不同的数据
- @data([“林俊杰”,“林俊杰_百度搜索”],[“王俊凯”,“王俊凯_百度搜索”])
@unpack —传递的是复杂的数据结构时使用。比如使用元组或者列表,添加unpack之后,ddt会自动把元组或者列表对应到多个参数上。
为了创建数据驱动测试,需要在测试类上使用 @ddt 装饰符,在测试方法上使用 @data 装饰符。@data 装饰符可以把参数当做测试数据,参数可以是单个值,列表,元组,字典,对于列表和元组,需要使用 @unpack 装饰符把元组和列表解析成多个参数,让其测试数据与测试预期结果之间一一对应。
from selenium import webdriver
import unittest
import time
import os,sys
from selenium.common.exceptions import NoAlertPresentException
from ddt import ddt,file_data,unpack,data
@ddt
class testCase1(unittest.TestCase):
def setUp(self) :
#初始化
self.driver=webdriver.Chrome()
self.url="https://www.baidu.com/"
self.driver.get(self.url)
self.driver.maximize_window()
time.sleep(3)
def tearDown(self):
#关闭浏览器
self.driver.quit()
#方法以test_开头都会默认去执行
#数据驱动ddt测试用例 1 数据和方法放在一块,混乱
# @data("王一博","Lisa","阿里巴巴")
#文件路径放在和测试脚本路径同级的文件夹下面
# @file_data('test_baidu_data.json')
#判断把内容搜索出来之后,和预期是否匹配
@data(["林俊杰","林俊杰_百度搜索"],["王俊凯","王俊凯_百度搜索"])
@unpack
#unpack的作用,每次传入两个以上的参数时将元素一一对应
def test_baidu1(self,value1,value2):
driver=self.driver
driver.find_element_by_id("kw").send_keys(value1)
driver.find_element_by_id("su").click()
time.sleep(6)
self.assertEqual(driver.title,value2,msg="搜索失败!!!")
time.sleep(6)
if __name__ == '__main__':
#参数verbosity=0表示打印出每一个测试用例的执行情况
unittest.main(verbosity=2)