Python参数化接口测试demo笔记

南笙酒味 提交于 2020-01-19 06:59:04

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运行通过。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!