接口测试自动化框架-Python+requests+Excel 增加测试报告升级版

emmmm 之前的是不带报告的,毕竟直接写入Excel,测试用例已经能交差了。但是想到如果case非常多,自己进到excel筛选什么的过于麻烦,添加个html的测试报告这样一目了然。

如果没看过原版的,给你个链接接口自动化框架详解

这次我们只讲新添加的东西

**

首先先下载个改良版htmltestrunner

**
HTMLtestRunner下载

放到跟你脚本同级(一个文件夹,这样你import的时候方便)

import xlrd
import requests
from xlutils.copy import copy
from urllib import parse
import HTMLTestRunner_PY3
import unittest
import time

这次我们多引用一个刚才下载的 htmltestrunner
还有一个time 这样保存的时候什么时候运行的case就知道了

直接上源码,最主要的时候最后加的几句

import xlrd
import requests
from xlutils.copy import copy
from urllib import parse
import HTMLTestRunner_PY3
import unittest
import time

now=time.strftime("%Y-%m-%d %H_%M_%S")
report_path = r'D:\Soft\VScode\Python\study_lianxi\test_case\{}result.html'.format(now)

excel_path = r'D:\Soft\VScode\Python\study_lianxi\接口自动化用例.xls'
excelfile = xlrd.open_workbook(excel_path,formatting_info=True)
sheet_1 = excelfile.sheets()[0]
# cols 是列
#cols = sheet_1.col_values(0)
# rows 是行
#rows = sheet_1.row_values(0)

# cell 单元格查找,先列再行,7C也就是6,2
# cell_7C=sheet_1.cell(6,2).value

# 全局变量
answer = []
pass_or_false = []
body = {}
headers = {"User-Agent":
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2427.7 Safari/537.36"
}

# 得到接口信息类
class Api_get_result():
    # 初始化属性
    # url,phone,key,parameter_phone,parameter_key
    def __init__(self,url,parameter_keys,parameter_values):
        '''
        param url: url地址
        param parameter_keys: phone 和 key
        param parameter_values: 电话号码 和 密钥
        '''
        self.url = url
        for i in range(len(parameter_keys)):
            body[parameter_keys[i]] = parameter_values[i]

    # 判断是get请求还是post请求
    def way_to_requests(self,way):
        if way == 'get':
            return True
        elif way == 'post':
            return False
        else:
            return None
    
    # 发送 post请求
    def api_post(self):
        get_url = self.url + '?' + parse.urlencode(body)
        res = requests.post(get_url,headers=headers)
        # res = requests.post(self.url,data = body,headers=headers)
        return res
    
    # 发送 get请求
    def api_get(self):
        get_url = self.url + '?' + parse.urlencode(body)
        res = requests.get(get_url,headers=headers)
        return res

# 处理Excel类
class Dispose_excel:
    # 得到case多少列函数
    def get_case_count(self):
        # 获取一共有多少列
        rows_count = sheet_1.nrows
        # 去掉表头 一共有多少个case
        real_count = rows_count - 6
        return real_count
    
    # 得到接口URL地址
    def get_url(self):
        url = rows[2]
        return url

    # 得到请求方式
    def get_way(self):
        way = rows[3]
        return way


    # 得到请求参数
    def requests_parameter(self):
        requests_parameter_cell = rows[4]
        return requests_parameter_cell
    
    # 得到正确状态码
    def should_status_code(self):
        status_code = rows[5]
        return status_code
    
    # 得到预期结果
    def expected_result(self):
        result = rows[6]
        return result
    
    # 写入 实际结果 和pass false
    def write_result(self):
        answer_excel = copy(excelfile)
        workSheet = answer_excel.get_sheet(0)
        start = 6
        for i in range(len(answer)):
            workSheet.write(start,7,answer[i])
            workSheet.write(start,8,pass_or_false[i])
            start += 1
        answer_excel.save(r'D:\Soft\VScode\Python\study_lianxi\接口测试结果.xls')




   
if __name__ == "__main__":
    # 处理excel初始化函数
    document_data = Dispose_excel()
    # 得到一共有多少case
    count = document_data.get_case_count()
    # 遍历
    for i in range(6,6+count):
        # 得到各个参数
        rows = sheet_1.row_values(i)
        url = document_data.get_url()
        way = document_data.get_way()
        res_parameter = document_data.requests_parameter()
        status = document_data.should_status_code()
        expect_result = document_data.expected_result()
        # print(url,way,res_parameter,status,expect_result)
        # 处理请求参数,变为字典
        parameter_dic = eval(res_parameter)
        num = len(parameter_dic)
        # 得到具体输入 api_get类里的参数
        parameter_dic_keys = []
        parameter_dic_values = []
        for i in range(num):
            parameter_dic_keys.append(list(parameter_dic.keys())[i])
            parameter_dic_values.append(list(parameter_dic.values())[i])

        # 调用api_get类
        api = Api_get_result(url,parameter_dic_keys,parameter_dic_values)
        # 判断请求方式,发起请求 且得到结果
        if way == 'get':
            result = api.api_get().text
        elif way == 'post':
            result = api.api_post().text
        # 把每次结果都添加至列表
        answer.append(result)
        # 判断是否与预期结果相符
        if result == expect_result:
            pass_or_false.append('Pass')
        else:
            pass_or_false.append('False')
    


    # 把结果写入新的表格
    document_data.write_result()
    # 生成测试报告
    # 测试用例.py存放的目录
    test_dir = r'D:\Soft\VScode\Python\study_lianxi'
    # 执行测试用例目录下所有以test开头.py结尾的文件
    discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
    
    # 保存测试报告
    with open(report_path,'wb')as f:
        runner = HTMLTestRunner_PY3.HTMLTestRunner(stream=f,title='接口用例测试报告',description='xxx接口第一次自动化测试')
        runner.run(discover)
    
    # 结束

runner代表的参数 title就是测试报告的标题 description就是测试报告的描述

然后

在同个目录下新建一个以test开头的py文件

import unittest
import ddt
import xlrd


excel_path = r'D:\Soft\VScode\Python\study_lianxi\接口测试结果.xls'
excelfile = xlrd.open_workbook(excel_path,formatting_info=True)
sheet_1 = excelfile.sheets()[0]
cols = sheet_1.col_values(8)
li = [i for i in cols if i]
del li[0]

@ddt.ddt
class test_report(unittest.TestCase):
    @ddt.data(*li)
    def test_pass_or_false(self,value):
        self.assertEqual(value,'Pass')

这些代码是检查Excel内所有的是否通过,如果pass就通过,如果false就不通过,会在测试报告上显示。

下面是测试报告的效果图
效果图

其他同之前的文章,就是增加了个测试报告,直观显示一下。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值