excel管理接口测试用例详解

张开发
2026/4/16 13:38:35 15 分钟阅读

分享文章

excel管理接口测试用例详解
点击文末小卡片免费获取软件测试全套资料资料在手涨薪更快闲话休扯上需求自动读取、执行excel里面的接口测试用例测试完成后返回错误结果并发送邮件通知。分析1、设计excel表格2、读取excel表格3、拼接url发送请求4、汇总错误结果、发送邮件开始实现1、设计excel接口用例表格大概长这样依次为用例编号、接口名称、接口主host、接口路由、请求方式、请求参数类型、请求参数、断言这次案例中用到的接口其实就是如何优雅的进行接口测试使用的快递查询接口一时半会儿没找到好用的之前写的也找不到了只好作罢。2、读取excel表格获取每个用例的数据import xlrd import sys def test_cases_in_excel(test_case_file): test_case_file os.path.join(os.getcwd(), test_case_file) # 获取测试用例全路径 如E:\Python\httprunner\interface_excel\testcases.xlsx print(test_case_file) if not os.path.exists(test_case_file): print(测试用例excel文件存在或路径有误) # 找不到指定测试文件就退出程序 os.system(exit)是用来退出cmd的 sys.exit() # 读取excel文件 test_case xlrd.open_workbook(test_case_file) # 获取第一个sheet下标从0开始 table test_case.sheet_by_index(0) # 记录错误用例 error_cases [] # 一张表格读取下来其实就像个二维数组无非是读取第一行的第几列的值由于下标是从0开始第一行是标题所以从第二行开始读取数据 for i in range(1, table.nrows): num str(int(table.cell(i, 0).value)).replace(\n, ).replace(\r, ) api_name table.cell(i, 1).value.replace(\n, ).replace(\r, ) api_host table.cell(i, 2).value.replace(\n, ).replace(\r, ) request_url table.cell(i, 3).value.replace(\n, ).replace(\r, ) method table.cell(i, 4).value.replace(\n, ).replace(\r, ) request_data_type table.cell(i, 5).value.replace(\n, ).replace(\r, ) request_data table.cell(i, 6).value.replace(\n, ).replace(\r, ) check_point table.cell(i, 7).value.replace(\n, ).replace(\r, ) print(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point) try: # 调用接口请求方法后面会讲到 status, resp interface_test(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point) if status ! 200 or check_point not in resp: # append只接收一个参数所以要讲四个参数括在一起当一个参数来传递 # 请求失败则向error_cases中增加一条记录 error_cases.append((num api_name, str(status), api_host request_url)) except Exception as e: print(e) print(第{}个接口请求失败请检查接口是否异常。.format(num)) # 访问异常也向error_cases中增加一条记录 error_cases.append((num api_name, 请求失败, api_host request_url)) return error_cases3、拼接url判断请求方式get/post发送请求传入读取用例的各种参数先判断请求方式再拼接参数通过requests库来发送请求import requests def interface_test(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point): # 构造请求headers headers {Content-Type : application/x-www-form-urlencoded; charsetUTF-8, X-Requested-With : XMLHttpRequest, Connection : keep-alive, Referer : http:// api_host, User-Agent : Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36 } # 判断请求方式如果是GET则调用get请求POST调post请求都不是则抛出异常 if method GET: r requests.get(urlapi_hostrequest_url, paramsjson.loads(request_data), headersheaders) # 获取请求状态码 status r.status_code # 获取返回值 resp r.text if status 200: # 断言判断设置的断言值是否在返回值里面 if check_point in str(r.text): print(第{}条用例{}执行成功状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}执行失败状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}执行失败状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp elif method POST: # 跟GET里面差不多就不一一注释了 r requests.post(urlapi_hostrequest_url, paramsjson.loads(request_data), headersheaders) status r.status_code resp r.text if status 200: if check_point in str(r.text): print(第{}条用例{}执行成功状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}执行失败状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}执行失败状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}请求方式有误请确认字段【Method】值是否正确正确值为大写的GET或POST。.format(num, api_name)) return 400, 请求方式有误4、汇总错误结果、发送邮件4.1、汇总错误结果保存为简易html报告并通过邮件发送到指定接收人def main(): # 执行所以测试用例获取错误的用例 error_cases test_cases_in_excel(testcases.xlsx) # 如果有错误接口则开始构造html报告 if len(error_cases) 0: html htmlbody接口自动化扫描共有 str(len(error_cases)) 个异常接口列表如下 /ptabletrth stylewidth:100px;text-align:left接口/thth stylewidth:50px;text-align:left状态/thth stylewidth:200px;text-align:left接口地址/th/tr for test in error_cases: html html trtd styletext-align:left test[0] /tdtd styletext-align:left test[1] /tdtd styletext-align:left test[2] /td/tr send_email(html) print(html) with open (report.html, w) as f: f.write(html) else: print(本次测试所有用例全部通过) send_email(本次测试所有用例全部通过)4.2、构造邮件函数先读取配置文件新建config.yml配置文件内容如下sender为发送邮件的邮箱receiver为接收者着的邮箱支持多个smtpserver邮箱服务username发送者邮箱少去后缀password密码import yaml def get_conf(): with open (config.yml, r, encodingutf-8) as f: cfg f.read() dic yaml.load(cfg) sender dic[email][sender] receiver dic[email][receiver] smtpserver dic[email][smtpserver] username dic[email][username] password dic[email][password] print(sender, receiver, smtpserver, username, password) return sender, receiver, smtpserver, username, password然后构造发送邮件的函数import smtplib import time from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email.header import Header def send_email(text): today time.strftime(%Y.%m.%d,time.localtime(time.time())) sender, receiver, smtpserver, username, password get_conf() # subject为邮件主题 text为邮件正文 subject [api_test]接口自动化测试结果通知 {}.format(today) msg MIMEText(text, html, utf-8) msg[Subject] subject msg[From] sender msg[To] .join(receiver) smtp smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()以上内容就将需求实现了由于现在很晚了懒上面所以函数就对在一个py文件里面了来运行下吧邮件一会儿就收到了所有代码如下#!/usr/bin/env python #-*- coding:utf-8 -*- 需求自动读取、执行excel里面的接口测试用例测试完成后返回错误结果并发送邮件通知。 一步一步捋清需求 1、设计excel表格 2、读取excel表格 3、拼接url发送请求 4、汇总错误结果、发送邮件 import xlrd import os import requests import json import yaml import smtplib import time import sys from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email.header import Header def test_cases_in_excel(test_case_file): test_case_file os.path.join(os.getcwd(), test_case_file) # 获取测试用例全路径 如E:\Python\httprunner\interface_excel\testcases.xlsx print(test_case_file) if not os.path.exists(test_case_file): print(测试用例excel文件存在或路径有误) # 找不到指定测试文件就退出程序 os.system(exit)是用来退出cmd的 sys.exit() # 读取excel文件 test_case xlrd.open_workbook(test_case_file) # 获取第一个sheet下标从0开始 table test_case.sheet_by_index(0) # 记录错误用例 error_cases [] # 一张表格读取下来其实就像个二维数组无非是读取第一行的第几列的值由于下标是从0开始第一行是标题所以从第二行开始读取数据 for i in range(1, table.nrows): num str(int(table.cell(i, 0).value)).replace(\n, ).replace(\r, ) api_name table.cell(i, 1).value.replace(\n, ).replace(\r, ) api_host table.cell(i, 2).value.replace(\n, ).replace(\r, ) request_url table.cell(i, 3).value.replace(\n, ).replace(\r, ) method table.cell(i, 4).value.replace(\n, ).replace(\r, ) request_data_type table.cell(i, 5).value.replace(\n, ).replace(\r, ) request_data table.cell(i, 6).value.replace(\n, ).replace(\r, ) check_point table.cell(i, 7).value.replace(\n, ).replace(\r, ) print(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point) try: # 调用接口请求方法后面会讲到 status, resp interface_test(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point) if status ! 200 or check_point not in resp: # append只接收一个参数所以要讲四个参数括在一起当一个参数来传递 # 请求失败则向error_cases中增加一条记录 error_cases.append((num api_name, str(status), api_host request_url)) except Exception as e: print(e) print(第{}个接口请求失败请检查接口是否异常。.format(num)) # 访问异常也向error_cases中增加一条记录 error_cases.append((num api_name, 请求失败, api_host request_url)) return error_cases def interface_test(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point): # 构造请求headers headers {Content-Type : application/x-www-form-urlencoded; charsetUTF-8, X-Requested-With : XMLHttpRequest, Connection : keep-alive, Referer : http:// api_host, User-Agent : Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36 } # 判断请求方式如果是GET则调用get请求POST调post请求都不是则抛出异常 if method GET: r requests.get(urlapi_hostrequest_url, paramsjson.loads(request_data), headersheaders) # 获取请求状态码 status r.status_code # 获取返回值 resp r.text if status 200: # 断言判断设置的断言值是否在返回值里面 if check_point in str(r.text): print(第{}条用例{}执行成功状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}执行失败状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}执行失败状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp elif method POST: # 跟GET里面差不多就不一一注释了 r requests.post(urlapi_hostrequest_url, paramsjson.loads(request_data), headersheaders) status r.status_code resp r.text if status 200: if check_point in str(r.text): print(第{}条用例{}执行成功状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}执行失败状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}执行失败状态码为{}结果返回值为{}..format(num, api_name, status, r.text)) return status, resp else: print(第{}条用例{}请求方式有误请确认字段【Method】值是否正确正确值为大写的GET或POST。.format(num, api_name)) return 400, 请求方式有误 def main(): # 执行所以测试用例获取错误的用例 error_cases test_cases_in_excel(testcases.xlsx) # 如果有错误接口则开始构造html报告 if len(error_cases) 0: # html htmlbody接口自动化扫描共有 str(len(error_cases)) 个异常接口列表如下 /ptabletrth stylewidth:100px;text-align:left接口/thth stylewidth:50px;text-align:left状态/thth stylewidth:200px;text-align:left接口地址/thth styletext-align:left接口返回值/th/tr html htmlbody接口自动化扫描共有 str(len(error_cases)) 个异常接口列表如下 /ptabletrth stylewidth:100px;text-align:left接口/thth stylewidth:50px;text-align:left状态/thth stylewidth:200px;text-align:left接口地址/th/tr for test in error_cases: # html html trtd styletext-align:left test[0] /tdtd styletext-align:left test[1] /tdtd styletext-align:left test[2] /tdtd styletext-align:left test[3] /td/tr html html trtd styletext-align:left test[0] /tdtd styletext-align:left test[1] /tdtd styletext-align:left test[2] /td/tr send_email(html) print(html) with open (report.html, w) as f: f.write(html) else: print(本次测试所有用例全部通过) send_email(本次测试所有用例全部通过) def get_conf(): with open (config.yml, r, encodingutf-8) as f: cfg f.read() dic yaml.load(cfg) # print(type(dic)) # print(dic) sender dic[email][sender] receiver dic[email][receiver] smtpserver dic[email][smtpserver] username dic[email][username] password dic[email][password] print(sender, receiver, smtpserver, username, password) return sender, receiver, smtpserver, username, password def send_email(text): today time.strftime(%Y.%m.%d,time.localtime(time.time())) sender, receiver, smtpserver, username, password get_conf() # subject为邮件主题 text为邮件正文 subject [api_test]接口自动化测试结果通知 {}.format(today) msg MIMEText(text, html, utf-8) msg[Subject] subject msg[From] sender msg[To] .join(receiver) smtp smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit() if __name__ __main__: # send_email(test) main()View Code思考需要改进的地方有很多1、增加日志导入logging模块代码里面的print一通copy即可自己尝试哈2、回写excel表格xlrd既然可以读取excel文档肯定可以写入的。可以新增一列每次执行完用例将结果写进去自己去尝试哈3、request data type没有做判断这里偷懒了因为只用了一个接口而且大晚上在赶工就没有做判断。可以参照判断请求方式get/post来写。4、报告渣1、可以尝试使用htmlreport库2、也可以自己尝试使用一些前端框架生成如bootstrap5、未做持续集成什么是持续集成听起来高大上说白了就是找个数据库或者其他玩意儿将用例、执行结果等等都存储起来。python有很多库可以连接各种数据库mysql、mongoDB读取excel或者其他接口脚本文档存入数据库然后请求接口后再从库里面读取出来。balabala......6、无界面没有界面其实要不要都无所谓毕竟只要维护一份excel表格即可。如果一定要的话可以考虑使用django或者flask框架构造web页面将用例的导入导出、新增、编辑、发送请求生成报告等等一系列操作全部移交到前端。这就需要懂一点前端代码如果有兴趣你也可以尝试。最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走这些资料对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你凡事要趁早特别是技术行业一定要提升技术功底。

更多文章