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.unpack
def 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=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)
(后续回去用自己电脑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=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.cnblogs.com/alimy/p/10374923.html
之前获取输入数据采用直接赋值法。循环使用时出的问题,append加入字典元素,之前已经加入的对象内容跟着变,最后的结果,所有字典元素都只显示为最后一个。
这里的字典数据采用浅拷贝,copy()就够用了。
(后续在自己电脑上用pycharm再现,发现导入文件语句又标红,但实际执行并不影响结果。)
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
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运行通过。