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
文件目录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=username
self.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):
pass
def tearDown(self):
pass
def 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)
参数化后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=username
self.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):
pass
def tearDown(self):
pass
def 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.zhihu.com/question/40283828
dict在Python里是object,用的指针指向。循环使用时出的问题,append加入字典元素,前面已经加入的对象指针跟着变,所有字典元素都显示最后一个。
base中的一个rw_Excel.py:
#coding=utf-8
from openpyxl import load_workbook
def 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).value
data_dic['passwd']=worksheet.cell(i,2).value
print("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
还有读取配置文件方法:
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运行通过。
来源:CSDN
作者:qq_37112121
链接:https://blog.csdn.net/qq_37112121/article/details/103910056