目录
数据驱动测试是自动化测试中的主流设计模式之一。
相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动。
DDT概述
DDT(Data-Driven Tests)是针对unittest单元测试框架设计的扩展库。
允许使用不同的测试数据来运行一个测试用例,并将其展示为多个测试用例。
安装
pip install ddt
如何使用
1. 测试类需要通过@ddt装饰器进行装饰,声明要使用ddt
2. 方法装饰器:
@data用于直接添加测试数据;(@data接收一个可迭代的类型,以此来判断需要执行的次数)
@file_data参数为文件名,为测试方法提供存放在文件里的测试数据。
@unpack是在测试方法被调用过程中,对测试数据进行解包,将每组测试数据中的数据分别传给测试方法中对应的形参。
3. 直接定义测试数据时,有不同形式的参数化。
4. DDT同样支持数据文件的参数化,它封装了数据文件的读取。
如何定义测试数据
多组测试数据之间以逗号隔开。如果每组数据存在多个测试数据,需要将每组数据存于列表/元组中,每组数据中的数据与测试方法中的形参个数及顺序一一对应。
如下方代码中所示,第一种直接定义了两条测试数据
@data(
'selenium',
'python'
)
第二种为列表形式。
@data(
['case1','selenium'],
['case2','python']
)
第三种为元组形式。
@data(
('case1', 'selenium'),
('case2', 'python')
)
第四种为字典形式。字典的key要与测试方法的参数名称保持一致。
@data(
{'search_key': 'selenium'},
{'search_key': 'python'}
)
注意:当测试数据参数化使用复杂的数据结构时,如列表、元组、字典,需要在测试方法前加装饰器@unpack。
使用示例
数据参数化
创建test_ddt.py文件
from selenium import webdriver
from time import sleep
import unittest
from ddt import ddt,data,unpack,file_data
@ddt
class TestBaidu(unittest.TestCase):
#前置条件:所有用例执行前打开百度
@classmethod
def setUpClass(cls) -> None:
cls.driver = webdriver.Chrome()
cls.driver.get('https://www.baidu.com')
#后置条件:关闭浏览器
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
def search(self,text):
self.driver.find_element_by_id("kw").clear()
self.driver.find_element_by_id("kw").send_keys(text)
self.driver.find_element_by_id("su").click()
sleep(5)
return self.driver.find_element_by_id('1').text #返回第一条搜索结果的内容
# 参数化:只有测试数据
@data(
'selenium',
'python'
)
def test_search1(self, search_key):
search_result = self.search(search_key)
self.assertIn(search_key, search_result)
#参数化:列表形式(用例名+数据)
@data(
['case1','selenium'],
['case2','python']
)
#unpack传递的是复杂的数据结构时使用
@unpack
def test_search2(sel