【python学习总结7】python的ddt数据驱动

一:数据驱动ddt

DDT:Data Driver Tests

数据驱动ddt可以实现测试数据与测试脚本的分离,通过ddt来将测试数据加载到脚本中。采用数据驱动设计模式使一组数据对应一个测试用例,通过数据的改变从而驱动自动化测试的执行。既能减少代码量,也能降低代码的维护成本。

ddt 是第三方模块,需安装:

pip install ddt

官网:https://ddt.readthedocs.io/en/latest/

二:DDT包含类的装饰器ddt和方法装饰器data

通常情况下,data中的数据按照一个参数传递给测试用例,如果data中含有多个数据,如元组,列表,字典等数据,需要自行在脚本中对数据进行分解或者使用unpack分解数据。

@ddt 类装饰器,用来标记当前类使用ddt数据驱动

@data 函数装饰器,用来给函数传递数据

@unpack 函数装饰器,用来对传递的数据进行解包,解列表、元组、字典

@file_data 函数装饰器,用来直接读取yaml,json格式的文件数据 读取获取的数据是字典列表

三:案例

3.1直接在脚本文件中获取测试数据

@data(a,b)

那么a和b各运行一次用例

@data([a,b],[c,d])

如果没有@unpack,那么[a,b]当成一个参数传入用例运行

如果有@unpack,那么[a,b]被分解开,按照用例中的两个参数传递 

import unittest
from ddt import ddt, data, unpack

case_data = [{"url": "www.baidu.com", "data": "test1"},
             {"url": "www.baidu.com", "data": "test2"},
             {"url": "www.baidu.com", "data": "test3"}]


@ddt
class TestDemo(unittest.TestCase):
    @data(*case_data) #在测试函数上使用@data(*case_data)进行数据解压,然后每一个元素传入测试函数
    def test_case(self, case):
        print(case)

运行结果:
Ran 3 tests in 0.005s

OK
{‘url’: ‘www.baidu.com’, ‘data’: ‘test1’}
{‘url’: ‘www.baidu.com’, ‘data’: ‘test2’}
{‘url’: ‘www.baidu.com’, ‘data’: ‘test3’}

import unittest
from ddt import ddt, data, unpack


@ddt
class MyTesting(unittest.TestCase):

    @data([1, 2, 3])  #没有@unpack,那么当成一个参数[1, 2, 3]
    def test_1(self, value):
        print(f'test_1:value={value}')

    @data(4,5,6)  #三个元素4,5,6
    def test_2(self, a):
        print(f'test_2:a={a}')

    @data([3, 2, 1], [5, 3, 2], [10, 4, 6])
    @unpack  #有@unpack,那么分解成3个参数传入用例运行:3, 2, 1是3个参数
    def test_minus(self, a, b, expected):
        actual = int(a) - int(b)
        expected = int(expected)
        self.assertEqual(actual, expected)

    @data([2, 3], [4, 5])  #没有@unpack,那么当成一个参数:[2, 3]是一个参数,[4, 5]是一个参数
    def test_compare(self, a):
        print(f'test_compare:a={a}')


if __name__ == '__main__':
    unittest.main(verbosity=2)

执行结果为:

3.2从yml文件中获取测试数据

在testdata package下新建testdata1.yml文件,文件中写入测试数据如下:

#格式要求:
#"-"表示一个列表
#用tab键缩进

-
  name: 'testyy'
  age:  18

-
  name: 'testzz'
  age:  20

test_ddt.py文件中修改测试代码如下:

import unittest
import ddt  # 导入ddt
import yaml

@ddt.ddt  # 声明我们要用它
class Test_ddt(unittest.TestCase):

    def setUp(self):
        print("Before every test case!")

    @ddt.file_data("..\\testdata\\testdata1.yml") #括号里写yml文件的相对路径
    def test_002(self,name,age):
        print('name is:' +str(name))
        print('age is:' + str(age))

if __name__ == '__main__':
    unittest.main()

执行结果为:

可以看到yml文件中我们定义了2组数据,用例总共执行了2次,按顺序每次取一组数据作为入参。

3.3从json文件中获取测试数据

在testdata package下新建testdata2.json文件,文件中写入测试数据如下:

{
   "student1": {
       "name": "小明",
       "age": 12
   },
   "student2": {
       "name": "小张",
       "age": 20
   }
}

test_ddt.py文件中修改测试代码如下:

import unittest
import ddt  # 导入ddt
import yaml

@ddt.ddt  # 声明我们要用它
class Test_ddt(unittest.TestCase):

    def setUp(self):
        print("Before every test case!")

    @ddt.file_data("..\\testdata\\testdata2.json")#括号里写json文件的相对路径
    def test_003(self,name,age):
        print("name is:"+str(name))
        print("age is:" +str(age))

if __name__ == '__main__':
    unittest.main()

执行结果为:

综上,从脚本文件中直接获取测试数据、从yml文件获取测试数据、从Json文件获取测试数据,应该已经可以满足自动化测试需要了。

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DDT(Data Driver Tests)是一种数据驱动测试的方法。在Python中,可以使用ddt库实现数据驱动。安装ddt库可以使用pip install ddt命令。使用@ddt注解可以将测试类标记为数据驱动测试类。使用@data(*case_data)注解可以对测试函数进行数据解压,将每个元素传递给测试函数作为参数。ddt库还提供了@unpack注解,用于将元组或列表中的元素按顺序传递给测试函数的参数。下面是一个使用ddt进行数据驱动的示例代码: ```python from ddt import ddt, data, unpack import unittest case_data = [(1, 2, 3), (4, 5, 9), (7, 8, 15)] @ddt class TestDataDriven(unittest.TestCase): @data(*case_data) @unpack def test_addition(self, a, b, expected_result): result = a + b self.assertEqual(result, expected_result) if __name__ == '__main__': unittest.main() ``` 在上述代码中,我们使用了ddt库的@ddt注解将测试类TestDataDriven标记为数据驱动测试类。使用@data(*case_data)注解将每个元组中的元素作为参数传递给测试函数test_addition。使用@unpack注解将元组中的元素按顺序传递给测试函数的参数a、b和expected_result。在测试函数中,我们执行了一个加法操作,并使用self.assertEqual()断言来验证结果是否符合预期。 通过这种方式,我们可以轻松地实现数据驱动的测试,并在多组测试数据上运行相同的业务逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python自动化之-DDT数据驱动](https://blog.csdn.net/qq_37982823/article/details/121662033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [python数据驱动-ddt](https://blog.csdn.net/pangbianlaogu/article/details/80261730)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值