Python参数化接口测试demo笔记

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)

文件安排:

Python参数化接口测试demo笔记_第1张图片

Python参数化接口测试demo笔记_第2张图片

Python参数化接口测试demo笔记_第3张图片

文件目录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报告单显示:

Python参数化接口测试demo笔记_第4张图片

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

你可能感兴趣的:(Python笔记)