Python 数据驱动之ddt

前面简单介绍了unittest框架收集与执行测试用例;回顾一下登录用例的代码,如下:

import unittest#导入模块
from Test_login.login import login#导入被测文件
class TestLogin(unittest.TestCase):#定义测试类继承unittest.TestCase类
    def setUp(self):#执行每条用例前都会执行
        print('每条用例执行前的前置条件')
    @classmethod
    def setUpClass(cls):#类方法,整个测试类只执行一次前置
        print('只执行一次的前置条件')
    @classmethod
    def tearDownClass(cls):
        print('只执行一次的后置条件')#类方法,整个测试类执行一次的后置
    def tearDown(self):
        print('每条用例执行后的后置条件')#执行每条用例以后都会执行

    def test_login_success(self):#登录成功用例
        username='admin'
        password='123456'
        login(username,password)
        expected_result={'msg':'登录成功'}#预期结果
        actual_result=login(username,password)#调用被测函数
        self.assertTrue(expected_result==actual_result)#判断预期结果与实际结果是否一致
    def test_login_error(self):#账号或密码错误用例
        username='ADMIN'
        password='456789'
        expected_result={'msg':'账号或密码不正确'}#预期结果
        actual_result=login(username,password)
        self.assertTrue(expected_result==actual_result)
    def test_login_empty(self):#账号或密码为空用例
        username=''
        password=''
        expected_result={'msg':'账号或密码为空'}#预期结果
        actual_result=login(username,password)
        self.assertTrue(expected_result==actual_result)
if __name__=='__main__':
    unittest.main()


发现每个用例方法除了数据不同之外都是一样的,这时候就可以定义一个函数,传入不同的数据就可以代替这些用例方法,以减少代码的重复性;所以需要把数据分离出来,写在excel表格里,通过openpyxl第三方模块去操作excel,拿到想要的数据(上一篇已经写过);
但是如果有多个模块的用例放在excel不同的Sheet里面,那每个用例.py文件里面都需要去重新写一遍获取excel数据的代码。所以为了减少代码量提高代码的复用性这里先把操作excel的方法封装起来,如下:

import openpyxl

class ExcelMethod:
    def __init__(self,filepath,sheet):
        self.filepath=filepath
        self.sheet=sheet

    def open_excel(self):#打开文件
        workbook=openpyxl.load_workbook(self.filepath)
        self.workbook=workbook
        return workbook
    def get_sheet(self):#获取表单
        sheet=self.open_excel()[self.sheet]
        return sheet
    def get_case(self):#获取数据
        rows=list(self.get_sheet().rows)
        case_list=[]
        title_list=[]
        for title in rows[0]:
            title_list.append(title)
        for row in rows[1:]:
            dic={}
            for idx,val in enumerate(row):
                dic[title_list[idx]]=val.value
            case_list.append(dic)
        return case_list
    def write_excel(self,row,column,data):#写入数据
        sheet = self.get_sheet()
        sheet.cell(row,column).value=data
        self.excel_save()
        self.excel_close()

    def excel_save(self):#保存excel
        self.workbook.save(self.filepath)

    def excel_close(self):#关闭excel

        self.workbook.close()

在获取数据的时候导入ExcelMethod类,调用里面的方法就行了。

但是用例的方法如何获取这些数据呢?就需要用到第三方模块ddt(data dirven testing),数据驱动测试。

首先安装
pip install ddt

ddt主要包含的组件:
@ddt :用于继续了unittest.TestCase的类装饰器,
@data() :测试类里面的用例方法装饰器,传入测试数据,可以是列表,元组,字典。
使用方法如下:

import ddt
@ddt.ddt
class TestLogin(unittest.Testcase):
	pass
	@ddt.data(*case)#这里要使用*,因为入参是不定长参数。ddt会自行把数据分解成组形式,每一组即一个用例
	def test_login(self,case):
		pass

最后来完善一下代码,目录如下:
在这里插入图片描述
登录用例:


from Testdemo.demo.login import login
from Testdemo.Methods.excel_method import ExcelMothed#导入封装好的ExcelMothed类
import unittest
import ddt
import os
from Testdemo.Methods.get_path import os_path
case_path=os_path('case.xlsx')
data=ExcelMothed(case_path,'Sheet1')#实例化
case=data.get_case()#调用ExcelMothed类里面的获取用例数据的方法

获取到的用例内容如下:
case=[
{'case_id': 1, 'module': '登录', 'title': '登录成功', 'data': "{'username':'admin','password':'123456'}", 'expected': "{'msg':'登录成功'}"}, 
{'case_id': 2, 'module': '登录', 'title': '登录失败', 'data': "{'username':'ADMIN','password':'123456'}", 'expected': "{'msg':'账号或密码不正确'}"}, 
{'case_id': 3, 'module': '登录', 'title': '登录失败', 'data': "{'username':None,'password':None}", 'expected': "{'msg':'账号或密码为空'}"}]

data.excel_close()#关闭excel

@ddt.ddt
class TestLogin(unittest.TestCase):#定义测试类继承unittest.TestCase类

    @ddt.data(*case)#分解数据得到每组用例,循环执行。
    def test_login(self,case):#登录成功用例方法
        info=eval(case['data'])
        username=info['username']
        password=info['password']
        expected_result=eval(case['expected'])#预期结果
        actual_result=login(username,password)#调用被测函数
        self.assertTrue(expected_result==actual_result)#判断预期结果与实际结果是否一致

注册用例:

from Testdemo.demo.register import register
from Testdemo.Methods.excel_method import ExcelMothed
from Testdemo.Methods.get_path import os_path
import ddt
case_path=os_path('case.xlsx')
data=ExcelMothed(case_path,'Sheet2')
case=data.get_case()
获取到的用例内容如下:
case=[
{'case_id': 1, 'module': '注册', 'title': '注册成功', 'data': "{'phone':'13800138000','code':'1234'}", 'expected': "{'mgs':'注册成功'}"}, 
{'case_id': 2, 'module': '注册', 'title': '注册失败', 'data': "{'phone':'1123456','code':'1234'}", 'expected': "{'mgs': '手机号或验证码错误'}"}, 
{'case_id': 3, 'module': '注册', 'title': '注册失败', 'data': "{'phone':None,'code':None}", 'expected': "{'mgs': '手机号或验证码为空'}"}]
data.excel_close()

import unittest
@ddt.ddt
class TestRegister(unittest.TestCase):
    @ddt.data(*case)
    def test_register(self,case):
        info=eval(case['data'])
        phone=info['phone']
        code=info['code']
        expect_result=eval(case['expected'])
        actual_result= register(phone, code)
        self.assertTrue(expect_result==actual_result)

执行结果:
在这里插入图片描述
功力不够,写的有点low!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久醉绕心弦,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值