学习python自动化——ddt数据驱动,与excel+unittest相结合

一、ddt(data driven tests)
    第三方库
二、安装:pip install ddt
  更新:pip install -U ddt
三、使用场景
  如果一个接口所有逻辑都是一样的,只是请求的参数不一样
四、原理:解压,自动遍历
五:写法

#ddt写法
@ddt
class TestDemo(unittest.TestCase):
@data(*case_list)
def test_login(self,case):
pass
#相当于这种写法
for i in case_list:
def test_login(i):
pass

六、步骤
  1)读取测试用例:直接封装好handle_excel.py

from openpyxl import load_workbook

class HandleExcel:
def __init__(self,file_path,sheet_name):
self.file_name=file_path #因为后面需要用到file_path,所以这里将file_path定义成实例属性
self.work_book=load_workbook(filename=self.file_name) #初始化表格对象(打开表格)
self.sheet=self.work_book[sheet_name] #初始化sheet对象(选择sheet表)

#获取所有测试数据和表头
def __get_all_data(self):
all_data=list(self.sheet.iter_rows(values_only=True)) #读取表全部数据
#print(list(all_data))
title=all_data[0] #获取表头
case_datas=all_data[1:] #获取测试用例
return title,case_datas

#数据拼接
def get_case_data_dict(self):
case_list=[] #定义一个list容器
title,case_datas=self.__get_all_data() #获取title,case_datas数据
for val in case_datas: #循环取case_datas里的数据
result=dict(zip(title,val)) #用zip函数将title,case_datas的数据打包成dict
case_list.append(result) #将打包成的数据放入case_list容器中
return case_list

#保存测试结果到excel
def write_result(self,rows,column,result=None):
self.sheet.cell(row=rows,column=column).value=result
self.__save_excel()
self.__close_excel()

#保存excel
def __save_excel(self):
self.work_book.save(filename=self.file_name)

#关闭excel
def __close_excel(self):
self.work_book.close()

  2)写测试用例

  3)通过ddt数据驱动加载测试用例到测试套件

  4)测试用例执行

  通过unittest运行测试用例

  5)对测试结果进行断言

  •     使用ddt库本身的ddt
import unittest
import ast
from ddt import ddt,data

from login import LoginCase
from handle_excel import HandleExcel

#获取测试用例
case_list=HandleExcel(file_path='testCase.xlsx',sheet_name='sheet1').get_case_data_dict()

#实例化业务逻辑
login=LoginCase()

#ddt解压,自动遍历
@ddt
class TestDemo(unittest.TestCase):
#因为没有前置条件和后置清理,所以初始化函数,后置清理函数都可以不写
@data(*case_list)
def test_login(self,case):
#业务逻辑
'''测试用例'''
#print(case)
res=login.user_login(url=case['url'],data=ast.literal_eval(case['data']))

# 获取响应结果
actual_data = {'code': res['code'], 'msg': res['msg']}

# 断言
self.assertEqual(first=ast.literal_eval(case['expected_data']),second=actual_data)
  •   使用unittestreport的ddt:这种方式优化了能够自动获取excel中的用例描述显示到测试报告的用例描述中
import unittest
import ast
from unittestreport import ddt,list_data   

from login import LoginCase
from handle_excel import HandleExcel

#获取测试用例
case_list=HandleExcel(file_path='testCase.xlsx',sheet_name='sheet1').get_case_data_dict()

#实例化业务逻辑
login=LoginCase()

#ddt解压,自动遍历
@ddt
class TestDemo(unittest.TestCase):
#因为没有前置条件和后置清理,所以初始化函数,后置清理函数都可以不写
@list_data(case_list)
def test_login(self,case):
#业务逻辑
'''测试用例'''
#print(case)
res=login.user_login(url=case['url'],data=ast.literal_eval(case['data']))

# 获取响应结果
actual_data = {'code': res['code'], 'msg': res['msg']}

# 断言
self.assertEqual(first=ast.literal_eval(case['expected_data']),second=actual_data)

  6)生成测试报告

import unittest
import os
from unittestreport import TestRunner

#使用unittestreport生成测试报告
dir_path=os.path.dirname(__file__)
suite=unittest.defaultTestLoader.discover(start_dir=dir_path,pattern='case*.py')
runner=TestRunner(suite=suite,
filename='test_report_py39',
tester='芒果',
desc='39期柠檬班测试报告',
templates=1)
runner.run()
posted @ 2022-06-21 21:37  芒果93  阅读(502)  评论(0编辑  收藏  举报