excel单元测试

步骤1:编写测试方法 

api_request.py
import requests

class HttpRequest:
    """requests请求需要转入的参数"""

    def http_request(self,method, url, data,auth = None,headers =None ):
        '''url:请求地址 http://xxxx:port
           param:传递的参数 非必填参数 字典的格式传递参数
           method:请求方式  支持get,post,put...
           get:获取信息,post:添加信息,put:修改更新信息
        '''
        if method.lower() in ('get','post','put','patch'):
            if method.lower() == 'get':
                res = requests.get(url, data, auth = auth, headers= headers)
            elif method.lower() == 'post':
                res = requests.post(url, data, headers = headers)
            elif method.lower() == 'put':
                res = requests.put(url, data, headers = headers)
            else:
                res = requests.patch(url, data, headers = headers)

            return res
        else:
            raise Exception('暂不支持的请求方式')

步骤2:excel中存储测试数据

test.xlsx

 

 步骤3:配置文件,指定需要测试的测试数据

case.config

[MODE]
button = all
button1 = ['001', '003']

 

步骤4:读取配置文件

api_readconfig.py
import configparser

class ReadConfig:
    def read_config(self,file_name,section,option):
        cf = configparser.ConfigParser() # 实例化
        cf.read(file_name,encoding='utf-8')
        return cf.get(section,option)

步骤5:取出指定测试数据,存于列表中

from openpyxl import load_workbook
from api_tools.doexcel.api_readconfig import ReadConfig   #导入配置文件读取方法

class Excel:

    def __init__(self,file_name,sheet_name):
        self.file_name = file_name
        self.sheet_name = sheet_name
        self.obj = load_workbook(self.file_name)[self.sheet_name]
        self.max_row = self.obj.max_row
        self.max_colunm = self.obj.max_colunm

    def get_header(self):
        """获取标题行:第一行"""
        header = []  # 存储标题行
        for j in range(1, self.max_colunm + 1):
            header.append(self.obj.cell(1, j).value)
        return header

    def data_store(self):

        """ button:控制是否执行所有的用例,默认值为all, 为all表示执行所有用例,否则进入分支判断
                  button的取值:all/列表 """

        button = ReadConfig().read_config('case.config', 'MODE', 'button1')  # 配置文件读取方法

        """ 将excel的测试数据存储到列表中 """
        header = self.get_header() # 获取header
        data_list = []
        for i in range(2,self.max_row +1): #行:一条测试用例
            data_dict ={}
            for j in range(1,self.max_colunm + 1):  # 列,利用get_header()存储测试数据
                data_dict[header[j-1]] = self.obj.cell(i,j).value  # header是列表, j-1列表:从0开始
                data_list.append(data_dict)  # 每条测试用例作为子元素传入test_data[]中
            """
            # 直接将测试数据以字典形式写入到data_list列表中
            data_dict['method']     = self.obj.cell(i,4).value
            data_dict['url']        = self.obj.cell(i,5).value
            data_dict['data']       = self.obj.cell(i,6).value
            data_dict['expected']   = self.obj.cell(i,7).value
            data_list.append(data_dict)   # 每条测试用例作为子元素传入data_list[]中
            """
        # return data_list

        if button == 'all':  # 执行所有的用例
            data_final = data_list
        else:
            data_final = []
            for item in data_list:  # 对data_list 所有的测试数据进行遍历
                if item['case_id'] in button:
                    data_final.append(item)

        return data_final

步骤6:执行测试用例方法

请求头文件:get_header.py

class GetHeader:
    headers = {'X-Lemonban-Media-Type': 'xxxxx', 'Content-Type': 'application/json; charset=UTF-8','Authorization':None}
测试用例执行方法:
api_testexcelcase.py
import json
import unittest
from ddt import ddt,data
from api_tools.com.api_request import HttpRequest  # 导入requests接口请求方法
from api_tools.doexcel.get_header import GetHeader
from api_tools.doexcel.api_readexcel import Excel


data_final = Excel("file_name", "sheet_name").data_store()  #所有测试用例

@ddt
class Test(unittest.TestCase):
        """写测试用例"""

        def setUp(self):
            pass

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

        @data(*data_final)

        #  给requests接口方法传入必要参数,并且比对结果是否与预期一致

        def test_casename(self,item):

            """  
            print('请求信息为:\n url:{0},data:{1},method:{2},header:{3}'.format(self.url, json.dumps(self.data), self.method,getattr(GetHeader, 'headers')))
            res = HttpRequest().http_request(self.url, json.dumps(self.data), self.method,getattr(GetHeader, 'headers'))
            try:
                self.assertEqual(self.expected, res.json()['code'], '提示信息')
            except AssertionError as e: #异常处理
                print("出错啦!断言错误是{0}".format(e))
                raise e
            print(res.json())
            
            """

            print('请求信息为:\n url:{0},data:{1},method:{2},header:{3}'.format(item['url'], json.dumps(json.loads(item['data'])),item['method'], getattr(GetHeader, 'headers')))
            res = HttpRequest().http_request(item['url'], json.dumps(json.loads(item['data'])), item['method'],getattr(GetHeader, 'headers'))
            try:
                self.assertEqual(item['expected'], res.json()['code'])
            except AssertionError as e:
                print("test_rl_api error is {}".format(e))
                raise e
            print(res.json())

        def tearDown(self):
            pass

步骤7:执行测试用例,生成测试报告

import HTMLTestRunner
import time
import unittest
from api_tools.doexcel.api_testexcelcase import Test


suite = unittest.TestSuite() # 创建实例
loader = unittest.TestLoader() # 加载测试用例
suite.addTest(loader.loadTestsFromTestCase(Test))

# 生成测试报告
with open(time.strftime('%Y-%m-%d %H_%M_%S')+'_test_report.html','wb') as file:
    runner = HTMLTestRunner.HTMLTestRunner(stream=file,
                                           verbosity=2,
                                           title=  time.strftime('%Y-%m-%d %H_%M_%S') + 'XXXX测试报告',
                                           description='运行环境:Windows 10, Chrome浏览器' )
    runner.run(suite) # 执行测试用例


if __name__ == '__main__':
    unittest.TestCase()

 

 

 

 

posted @ 2020-03-30 13:59  鲲尘轻杳  阅读(567)  评论(0编辑  收藏  举报