本节介绍,使用python实现接口自动化实现。
思路:讲接口数据存放在excel文档中,读取excel数据,将每一行数据存放在一个个列表当中。然后获取URL,header,请求体等数据,进行请求发送。
结构如下

excel文档内容如下:

一、Common与Config包
Config里面的config.ini主要存放的默认的路径内容等,如excel文件的地址,工作簿名称

Common里面主要是一些通用的方法,目前只需要读取config里面的数据
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import configparser import os.path #读取config里面的数据 class ReadConfig: def __init__(self): self.filePath = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))+"\\config\\config.ini" print(self.filePath) self.config = configparser.ConfigParser() self.config.read(self.filePath,encoding='utf-8') def get_data(self,section,key): return self.config.get(section,key) def get_list(self,section): return self.config.items(section) if __name__ == '__main__': conf = ReadConfig() print(conf.get_data("excel", "file_path")) |
二、excel包
主要是实现读取excel表格数据,此处用的是openpyxl进行实现
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import openpyxl class ReadExcel: def __init__(self,excel_path,sheet_name): self.excel_path = excel_path self.sheet_name = sheet_name def get_data(self,row): workbook = openpyxl.load_workbook(self.excel_path) sh = workbook[self.sheet_name] data = [] for c in list(sh.rows)[row]: data.append(c.value) return data if __name__ == '__main__': ex = ReadExcel('request.xlsx','Sheet1') print(ex.get_data(0)) print(ex.get_data(1)) print(ex.get_data(2)) print(ex.get_data(3)) print(ex.get_data(4)) |
三、requests包
主要用于发送请求,这里只写了常用的get post请求,需要可以加其他的。
由于post请求体有多种,此处只区分了两种,其他的可以加上。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import json import requests class Request: def get_url(self,url,headers=None,paras=None): if url==None: print("URL地址为空") elif paras == None: r = requests.get(url,headers=headers,params=paras) else: r = requests.get(url, headers=headers, params=json.loads(paras)) return r def post_url(self,url,content_type,headers=None,payload=None): if url==None: print("URL地址为空") else: if content_type == "application/json": payload_json = json.dumps(payload) r = requests.post(url,headers=headers,data=payload_json) elif content_type =="application/x-www-form-urlencoded": r = requests.post(url,headers=headers,data=payload) else: print("no this content-type") return r def choose_method(self,method,url,content_type,headers=None,payload=None): if method == "get": return self.get_url(url,headers,payload) elif method == "post": return self.post_url(url,content_type,headers,payload) else: print("no this method request") |
四、testcases包
使用pytest框架进行自动化测试
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import json import pytest from autoStruct.apiAuto.common.requests import Request from autoStruct.apiAutoTesting.common.readConfig import ReadConfig from autoStruct.apiAutoTesting.excel.readExcel import ReadExcel class TestApi: def setup_class(self): file_path = ReadConfig().get_data('excel', 'file_path') sheet_name = ReadConfig().get_data('excel', 'sheet_name') self.ex = ReadExcel(file_path, sheet_name) @pytest.mark.parametrize('num',[1,2,3,4,5]) def testcase(self,num): data = self.ex.get_data(num) print(data) if data[3]==None: r = Request().choose_method(data[1],data[0],data[4],json.loads(data[2]),data[3]) else: r = Request().choose_method(data[1], data[0], data[4], json.loads(data[2]), json.loads(data[3])) print(r.text) if __name__ == '__main__': pytest.main(['-vs','testapi.py']) |
Python接口自动化测试零基础入门到精通(2023最新版)