DDT传递数据文件

本文介绍如何使用数据驱动测试(DDT)框架进行不同类型的测试数据传递,包括从txt和yaml文件中读取单一及多个参数,并展示了具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、传递txt文件(单一参数)

import unittest
from ddt import *

def read_phohe():
    """
    读取phone.txt文件中的电话号码数据
    :return:返回一个手机号列表
    """
    li = []
    with open("phone.txt", "r", encoding="utf-8") as f:
        for line in f.readlines():
            li.append(line.strip("\n"))  # strip()用于移除字符串头尾指定的字符

    return li

@ddt
class TestCase(unittest.TestCase):

    @data(*read_phohe())
    def test_01(self, phone):
        print("手机号为", phone)

    # 测试是否能读取电话号码
    @unittest.skip
    def test_02(self):
        li = read_phohe()
        print(li)

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

执行结果
在这里插入图片描述

当传的数据是通过变量的方式,如元组2、列表2,变量前需要加上*

二、传递txt文件(多个参数)

import unittest
from ddt import *

@ddt
class TestDemo1(unittest.TestCase):

    @unittest.skip
    def test_03(self):
        res = read_userdata()
        print(res)  # [['admin', '123456'], ['sniper', '123456'], ['root', '123456']]

    @data(*read_userdata())
    @unpack
    def test_04(self, username, password):
        print(f"账号为:{username},密码为:{password}")


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

执行结果
在这里插入图片描述

三、传递Yaml文件(单一参数)

  1. 创建yaml文件
- 15912345678
- 17612345678
- 18512345678
from ddt import *
import unittest

@ddt
class TestRead(unittest.TestCase):

    @file_data("phone.yaml")
    def test_01(self, phone):
        print("手机号为:", phone)

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

执行结果为
在这里插入图片描述

四、传递yaml文件(多个参数)

1、数据文件中的key和程序测试方法的入口参数必须同名(推荐使用这个方法定义数据

-
  username: admin
  password: 123456
-
  username: sniper
  password: 123456
-
  username: root
  password: 666666
import unittest
from ddt import *

@ddt
class TestCall(unittest.TestCase):

    # file_data在处理多个参数传递需求的时候,无法满足需求,就算加上unpack也不能自动解包
    # 在yaml数据文件中采用对象的定义方式来定义数据内容
    # 数据文件中的key和程序测试方法的入口参数必须同名
    @file_data("userdata.yaml")
    # @unpack
    def test_02(self, username, password):
        print("用户登录姓名和密码为:", username, password)


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

执行结果
在这里插入图片描述

2.如果key和入口参数不一致

-
  name: admin
  pwd: 123456
-
  name: root
  pwd: 666666
import unittest
from ddt import *

@ddt
class TestCall(unittest.TestCase):
 
    # 如果key和入口参数不一致
    @file_data("userdata2.yaml")
    def test_03(self, **userdata):  # *传递列表类型可变参数;**传递字典类型可变参数
        username = userdata["name"]
        password = userdata["pwd"]
        print("测试用户登陆流程:", userdata, type(userdata))
        print(f"测试用户姓名为:{username},密码为:{password}")


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

执行结果
在这里插入图片描述

### 如何使用 `ddt` 方法从 CSV 文件中读取数据 为了实现基于CSV文件的数据驱动测试,通常会结合第三方库来处理CSV文件中的数据并将其递给测试函数。然而,值得注意的是,`ddt` 庘默认仅支持 JSON 和 YAML 格式的外部数据源[^3]。 对于CSV文件的支持,则需额外编写辅助代码完成转换工作。下面是一个具体的解决方案: #### 解决方案概述 通过自定义函数解析CSV文件内容,并将每一行作为参数列表入到被测函数中去。这可以通过继承或扩展 `ddt` 的功能来达成目标。 #### 实现细节 1. **安装必要的依赖** 确保已经安装了 `pandas` 或者标准库中的 `csv` 模块用于读写CSV文件;以及 `ddt` 本身用于执行数据驱动测试。 ```bash pip install pandas ddt ``` 2. **创建一个工具函数加载CSV数据** 此函数负责打开指定路径下的CSV文件并将其中的内容转化为适合 `@data` 装饰器使用的格式。 ```python import csv from typing import List, Tuple def load_csv(file_path: str) -> List[Tuple]: with open(file_path, newline='') as csvfile: reader = csv.reader(csvfile) next(reader) # Skip header row if exists. return [tuple(row) for row in reader] ``` 3. **应用 `ddt` 进行单元测试** 利用上述定义好的 `load_csv()` 函数,在测试类里调用它获取实际要用来做参数化的数据集。 ```python import unittest from ddt import ddt, data @ddt class TestCsvDriven(unittest.TestCase): @classmethod def setUpClass(cls): cls.test_cases = load_csv('path/to/your/test_data.csv') @data(*cls.test_cases) def test_example(self, value_tuple): input_value, expected_output = value_tuple[:len(value_tuple)//2], value_tuple[len(value_tuple)//2:] result = some_function_being_tested(input_value) self.assertEqual(result, expected_output) if __name__ == '__main__': unittest.main() ``` 以上代码片段展示了如何构建一个简单的框架以便于从CSV文件中导入测试案例,并应用于自动化测试场景之中[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值