Uinttest +excel结合使用--详细讲解

本文详细介绍了如何结合unittest、ddt和Excel进行单元测试。通过两种方式,即DDT参数化和超级继承,展示了如何从Excel读取数据并自动化测试。在DDT方式中,无法通过suite.addTest加载用例,而在超级继承方式中,通过初始化函数传参实现了用例加载。整个过程涵盖了数据加载、请求发送和断言检查等关键步骤。

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

Uinttest +excel结合使用--详细讲解 ----放到csdn上去哈
两种方式:1、超继续  2、ddt(推荐使用)

测试类:
unittest 单元测试,通过单元测试,实现对自己写的类的测试
TestCase  self.assert 异常处理


参数化:

    用Excel 写成类,有三种方法:
      1、excel 无表头,一次性加载所有数据
      2、excel无表头,使用的时候,再加载数据
      3、excel有表头,按表头去加载数据

一、使用DDT的方式

注意:使用ddt的话,不能通过【suite.addTest】--这种创建实例的方式加载用例

代码实现如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : test_suite.py
import HTMLTestRunner
import unittest

from ddt_excel.test_http import TestHttp


# 使用ddt的话,不能通过【suite.addTest】--这种创建实例的方式加载用例

suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestHttp))

# 执行用例
with open("test_summer.html", "wb") as file:
    testrunner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title=None, description=None)
    testrunner.run(suite)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : test_http.py
import unittest

from test_excel_case import GetData
from test_excel_case.http_request import HttpRequest
from ddt import ddt, data, unpack
from ddt_excel.do_excel import DoExcel

# test_data = DoExcel("test.xlsx", 'test').get_data()
test_data = DoExcel("test.xlsx", 'test').get_data([1, 2])


@ddt
class TestHttp(unittest.TestCase):
    def setUp(self):
        pass

    @data(*test_data)
    def test_api(self, item):
        res = HttpRequest().http_request(item['url'], item['data'], item['method'])
        if res.cookies:  # 如果cookie有的话,那么就更新cookie
            setattr(GetData, 'Cookie', res.cookies)  # 反射

        try:
            self.assertEqual(item['expected'], res.json()['code'])
        except AssertionError as e:
            print("test_api's error is {}".format(e))
            raise e
        print(res)

    def tearDown(self):
        pass
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : do_excel.py
from openpyxl import load_workbook


class DoExcel:
    def __init__(self, file_name, sheet_name):
        self.file_name = file_name
        self.sheet_name = sheet_name
        self.sheet_obj = load_workbook(self.file_name)[self.sheet_name]  # 获取一个表单对象

    def get_data(self, mode='all'):
        '''mode 控制是否执行所有的用例,默认值:all,为all就执行所有用例
        如果不等于all的话就进入分值判断
        mode,只能输入 all 、列表  这两种类型的参数
        '''
        wb = load_workbook(self.file_name)
        sheet = wb[self.sheet_name]
        test_data = []

        for i in range(2, sheet.max_row + 1):
            sub_data = {}
            sub_data['case_id'] = sheet.cell(i, 1).value
            sub_data['module'] = sheet.cell(i, 2).value
            sub_data['title'] = sheet.cell(i, 3).value
            sub_data['method'] = sheet.cell(i, 4).value
            sub_data['url'] = sheet.cell(i, 5).value
            sub_data['data'] = sheet.cell(i, 6).value
            sub_data['expected'] = sheet.cell(i, 7).value
            test_data.append(sub_data)
        print(test_data)

        # 根据mode的值去进行判断
        if mode == 'all':  # 执行所有用例
            final_data = test_data
        else:  # [1,2,3,4]和case_id
            final_data = []
            for item in test_data:  # 对test_data所有的用例进行遍历
                if item['case_id'] in mode:
                    final_data.append(item)

        print(final_data)
        return final_data  # 返回取到的数据


if __name__ == '__main__':
    DoExcel("test.xlsx", 'test').get_data()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : http_request.py

import requests

class HttpRequest:

    def http_request(self, url, data, method):
        headers = {'Content-Type': 'application/json;charset=UTF-8'}
        result = None
        if method.lower() == 'post':
            result = requests.request("POST", url, data=data, headers=headers)
        elif method.lower() == 'get':
            result = requests.request("GET", url, data=data, headers=headers)
        else:
            print("错误")

        return result
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : GetData.py


class GetData:
    Cookie = None

二、 超级继承方式

(这个使用的excel文件是没有带表头的)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/4/13 15:53
# @File    : test_suite.py
import HTMLTestRunner
import unittest

from test_excel_case.do_excel import DoExcel
from test_excel_case.test_http import TestHttp

# test_data = [{"url": "https://xxx.xx.com/xxxapi/login",
#               "data": {"username": "testlxm", "password": "testlxm"}, "expected": 1000, "method": "post"},
#              {"url": "https://xxx.xx.com/xxxapi/login",
#               "data": {"username": "testlxm", "password": "123456"}, "expected": 1000, "method": "post"}]

# 方法一:一次性将用例从exel中读取出来
test_data = DoExcel("test.xlsx", 'test').get_data()

suite = unittest.TestSuite()

# 实例的方式加载用例
for item in test_data:
    suite.addTest(TestHttp('test_api', item['method'], item['url'], item['data'],
                           item['expected']))

# 执行用例
with open("test_summer.html", "wb") as file:
    testrunner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title=None, description=None)
    testrunner.run(suite)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : test_http.py
import unittest

from test_excel_case import GetData
from test_excel_case.http_request import HttpRequest


class TestHttp(unittest.TestCase):
    def setUp(self):
        pass

    def __init__(self, methodName, method, url, data, expected): #通过初始化函数传参
        super(TestHttp, self).__init__(methodName)  # 父类的方法保留了
        self.url = url
        self.data = data
        self.method = method
        self.expected = expected

    def test_api(self):
        res = HttpRequest().http_request(self.url, self.data, self.method)
        if res.cookies:#如果cookie有的话,那么就更新cookie
            setattr(GetData,'Cookie',res.cookies) #反射

        try:
            self.assertEqual(self.expected,res.json()['code'])
        except AssertionError as e:
            print("test_api's error is {}".format(e))
            raise e
        print(res)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : do_excel.py
from openpyxl import load_workbook


class DoExcel:
    def __init__(self, file_name, sheet_name):
        self.file_name = file_name
        self.sheet_name = sheet_name
        self.sheet_obj = load_workbook(self.file_name)[self.sheet_name]  # 获取一个表单对象

    def get_data(self):
        wb = load_workbook(self.file_name)
        sheet = wb[self.sheet_name]
        test_data = []

        for i in range(1, sheet.max_row + 1):
            sub_data = {}
            sub_data['method'] = sheet.cell(i, 1).value
            sub_data['url'] = sheet.cell(i, 2).value
            sub_data['data'] = sheet.cell(i, 3).value
            sub_data['expected'] = sheet.cell(i, 4).value
            test_data.append(sub_data)
        print(test_data)
        return test_data  # 返回取到的数据,获取一个表单对象


if __name__ == '__main__':
    DoExcel("test.xlsx", 'test').get_data()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : http_request.py

import requests


class HttpRequest:

    def http_request(self, url, data, method):
        headers = {'Content-Type': 'application/json;charset=UTF-8'}
        result = None
        if method.lower() == 'post':
            result = requests.request("POST", url, data=data, headers=headers)
        elif method.lower() == 'get':
            result = requests.request("GET", url, data=data, headers=headers)
        else:
            print("错误")

        return result
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : GetData.py


class GetData:
    Cookie = None

注意:使用的excel表是不带表头的

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值