https://www.cnblogs.com/du-hong/p/10766314.html 接口测试学习demo

目的:使用之前学习接口测试的demo,批量运行一波数据,就5行,产生报告html文档。

方法:从Excel文档.xlsx中读取数据传入unittest测试类,

使用到模块openpyxl读取Excel。安装:pip3 install openpyxl

关于openpyxl学习

https://blog.csdn.net/ChenLeihappy/article/details/80989552

以下文章,接口测试应用了openpyxl

https://www.cnblogs.com/fantastic-21/p/9727339.html

https://www.cnblogs.com/yoyoketang/p/8856362.html

参数化采用了模块paramunittest  安装:pip3 install paramunittest

数据驱动的ddt模块也能产生一样的效果,但目前查到的资料都显示不支持直接读取Excel文件。支持直接读取json和yaml文件。

还是试验了一下ddt模块的用法。

from MathDemo import add,multi,divide #一个自定义的加减乘除py模块
import unittest
import ddt #试过from ddt import ddt,data,unpack  但是这样做,@data(*data)报错不能传入list
#@ddt.file_data("json文件地址")可以读取json文件数据
data=[[5,6,11],[10,2,12],[2,3,5]]
@ddt.ddt
class MyTestCase(unittest.TestCase):@ddt.data(*data)@ddt.unpackdef test_01(self,a,b,c):self.assertEqual(c,add(a,b))
if __name__=="__main__":unittest.main(verbosity=2)

文件安排:

文件目录case(放用例代码interface_start4.py)、data(放Excel数据)、

report(存放生成的html报告)、base(放rw_Excel.py读取Excel文档方法)

1.读取Excel数据,作为(字典元素)列表参数化输入,这里写了一个方法rw_Excel()进行数据读取和转换

2.使用注解@paramunittest.parametrized(批量数据)修饰测试类,复写setParameters(批量数据)方法,

3.定义发送请求的方法send_request(),发送请求request.get/post(url,params=字典数据), return响应数据

4.测试用例方法调用send_request(),对响应数据解析判断

5.加载测试用例suite,HTMLTestRunner运行suite,生成测试html报告

demo如下interface_start3.py :

#coding=utf-8
import unittest
from openpyxl import load_workbook
import requests
import json
import paramunittest
import time
from HTMLTestRunner import HTMLTestRunner
#测试接口
'''
@paramunittest.parametrized(*[{"username":"peakchao","passwd":"123456"},{"username":"Peakchao","passwd":"123456"},{"username":"peakchao","passwd":"123457"}]
)
'''
class TestFunc(unittest.TestCase):#若是参数化必须复写的函数setParameters()'''def setParameters(self,username,passwd):self.username=usernameself.passwd=passwd'''def send_requests(self,username,passwd):url='https://api.apiopen.top/developerLogin'#jsonData0={"User-Agent":"Android511-AndroidPhone-9305-52-0-AudioBook-wifi"}jsonData2={"name":username,"passwd":passwd}result0=requests.get(url,params=jsonData2)#headers=jsonData0,#result2=result0.url#字节输出#print("location:"+result2)#print(json.dumps(result0.json(), encoding="utf-8", ensure_ascii=False))#requests内置json转换,出来的是json格式字符串,没有经过编码,中文会显示unicode 16进制数return result0.json()def setUp(self):passdef tearDown(self):passdef test_One(self):username="peakchao"passwd="123456"result=self.send_requests(username,passwd)print(result['code'])print(result)self.assertEqual(result['code'], 200, "test over")if __name__ == "__main__":suite=unittest.TestSuite(unittest.makeSuite(TestFunc))now=time.strftime("%Y-%m-%d %H_%M_S",time.localtime())filename="../report/Socket_"+now+"_result.html"fp=open(filename,'wb')runner=HTMLTestRunner(stream=fp,title=u"接口测试",description=u"正确的账号和密码")runner.run(suite)#unittest.main(verbosity=2)

(后续回去用自己电脑window系统重复一遍操作,直接控制台运行还好,用了编译工具pycharm,又遇到点问题,

1.控制台命令pip安装第三方模块,报错pip的版本太老,直接使用提示的更新命令又是报同样的错,最后直接官网下载pip的压缩包,解压后本地路径下控制台运行python setup.py install直接安装一个新版的。

2.pycharm运行环境之前没注意,用的是虚拟环境,不是电脑本地安装的python3路径。之前使用控制台命令安装好第三方包后,代码里导入语句总是报错,后来才发现这个原因,又浪费时间了。File->settings->project Interpreter

3.右键run File in python console才生成html报告,之前按习惯点“run unittest for ... ”,没用输出HTML文档)

参数化后interface_start4.py :

#coding=utf-8
import unittest
import requests
import json
import paramunittest
from HTMLTestRunner import HTMLTestRunner
import sys
sys.path.append("..")
from base.rw_Excel import rw_Excel_Pub
from base.rw_config import getConfigInfo
import os
import time#参数化、测试接口、生成html报告
'''
@paramunittest.parametrized({"username":"peakchao","passwd":"123456"},{"username":"Peakchao","passwd":"123456"},{"username":"peakchao","passwd":"123457"}
)
'''
#读取Excel文件数据的方法rw_Excel()
#可变参数的传递使用可以*[参数1,参数2,...参数n]或者*(参数1,参数2,...参数n)
@paramunittest.parametrized(*(rw_Excel_Pub("../data/data_test.xlsx","Sheet1",5,"username","passwd")))
class TestFunc(unittest.TestCase):#paramunittest必须复写的方法setParameters(需要批量传递测试参数)def setParameters(self,username,passwd):self.username=usernameself.passwd=passwd#发送请求def send_requests(self):#url='https://api.apiopen.top/developerLogin'#读取配置文件 config.ini 内的参数url=getConfigInfo("HTTP","base_url0")       jsonData2={"name":self.username,"passwd":self.passwd}result0=requests.get(url,params=jsonData2)#result2=result0.url#字节输出#print("location:"+result2)#print(json.dumps(result0.json(), encoding="utf-8", ensure_ascii=False))#requests内置json转换,出来的是json格式字符串,没有经过编码,中文会显示unicode 16进制数return result0.json()def setUp(self):passdef tearDown(self):passdef test_One(self):#username="peakchao"#passwd="123456"result=self.send_requests()#print(result['code'])#print(result)self.assertEqual(result['code'], 200, "test over")if __name__ == "__main__":#print(type(TestFunc))#suite=unittest.TestSuite()#suite.addTest(TestFunc())#总是报错NoneType,用了discover是可以的case_path=os.getcwd()#os.path.join(os.getcwd())#用例路径suite=unittest.defaultTestLoader.discover(case_path,pattern="interface_start4.py",top_level_dir=None)now=time.strftime("%Y-%m-%d %H_%M_%S",time.localtime())filename="../report/Socket_"+now+"_result.html"fp=open(filename,'wb')runner=HTMLTestRunner(stream=fp,title=u"参数化测试",description=u"接口测试")runner.run(suite)   #unittest.main(verbosity=2)fp.close()

读取数据,中间基础不牢靠出了点错

参考:https://www.cnblogs.com/alimy/p/10374923.html

之前获取输入数据采用直接赋值法。循环使用时出的问题,append加入字典元素,之前已经加入的对象内容跟着变,最后的结果,所有字典元素都只显示为最后一个。

这里的字典数据采用浅拷贝,copy()就够用了。

(后续在自己电脑上用pycharm再现,发现导入文件语句又标红,但实际执行并不影响结果。)

base中的一个rw_Excel.py:

#coding=utf-8
from openpyxl import load_workbookdef rw_Excel():file_path="../data/data_test.xlsx"workbook=load_workbook(filename=file_path)worksheet=workbook['Sheet1']data_dic={}data_list=[]for i in range(1,6):data_dic['username']=worksheet.cell(i,1).valuedata_dic['passwd']=worksheet.cell(i,2).valueprint("init data:")        print(data_dic)d=data_dic.copy()data_list.append(d)print(data_list)return data_list
#t=rw_Excel()
#print(t)
#参数 file_path:Excel文件路径,
# sheetname:工作薄名,
# rows:读取数据行数,
# *args:传入数据表 参数名称,组成字典元素的key值,按顺序,都要写,不能空
def rw_Excel_Pub(file_path,sheetname,rows,*args):workbook=load_workbook(filename=file_path)worksheet=workbook[sheetname]data_dic={}data_list=[]for i in range(1,(rows+1)):#行。将每行“字典变量”存入列表data_list[] for x in range(1,len(args)+1):#列。取出第i行的数据更新字典变量data_dic{}data_dic[args[x-1]]=worksheet.cell(i,x).value   #print("init data:")        #print(data_dic)d=data_dic.copy()data_list.append(d)#print(data_list)return data_list

rw_Excel_Pub方法中args当元组用,取列参数字符串,即字典key值。

还有读取配置文件方法:

import configparser
'''
config=configparser.ConfigParser()
config.read("../config.ini")#读取配置文档
sections=config.sections()
print(sections)options=config.options("HTTP")
print(options)items=config.items("HTTP")
print(items)base_url0=config.get("HTTP","base_url0")
print(base_url0)
print(type(base_url0))
'''
#节点名 section   参数名 param
def getConfigInfo(section,param):config=configparser.ConfigParser()config.read("../config.ini")#读取配置文档value=config.get(section,param)return value

目录report下html报告单显示:

运行后才发现这个接口用户名是大小写忽略的。TestFunc_4运行通过。

Python参数化接口测试demo笔记相关推荐

  1. Python接口测试之四笔记

    Python接口测试之四笔记 用户频道 接下来是取消和收藏文章. 这个是我学习的,因为密钥没有,所以会有错误,但是逻辑和编码方式是这样子. 不足+如何修改,谢谢

  2. python数据分析入门学习笔记儿

    转载: http://www.cnblogs.com/zzhzhao/p/5269217.html 学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主 ...

  3. python数据分析入门学习笔记

    python数据分析入门学习笔记儿 学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我 ...

  4. Python源码学习笔记:Python程序执行过程与字节码

    Python程序执行过程与字节码 注:本篇是根据教程学习记录的笔记,部分内容与教程是相同的,因为转载需要填链接,但是没有,所以填的原创,如果侵权会直接删除. 问题: 我们每天都要编写一些Python程 ...

  5. python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)

    [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...

  6. Python初学者零碎基础笔记(一)

    Python初学者零碎基础笔记 一行代码输入多个参数 方法1.) a,b,c=map(类型,input("请输入").split()) #默认空格分隔,若要转其他类型,把类型换成需 ...

  7. Python基础语法学习笔记

    Python基础语法学习笔记 想淘宝省钱看我简介,博客www.liangxin.name (一) 一.Print()函数 1.数字可以直接输出,无需加引号 只能理解数字,却读不懂文字.因为数字和数学运 ...

  8. python神经结构二层_《python深度学习》笔记---8.3、神经风格迁移

    <python深度学习>笔记---8.3.神经风格迁移 一.总结 一句话总结: 神经风格迁移是指将参考图像的风格应用于目标图像,同时保留目标图像的内容. 1."神经风格迁移是指将 ...

  9. 学python需要记笔记吗_自学python需要做什么笔记

    python3.4学习笔记 3.x和2.x的区别,持续更新 python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) impo ...

最新文章

  1. 习题:codevs 2822 爱在心中 解题报告
  2. Linux主机驱动与外设驱动分离思想
  3. Python 存储字符串时是如何节省空间的?
  4. C#中对于float,double,decimal的误解
  5. java split 逗号_java截取之空字符丢失
  6. 在虚拟机上为红帽7Linux设置中文输入法
  7. base64下载excel (使用blob)
  8. java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行
  9. java性能优化方案_Java性能优化要点
  10. jmeter连接mysql时jdbc下载
  11. 我读《非暴力沟通》- 马歇尔 *卢森堡 - 让爱融入生活
  12. c语言陈湘骥答案,c语言程序设计实验指导答案陈湘骥
  13. 网络协议服务器常用默认端口
  14. TCP四次挥手中的2MSL是什么?
  15. 易基因|ChIP-seq等实验揭示CHD6转录激活前列腺癌通路的关键功能 | 肿瘤耐药研究
  16. BZOJ3039 玉蟾宫(单调栈)
  17. 读书笔记: C# 7.0 in a nutshell (第 四 章 Advanced C#- 下)
  18. php seekdir,C++_详解C语言中telldir()函数和seekdir()函数的用法,C语言telldir()函数:取得目录流 - phpStudy...
  19. HADOOP安装指南-Ubuntu15.10和hadoop2.7.2
  20. mysql 字段中有括号的查询方法

热门文章

  1. python操作xlsx格式文件
  2. c结构体的初使用(学生成绩简单统计)
  3. C 语言fseek, ftell调用失败(fseek返回非零值,ftell返回-1)
  4. 【树莓派4B】安装Ubuntu Mate20.04+ROS Noetic+使用电脑自带的xrdp和VNC进行PC端远程控制
  5. 2021届秋招腾讯前端一面面经
  6. 《JavaScript实现页面图片滚动播放》
  7. 【AE表达式】300多个人名正从宇宙中飞来……
  8. 20145212 罗天晨 MSF基础应用
  9. 存储篇- 存储基础知识概览
  10. Java截取String字符串的几种方法