18、ddt数据驱动(处理数据的模型)

一、@ddt    处理字典   test_data = [[1, 2], [4, 5, 6]]

# ddt   ddt+unitteat来进行数据的处理  第三方库
# 装饰器  会在你的函数之前运行 不会改变代码的结构
import unittest
from ddt import ddt, data, unpack

test_data = [[1, 2], [4, 5, 6]]


# 装饰测试类
@ddt
class TestMath(unittest.TestCase):

    @data(test_data)
    def test_print_data1(self, a):  # 测试用例
        print("a:", a)

    # 脱外套*test_data  自动拆分为1,3
    @data(*test_data)  # 装饰测试方法 拿到几个数据 就执行几条用例
    def test_print_data2(self, b):  # 测试用例
        print("b:", b)

    @data(*test_data)
    #不定长输出,针对于两个返回值长度不相等的情况 test_data = [[1, 2], [4, 5, 6]]
    def test_print_data3(self, *a):  # 测试用例
        print("不定长输出:", a)

    @data(*test_data)
    #如果unpack后的参数少于5个 推荐使用unpack  要注意参数不对等的情况,提供对应个数的参数来接收这个变量
    @unpack
    def test_print_data4(self, a=None, b=None, c=None):  # 测试用例
        print("a:", a)
        print("b:", b)
        print("c:", c)

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

二、@ddt   处理列表嵌套字典

import unittest
from ddt import ddt, data, unpack

#列表嵌套字典
test_data = [{"no":1,"name":"xinxin"},{"no":2,"name":"binbin"}]


# 装饰测试类
@ddt
class TestMath(unittest.TestCase):

    @data(*test_data)
    def test_print_data1(self, a):  # 测试用例
        print("no:", a['no'])
        print("name:", a['name'])

    @data(*test_data)
    #如果你要对字典进行Unpack  参数名与你的字典key对应
    @unpack
    def test_print_data2(self, no , name):  # 测试用例
        print("no:", no)
        print("name:",name)



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

三、ddt+Unittest+excel的结合使用

a.请求函数

import requests

class HttpRequest():
    def http_request(self, url, data, method, cookie=None):
        if method.lower() == "get":
            # verify=False忽略证书  ssl
            res = requests.get(url, data, cookies=cookie, verify=False)
            return res
        elif method.lower() == "post":
            res = requests.post(url, data, cookies=cookie, verify=False)
            return res  # 返回的是一个消息实体
        else:
            raise  Exception('不支持的请求')

b.存在依赖关系,编写反射函数 

class GetData:
    Cookie = '小郭'

setattr(GetData,'Cookie','小黄')
print(GetData.Cookie)

c.读取excel函数

from openpyxl import load_workbook

class DoExcel:
    def __init__(self,file_name,sheet_name):
        self.file_name=file_name
        self.sheet_name=sheet_name


    def get_header(self):
        """
        获取第一行的标题行
        """
        wb=load_workbook(self.file_name)
        sheet=wb[self.sheet_name]
        #存储标题行
        header=[]
        for j in range(1,sheet.max_column+1):
            header.append(sheet.cell(1,j).value)
        return header



    def get_data(self):
        """
        根据嵌套循环读取数据

        """
        wb=load_workbook(self.file_name)
        sheet=wb[self.sheet_name]

        #拿到的header 是一个列表  索引是从0开始的
        header=self.get_header()
        test_data=[]

        for i in range(2,sheet.max_row+1):
            sub_data = {}
            sub_data['url'] = url = sheet.cell(i, 4).value

            sub_data['data'] = data = sheet.cell(i, 5).value

            sub_data['http_method'] = method = sheet.cell(i, 6).value

            sub_data['expected'] = expected = sheet.cell(i, 7).value
            test_data.append(sub_data)

        #返回获取到的数据
        return test_data



if __name__ == '__main__':
    print(DoExcel(r"D:\PycharmProjects\class_01\testcase_02\test.xlsx",'test').get_data())

d.测试用例

import unittest
from ddt import ddt,data,unpack
from testcase_01.test_http import HttpRequest
from testcase_01.test_reflect import GetData
from testcase_02.do_excel import DoExcel

test_data = []
t=DoExcel(r"D:\PycharmProjects\class_01\testcase_02\test.xlsx", 'test').get_data()


@ddt
class TestHttp(unittest.TestCase):
    def setUp(self):
        print("我已经开始测试用例了")

    #内部装饰器,对数据进行遍历、拆分,传给测试用例
    @data(*test_data)
    def test_api(self,item):
            res = HttpRequest().http_request(eval(item['url']), eval(item['data']), item['http_method'],getattr(GetData,'Cookie'))
            if res.cookies:
                setattr(GetData, 'Cookie', 'res.cookies')
            try:
                self.assertEqual(str(item['expected']), res.json()['code'])
            except Exception as e:
                print("test_api's error is {0}".format(e))
                raise e
            print(res.json())

    def tearDown(self):
        print("我已经执行完毕测试用例了")

c.测试报告

# ..成功  F失败 1代码错误
import unittest
import HTMLTestRunner
import time
from testcase_01.test_case import TestHttp  # 具体到类名
from testcase_02.do_excel import DoExcel


#当使用ddt,不能用实例方式去加载用例,这样数据传不进去,我们只需要等待ddt把数据加载之后,再通过模块发现就可以了
suite = unittest.TestSuite()  # 存储用例
loader = unittest.TestLoader()
suit.addTest(Loader.loadTestsFromTestCase(TestHttp))
    

if __name__ == "__main__":
    time1 = time.strftime("%Y-%m-%d %H-%M-%S")
    name1 = time1 + "report.html"

with open(name1, 'wb') as file:
    runner = HTMLTestRunner.HTMLTestRunner(
        stream=file,
        title="单元测试报告",
        description="测试用例执行统计1",
        verbosity=2
    )
    runner.run(suite)

四、学习总结

#两种unittest+excel   1)超继承 2)ddt

#unittest 单元测试 通过单元测试 实现对自己写的类的测试

#TestCase    self.assert异常处理

#类

#参数化  %80  EXCEL  openpyxl

#写成类  方法一、方法二、方法三



#超继承---》原理要懂    DDT---》推荐使用

 

你可能感兴趣的:(软件测试之python篇,python)