单元测试UnitTest中的数据驱动

前言


在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程是一样的。如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一个测试用例,用例自动加载生成


一. ddt介绍

1.1 ddt是什么

ddt:data driver tests ,数据驱动测试,是一种单元测试框架

1.2 使用ddt的好处

请参考本文章的 '前言'

1.3 导入ddt模块

ddt属于第三方模块,需要安装,安装方法:
方法一:在cmd命令窗口中输入:pip install ddt
方法二:pycharm中打开终端,输入:pip install ddt

1.4 四种模式

ddt要与unittest单元测试框架一起结合使用
@ddt 引入ddt模块
@data 导入数据
@unpack 拆分数据
@file_data导入外部数据

二.ddt处理各种类型数据

需注意以下几点:
1.使用ddt模块要在测试类前用@ddt进行修饰
2.要导入测试数据需在测试用例(以test_开头的方法)前用@data修饰
3.若需对测试数据进行拆分需用@unpack修饰
4.若需导入外部数据需用@file_data修饰

2.1 分析ddt工作原理

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块
@ddt  #引入ddt模块
class TestDdt(unittest.TestCase):
    @data(1,2,"jack")   #导入数据
    def test_single_element(self, value):
        print(value)
if __name__ == '__main__':
    unittest.main()
输出:1 2 jack
代码中@data(1,2,“jack”)传入了三个元素,故ddt自动生成了3个测试用用例。分别打印传入的数据

注意点:
	是不是发现了什么?对!对于没有使用ddt的测试用例来说,一个test_开头的测试方法一次只能
生成一个测试用例,但是!有了ddt之后,可以一次向测试方法中传入多个测试数据,而生成测试用例
的个数则是根据@data中传入的测试数据的元素个数而定的

2.2 ddt测试元组数据

2.2.1 测试单组元素

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块
@ddt  #引入ddt模块
class TestDdt(unittest.TestCase):
    @data(1,2,"jack")  #导入数据
    def test_single_element(self, value):
        print(value)
if __name__ == '__main__':
    unittest.main()
输出:1 2 jack

2.2.2 测试多组未分解元素

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块
@ddt  #引入ddt模块
class TestDdt(unittest.TestCase):
    @data((1,2,3),(6,7,8))  #导入数据
    def test_multiple_elements(self, value):
        print(value)
if __name__ == '__main__':
    unittest.main()

输出:
(1,2,3)
(6,7,8)

2.2.3 测试多组分解元素

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块
@ddt   #引入ddt模块
class TestDdt(unittest.TestCase):
    @data((1,2,3),(6,7,8))   #导入数据
    @unpack                  #拆分数据
    def test_single_element(self, value1,value2,value3):
        print(value1,value2,value3)
if __name__ == '__main__':
    unittest.main()
输出:1 2 3
     6 7 8

2.3 ddt测试列表数据

2.3.1 多组列表拆分数据

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块
@ddt
class TestDdt(unittest.TestCase):
    @data([1, 2, 3], [5, 6, 11])
    @unpack     #拆分数据
    def test_single_element(self, value1,value2,value3):
        print(value1,value2,value3)
if __name__ == '__main__':
    unittest.main()
  输出:1 2 3 4
      5 6 7 8  

2.3.2 复杂列表(包含字典)拆分数据

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块
@ddt
class TestDdt(unittest.TestCase):
    @data([{"username":"ljx","password":"123456"},{"addresss":"wuhan","phone":"152738748"}])
    @unpack
    def test_single_element(self, value,value1):
        print( value,value1)
if __name__ == '__main__':
    unittest.main()
输出:  
{"username":"ljx","password":"123456"},{"addresss":"wuhan","phone":"152738748"}

2.4 ddt测试多组字典数据

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块
@ddt
class TestDdt(unittest.TestCase):
    @data({"username": "ljx", "password": "123456"}, {"username": "wuhan", "password": "152738748"})
    @unpack
    def test_single_element(self, username,password):
        print( username,password)
if __name__ == '__main__':
    unittest.main()

输出:
ljx 123456
wuhan 152738748

2.5 ddt测试字典列表数据结合

    在实际应用中会存在数据比较多的情况,如果都直接把数据传入@data中会显得代码非常冗杂,
以包含多个字典的列表数据为例,可将包含多个字典的元素存放在一个列表变量中,在@data中传入
列表变量即可
import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块
@ddt
class TestDdt(unittest.TestCase):
    test_data = [{"username": "ljx", "password": "123456"},
                 {"username": "wuhan", "password": "152738748"},
                 {"username": "1", "password": "18"}]
    @data(*test_data)    #*test_data将test_data变量拆包成3个字典元素
    def test_single_element(self,value):
        print(value["username"],value["password"])
if __name__ == '__main__':
    unittest.main()


输出:
ljx 123456
wuhan 152738748
1 18

2.6 ddt测试读取文件数据

数据格式必须为json,且必须为双引号的键值对形式,如果不是json格式
import unittest
from ddt import ddt, data, unpack,file_data  # 根据需要导入相应的模块
@ddt
class TestDdt(unittest.TestCase):
    @file_data("../data/test.json")
    def test_single_element(self,value):
        print(value)
if __name__ == '__main__':
    unittest.main()
输出:jack
	13

test.json数据

{
  "name": "jack",  #必须用双引号
  "age": 13,
}

猜你喜欢

转载自blog.csdn.net/qq_44954371/article/details/126530570