一、接口自动化测试的流程

1、需求分析

1、1请求(url,方法、数据)

2、挑选需要做自动化测试的接口

3、设计自动化测试用例

4、搭建自动化测试环境

5、设计自动化执行框架(报告、参数化、 用例执行框架)

6、编写代码

7、执行用例(unittest、pytest)

8、生成测试报告(htmltextrunner\allure)

二、用例设计

2、1单接口

模板:id,模块,接口名称,请求url,用例名称,请求方法,请求参数类型,请求参数,预期结果,实际结果,备注

注意:单接口颗粒度放的比较小(以测试数据为颗粒度)

2、2多接口

模板:id,模块,接口名称,请求url,用例名称,请求方法,请求参数类型,请求参数,预期结果,实际结果,备注

注意:多个接口颗粒度为每个接口为基础,每个接口内所设计的数据可以通过参数化来解决。

三、自动化目录结构

1、配置层(common)

import os
def filePath(fileDir='',fileName=''):
'''
:param fileDir: 目录
:param fileName: 文件的名称
:return:
'''
return os.path.join(
os.path.dirname(os.path.dirname(__file__)), fileDir, fileName)

2、用例执行业务层(testcase)

import pytest,json,allure
from util.apiutil import Request
from util.yamlutil import OperationYaml
from util.excelutil import OperationExcel,ExcelVarles obj = Request()
objYaml = OperationYaml()
objExcel = OperationExcel()
data_key = ExcelVarles class TestExcel:
# request封装
def run_api(self, url, method, params=None, headers=None, cookies=None):
if str(method).lower() == "get":
res = obj.get(url, params=params, headers=headers, cookies=cookies)
elif str(method).lower() == "post":
res = obj.post(url, json=params, headers=headers, cookies=cookies)
return res # 运行前置用例
def run_pre(self, pre_case):
url = objYaml.readbaseyaml()["test_url"] + pre_case[data_key.url]
method = pre_case[data_key.method]
params = eval(pre_case[data_key.params])
headers = pre_case[data_key.headers]
header = self.json_parse(headers)
cookies = pre_case[data_key.cookies]
res = self.run_api(url, method, params, header)
print("前置用例执行:%s" % res)
return res
@pytest.mark.parametrize('datas',objExcel.runs())
# 运行测试用例
def test_login(self,datas):
url = objYaml.readbaseyaml()["test_url"] + datas[data_key.url]
print(url)
case_id = datas[data_key.case_id]
case_model = datas[data_key.case_model]
case_name = datas[data_key.case_name]
pre_exec = datas[data_key.pre_exec]
method = datas[data_key.method]
params = eval(datas[data_key.params])
expect_result = datas[data_key.expect_result]
headers = datas[data_key.headers]
cookies = datas[data_key.cookies]
code = datas[data_key.code]
db_verify = datas[data_key.db_verify]
if pre_exec:
pass
pre_case = objExcel.case_prev(pre_exec)
print("前置条件信息为:%s" % pre_case)
pre_res = self.run_pre(pre_case)
headers = self.get_correlation(headers,pre_res)
header = self.json_parse(headers)
res = self.run_api(url, method, params, header, cookies)
print("测试用例执行:%s" % res)
assert expect_result in str(res["body"]["message"])
assert code == int(res["code"]) # 对allure报告进行配置
# allure
# sheet名称 feature 一级标签
# allure.dynamic.feature(sheet_name)
# 模块 story 二级标签
allure.dynamic.story(case_model)
# 用例ID+接口名称 title
allure.dynamic.title(case_id + case_name)
# 请求URL 请求类型 期望结果 实际结果描述
desc = "<font color='red'>请求URL: </font> {}<Br/>" \
"<font color='red'>请求类型: </font>{}<Br/>" \
"<font color='red'>期望结果: </font>{}<Br/>" \
"<font color='red'>实际结果: </font>{}".format(url, method, expect_result, res)
allure.dynamic.description(desc) def json_parse(self,data): # 格式化字符,转换json
# if headers:
# header = json.loads(headers)
# else:
# header = headers
return json.loads(data) if data else data # token参数关联替换
def get_correlation(self,header,pre_res):
# 验证是否有关联
headers_para = objExcel.params_find(header)
if len(headers_para):
# 有关联,执行前置用例,获取结果
headers_data = pre_res["body"]["data"]["token"][headers_para[0]]
# 结果替换
headers = objExcel.res_sub(header, headers_data)
return headers if __name__ == '__main__':
pytest.main(["-s", "-v", "test_single_api.py"])

3、数据驱动(data)

存放excel,yaml文件

4、测试报告(report)

5、工具层(第三方工具包)

apiutil.py

import requests

class Request():
def requests_api(self,url, json=None, headers=None, cookies=None, params=None, data=None,method="get"):
if method == "get":
r = requests.get(url=url,headers=headers,cookies=cookies,params=params,data=data)
elif method == "post":
r = requests.post(url=url,json=json,headers=headers,cookies=cookies)
elif method == "put":
r = requests.put(url=url,headers=headers,cookies=cookies,params=params)
elif method == "delete":
r =requests.delete(url=url,headers=headers,cookies=cookies,params=params)
code = r.status_code
try:
body = r.json()
except Exception as e:
body = r.text
res = dict()
res["code"] = code
res["body"] = body
return res
def get(self,url,**kwargs):
return self.requests_api(url, method="get", **kwargs)
def post(self,url,**kwargs):
return self.requests_api(url, method="post", **kwargs)
def put(self,url,**kwargs):
return self.requests_api(url, method="put", **kwargs)
def delete(self,url,**kwargs):
return self.requests_api(url, method="delete", **kwargs)

excelutil.py

import xlrd
from common.basepath import *
import json
import re p_data = '\${(.*)}\$'
class ExcelVarles:
case_id = "用例ID"
case_model = "模块"
case_name = "接口名称"
url = "请求URL"
pre_exec = "前置条件"
method = "请求类型"
params_type = "请求参数类型"
params = "请求参数"
expect_result = "预期结果"
actual_result = "实际结果"
beizhu = "备注"
is_run = "是否运行"
headers = "headers"
cookies = "cookies"
code = "status_code"
db_verify = "数据库验证" class OperationExcel:
@property
def getExcelDatas(self):
datas = list()
book = xlrd.open_workbook(filePath('data', 'api.xlsx'))
getsheet = book.sheet_by_index(0)
title = getsheet.row_values(0)
for row in range(1,getsheet.nrows):
row_values=getsheet.row_values(row)
datas.append(dict(zip(title,row_values)))
return datas def runs(self):
# 获取到可执行的测试用例
run_list=[]
for item in self.getExcelDatas:
isRun=item[ExcelVarles.is_run]
if isRun == 'y':
run_list.append(item)
else:
pass
return run_list def params(self):
'''对请求参数为空做处理'''
params_list=[]
for item in self.runs():
params=item[ExcelVarles.params]
if len(str(params).strip())==0:
pass
elif len(str(params).strip())>=0:
params=json.loads(params) def case_prev(self,casePrev):
# 据前置测试条件找到关联的前置测试用例
for item in self.getExcelDatas:
if casePrev in item.values():
return item
return None def res_find(self,data, pattern_data=p_data): # 查询
# pattern = re.compile('\${(.*)}\$')
pattern = re.compile(pattern_data)
re_res = pattern.findall(data)
return re_res def res_sub(self,data, replace, pattern_data=p_data): # 替换
pattern = re.compile(pattern_data)
re_res = pattern.findall(data)
if re_res:
return re.sub(pattern_data, replace, data)
return re_res def params_find(self,headers): # 验证请求中是否有${}$需要结果关联
if "${" in headers:
headers = self.res_find(headers)
return headers

yamlutil.py

import  yaml
from common.basepath import filePath class OperationYaml:
def readYaml(self,fileDir='data',fileName='login.yaml'): ### 获取login测试用例
with open(filePath(fileDir=fileDir, fileName=fileName),'r',encoding='utf-8') as f:
return list(yaml.safe_load_all(f)) def readbaseyaml(self,fileDir='data',fileName='base.yaml'):
with open(filePath(fileDir=fileDir, fileName=fileName), 'r', encoding='utf-8') as f:
return yaml.safe_load(f) def readgoodsyaml(self,fileDir='data',fileName='goods.yaml'): ### 获取商品测试用例
with open(filePath(fileDir=fileDir, fileName=fileName), 'r', encoding='utf-8') as f:
return list(yaml.safe_load_all(f))

6、运行入口层(运行测试用例,并生成报告)

巧用python进行接口自动化测试的更多相关文章

  1. python版接口自动化测试框架源码完整版(requests + unittest)

    python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...

  2. python+requests接口自动化测试

    转自https://my.oschina.net/u/3041656/blog/820023 原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测 ...

  3. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

  4. python之接口自动化测试框架

    梳理python+unittest接口自动化测试框架的思路: 1.确定目录: cases:存放测试用例的py文件:config:存放一些数据库,环境地址等固定不变的信息: core:核心的文件, ca ...

  5. python 做接口自动化测试框架设计

    1,明确什么叫自动化测试,什么叫接口自动化测试,如何设计接口测试用例,已登录为例 自动化测试:解放人力来自动完成规定的测试. 自动化测试分层模型:UI层,不论WEB端还是移动端,都是基于页面元素的识别 ...

  6. Python Api接口自动化测试框架 excel篇

    工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务moduleName查找对应表单,运用第三方库req ...

  7. 【接口自动化】Python+Requests接口自动化测试框架搭建【一】

    公司项目启用新框架,前后端分离,所以接口测试成为测试工作中不可缺失的一个环节,现在将从0开始搭建接口自动化测试框架的路程,一步步记录下来. 开发语言我们采用Python+第三方库Requests,测试 ...

  8. 使用python进行接口自动化测试,批量执行测试用例

    工作中,使用python的requests库进行接口自动化测试是一个比较不错的选择,今天就以某网站的免费接口为例,展示以get请求进行批量执行测试用例.话不多说直接开讲 分析一下接口信息, 请求地址: ...

  9. 基于python的接口自动化测试+ddt数据驱动

    在测试接口时,一个接口会先写好测试用例,这个用例主要针对功能,传入参时考虑到各种场景,正常的,异常的,如:参数缺省,参数传一个六位数字写用例时考虑边界情况等. 一个接口设计用例时有可能会十几条到几十条 ...

随机推荐

  1. 初识python: 集合

    集合是一个无序的,不重复的数据组合.主要作用如下:1.去重,把一个列表变成集合,会自动去重:2.关系测试,测试两组数据之前的交集.差集.并集等关系 #!/user/bin env python # a ...

  2. Redis_简介(1)

    Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作 ...

  3. spring cloud --- Zuul --- 心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 什么是 Zuul? Zuul是微服务网关,与Gateway类似 ,根据请 ...

  4. mongodb基础整理篇————常规操作[二]

    前言 简单整理一下常规操作. 正文 虽然一般说写代码看的是思想,但是呢,如果不知道mongodb 有哪些常用的操作,那么你怎么能知道mongodb是否符合你的需求,比如说如果聚合功能都没有,你得自己写 ...

  5. HDOJ3579Hello Kiki

    https://acm.hdu.edu.cn/showproblem.php?pid=3579 一些坑点.首先是如果说最后求得到的结果为0,那么在数学意义上这是正确的,0对于任何的确是最小的整数解,但 ...

  6. POJ 1664 放苹果 (递推思想)

    原题链接:http://poj.org/problem?id=1664 思路:苹果m个,盘子n个.假设 f ( m , n ) 代表 m 个苹果,n个盘子有 f ( m , n ) 种放法. 根据 n ...

  7. 【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加

    如图:配置了thanos receiver落盘的时间周期为10分钟,结果导致在切换tsdb期间,remote write接口的失败率增高. 目前看来,解决办法就是上游增加重试.

  8. django_templates模板与html页

    新建应用 上一篇通过"django-admin startproject helloworld"是创建项目,一个项目下可以有多个应用(app).打开cmd,cd到manage.py ...

  9. golang中的反射解析结构体标签tag

    package main import ( "fmt" "reflect" ) type resume struct { // 反射解析结构体标签tag Nam ...

  10. linux远程搭建yum网络仓库《全面解析》

    目录 一:远程版本需求 1.yum简介 2.yum安装解析 二:yum安装的生命周期 三:yum私有仓库作用与必要性 四:搭建yum私有仓库 本地版本 1.下载必须的软件包 2.创建软件仓库(就是创建 ...