Data-driven in Unit Test UnitTest

foreword


When designing use cases, some use cases are only different in the input of parameter data. For example, the operation process of the login function is the same. If the use case repeatedly writes the operation process, the amount of code will increase. Corresponding to this kind of test case with multiple sets of data, the data-driven design pattern can be used. A set of data corresponds to a test case, and the use case is automatically loaded and generated.


1. DDT introduction

1.1 what is ddt

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

1.2 Benefits of using ddt

Please refer to the 'Foreword' of this article

1.3 import ddt module

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

1.4 Four modes

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

2. ddt handles various types of data

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

2.1 Analyze the working principle of 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 test tuple data

2.2.1 Testing a single set of elements

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 Testing multiple sets of undecomposed elements

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 Testing multi-group decomposition elements

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 test list data

2.3.1 Multi-group list split data

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 Complex lists (including dictionaries) split data

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 test multiple sets of dictionary data

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 test dictionary list data combination

    在实际应用中会存在数据比较多的情况,如果都直接把数据传入@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 test read file data

数据格式必须为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 data

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

Guess you like

Origin blog.csdn.net/qq_44954371/article/details/126530570