ApiTesting全链路自动化测试框架 - 初版发布(一)
简介
此框架是基于Python+Pytest+Requests+Allure+Yaml+Json实现全链路接口自动化测试。
主要流程:解析接口数据包 ->生成接口基础配置(yml) ->生成测试用例(yaml+json) ->生成测试脚本(.py) ->运行测试(pytest) ->生成测试报告(allure)
测试流程:初始化请求 ->处理接口基础信息 ->读取前置接口用例 ->发送前置接口 ->处理当前接口数据 ->发送当前接口 ->检查接口返回
接口自动化测试无非分几大块:测试用例设计、测试脚本编写、测试结果校验、测试报告生成、测试配置管理。
其中常见有几大难点:接口之间依赖关联、测试数据与脚本分离、测试数据参数化处理、全量自动化耗时。
而这些本框架通通已为你解决,你无须编写任何代码,只需要你抓取接口数据包即可。
关于接口依赖:你只要填写前置接口相对路径即可,如果存在数据依赖关系,此时你也仅需要填写前置接口对应的参数值,本框架将自动为你调用和替换关联数据。
关于测试数据:本框架采用yaml记录接口基本信息,当请求参数和结果较大时,将单独保存到json文件中,解决各类数据的错综复杂问题。
关于参数化:本框架采用常用工具使用的变量标识 ${var} ,通过正则表达式,自动检索变量,自动为你替换变量,并且为你提供多种函数助手【$RandInt()、$GenGuid()】为你解决测试数据生成问题。
关于用例执行:本框架利用pytest扩展库,支持多线程模式、失败用例重试、用例模糊匹配等。
目前主要支持四种运行模式:
> 0 -不开启自动生成测试用例功能,将直接运行测试
> 1 -根据手工编写用例,自动生成测试脚本,然后运行测试
> 2 -根据接口抓包数据,自动生成测试用例和测试脚本,然后运行测试
> 3 -根据接口抓包数据,自动生成测试用例和测试脚本,但不运行测试
注意:目前解析仅支持(.chlsj)格式,请使用Charles工具抓包导出JSON Session File
目前支持多种函数助手(以下仅为示例,之后将单独说明):
print('替换变量并计算表达式:', replace('$Eval(${unitCode}*1000+1)', {'unitCode': 9876543210}))
print('生成1-9之间的随机数:', replace('$RandInt(1,9)'))
print('生成10位随机字符:', replace('$RandStr(10)'))
print('从列表中随机选择:', replace('$RandChoice(a,b,c,d)'))
print('生成一个伪手机号:', replace('$GenPhone()'))
print('生成一个guid:', replace('$GenGuid()'))
print('生成一个伪微信ID:', replace('$GenWxid()'))
print('生成一个伪身份证:', replace('$GenNoid()'))
print('生成一个18岁伪身份证:', replace("$GenNoid(y-18)"))
print('生成下个月今天的日期:', replace("$GenDate(m+1)"))
print('生成昨天此时的时间:', replace("$GenDatetime(d-1)"))
替换变量并计算表达式: 9876543210
生成1-9之间的随机数: 9
生成10位随机字符: CB8512d4E6
从列表中随机选择: d
生成一个伪手机号: 18890688629
生成一个guid: 78A6698C-6793-11EB-8221-005056C00008
生成一个伪微信ID: AUTO9K6MRzVGfsNB4ZkIuSdXravD
生成一个伪身份证: 999577202102052043
生成一个18岁伪身份证: 953700200302056259
生成下个月今天的日期: 2021-03-05
生成昨天此时的时间: 2021-02-04 17:21:04.696745
框架流程图
项目结构
执行入口(startup.py)
# -*- coding:utf-8 -*-
# @Time : 2021/2/1
# @Author : Leo Zhang
# @File : startup.py
# ***********************
import os
import sys
import pytest
import logging if __name__ == '__main__':
from comm.script import writeLogs, writeCase
from config import * # 开启日志记录(默认logs目录)
writeLogs.MyLogs(ROOT_DIR+'logs') # 判断运行模式
if RC['auto_switch'] == 3:
logging.info("根据接口抓包数据,自动生成测试用例和测试脚本,但不运行测试!")
writeCase.write_case(DATA_DIR, auto_yaml=True)
sys.exit(0) elif RC['auto_switch'] == 2:
logging.info("根据接口抓包数据,自动生成测试用例和测试脚本,然后运行测试!")
writeCase.write_case(DATA_DIR, auto_yaml=True) elif RC['auto_switch'] == 1:
# 如果扫描路径为空在则取项目page目录
if not os.path.exists(RC['scan_dir']):
RC['scan_dir'] = PAGE_DIR
logging.info("根据手工编写用例,自动生成测试脚本,然后运行测试!")
writeCase.write_case(RC['scan_dir'], auto_yaml=False) else:
logging.info("不开启自动生成测试用例功能,将直接运行测试!") # 定义运行参数
args_list = ['-vs', TEST_DIR,
'-n', str(RC['process']),
'--reruns', str(RC['reruns']),
'--maxfail', str(RC['maxfail']),
'--alluredir', REPORT_DIR+'/xml',
'--clean-alluredir']
# 判断是否开启用例匹配
if RC['pattern']:
args_list += ['-k ' + str(RC['pattern'])]
test_result = pytest.main(args_list) # 生成allure报告
cmd = 'allure generate --clean %s -o %s ' % (REPORT_DIR+'/xml', REPORT_DIR+'/html')
os.system(cmd)
运行配置(runConfig.yml)
# 运行项目名
project_name: PyDemo # 运行模式:
auto_switch: 2
# 0 -不开启自动生成测试用例功能,将直接运行测试
# 1 -根据手工编写用例,自动生成测试脚本,然后运行测试
# 2 -根据接口抓包数据,自动生成测试用例和测试脚本,然后运行测试
# 3 -根据接口抓包数据,自动生成测试用例和测试脚本,但不运行测试
# 注意:目前解析仅支持(.chlsj)格式,请使用Charles工具抓包导出JSON Session File # 扫描测试用例目录(且仅当auto_switch=1时有用)
scan_dir: # 使用模糊匹配测试用例(空则匹配所有)
pattern: # 执行并发线程数(0表示不开启)
process: 0 # 失败重试次数(0表示不重试)
reruns: 0 # 本轮测试最大允许失败数(超出则立即结束测试)
maxfail: 20 # 接口调用间隔时间(s)
interval: 1 # 测试结果校验方式说明(共5种方式):
# no_check:不做任何校验
# check_code:仅校验接口返回码code
# check_json:校验接口返回码code,并进行json格式比较返回结果(默认方式)
# entirely_check:校验接口返回码code,并进行完整比较返回结果
# regular_check:校验接口返回码code,并进行正则匹配返回结果
测试脚本基础模板(test_template.py)
# -*- coding:utf-8 -*-
# @Time : 2021/2/2
# @Author : Leo Zhang
# @File : test_template.py
# ****************************
import os
import allure
import pytest
from comm.utils.readYaml import read_yaml_data
from comm.unit.initializePremise import init_premise
from comm.unit.apiSend import send_request
from comm.unit.checkResult import check_result
case_yaml = os.path.realpath(__file__).replace('testcase', 'page').replace('py', 'yaml')
case_path = os.path.dirname(case_yaml)
case_dict = read_yaml_data(case_yaml) @allure.feature(case_dict["test_info"]["title"])
class TestTemplate: @pytest.mark.parametrize("case_data", case_dict["test_case"])
@allure.story("test_template")
def test_template(self, case_data):
# 初始化请求:执行前置接口+替换关联变量
test_info, case_data = init_premise(case_dict["test_info"], case_data, case_path)
# 发送当前接口
code, data = send_request(test_info, case_data)
# 校验接口返回
check_result(case_data, code, data)
接口配置示例(apiConfig.yml)
PyDemo:
host: 10.88.88.141:20037
headers:
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
cookies:
headtoken: xu5YwIZFkVGczMn0H0rot2ps7zRIbvrTHNwMXx1sJXg=
测试用例示例(findParam.yaml)
test_info:
title: register
host: ${host}
scheme: http
method: POST
address: /api/register/findParam
mime_type: application/x-www-form-urlencoded
headers: ${headers}
timeout: 10
file: false
cookies: false
premise: false
test_case:
- summary: findParam
describe: test_findParam
parameter:
params:
unitCode: '3202112002'
first: 0
pym: ''
pageSize: 10
page: 0
headtoken: ${headtoken}
check:
check_type: check_json
expected_code: 200
expected_result:
success: true
code:
msg: 返回成功
data:
- '1'
- '1'
callTime:
测试报告示例(allure)
实战演示
1、首先环境准备:Python + Allure (这里不做详细说明,请参考我Pytest分类博文)
接着下载项目:https://github.com/Leozhanggg/ApiTesting (方便的话给个星,不要白嫖呀,哈哈。。。)
然后加载依赖:pip install -r requirements.txt
(或者使用Pycharm打开,会自动弹出提示安装)
2、使用Charles工具抓取接口数据包,并且导出选择JSON Session File (.chlsj) 格式 (工具自己百度下载吧)
3、新建一个项目MyTest目录和一个data目录,把抓取的接口数据包放置进来,然后修改runConfig.yml项目名为MyTest
4、直接开始运行,然后你就会发现项目目录多了很多文件,测试已经完成。。。没错,就是这么简单,你还可以查看allure报告。
谈谈我自己
以往我使用过多种基于Python的自动化测试框架,特别是robotframework,简单易上手,对于培养普通测试工程师比较迅速,但是优点同时也是缺点,由于RF自身局限性,会让简单的语法变得复杂化,
如果你不做分层处理,可能会出现一条简单的测试用例编需要写上百行,后期维护更是非常麻烦,我记得有一次检查测试工程师的自动化测试用例时,发现竟然有两百多行,对于RF这种表格语法两百多行你知道阅读是多么的痛苦嘛。。。
当然这也是源于我们的项目性质,由于大数据业务,接口只是一小部分,而数据的校验才是大头,并且涉及到多类数据库,比如redis、mysql、es、hbase、solr等,而且有的接口会同时保存到多个表然后同步到多个数据库,校验点数不过来。。。
就这样前前后后我带领着几个测试工程师改了几版,虽然最后大大的减少了测试代码,但是依然还是很多,并且运行时长很难解决。所以从去年开始使用pytest测试框架,当然这也是我首次接触pytest,第一个项目也改了几版,但是由于纯pytest编写,
所有的东西都在一块,改起来也比较简单,最终的效果当然是质的提升,首先时代码方面可以轻松的做分层处理,不会受到RF之类的框架限制,而在执行时长方面可以采用pytest自身的多线程模块,大大减少执行时长,同时大大提高了框架的扩展性。
而本框架源于https://github.com/wangxiaoxi3/API_service项目,加上自己实际项目实施经验重构而来,保留了核心功能,增加了自己对接口自动化测试的理解。
特别对于关联值处理方面,不在需要手动标记,而采用自动检索方式,另外关于前置接口处理,也不在需要手动编写,只需要指定前置接口相对路径即可,并且多个用例可以嵌套。
但是目前开发的第一版并没有加入数据库校验,仅为了单纯接口的自动化测试,后期将考虑加入数据库校验模块。以下为本人实际项目数据库校验示例:
※ 如果有任何疑问可以留言,当然如果觉得写得不错可以收藏、推荐一下,另外github帮忙给个星!!!
作者:Leozhanggg
出处:https://www.cnblogs.com/leozhanggg/p/14373878.html
源码:https://github.com/Leozhanggg/ApiTesting
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
ApiTesting全链路自动化测试框架 - 初版发布(一)的更多相关文章
- ApiTesting全链路接口自动化测试框架 - 新增数据库校验(二)
在这之前我完成了对于接口上的自动化测试:ApiTesting全链路接口自动化测试框架 - 初版(一) 但是对于很多公司而言,数据库的数据校验也尤为重要,另外也有小伙伴给我反馈希望支持. 所以最近几天我 ...
- ApiTesting全链路接口自动化测试框架 - 实战应用
场景一.添加公共配置 我们在做自动化开始的时候,一般有很多公共的环境配置,比如host.token.user等等,如果这些放在用例中,一旦修改,将非常的不便.麻烦(尤其切换环境). 所以这里我们提供了 ...
- 基于C#实现的自动化测试框架:发布自动触发自动化回归测试
接口自动化测试用例完成以后,以前都是发布以后手动运行测试用例.虽然手动运行下脚本也就是一个F5的事情,但是离自动化测试的标准差得很远.这两天有了个大胆的想法,想要实现以下发布时直接触发自动化回归测试用 ...
- Flutter 1.5 发布,正式成为全平台 UI 框架!
一. 序 在 Google I/O 2019 上,Dart 团队宣布推出新的 Flutter 稳定版本 1.5,这是 Flutter 迄今为止最大的一次版本发布. 伴随着 Flutter 1.5 的发 ...
- RobotFramework自动化测试框架-Selenium Web自动化(三)关于在RobotFramework中如何使用Selenium很全的总结(下)
本文紧接着RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)继续分享RobotFramewor ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
- 持续引领大数据行业发展,腾讯云发布全链路数据开发平台WeData
9月11日,在腾讯全球数字生态大会大数据专场上,腾讯云大数据产品副总经理雷小平重磅发布了全链路数据开发平台WeData,同时发布和升级了流计算服务.云数据仓库.ES.企业画像等6款核心产品,进一步优化 ...
- RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)
好久没有继续分享关于自动化测试相关的东西了,自动化在现今的测试领域已经越来越重要了,大部分公司在测试岗位招聘中都需要会相关的自动化测试知识.而 RobotFramework自动化测试框架 是自动化测试 ...
- 技术部突然宣布:JAVA开发人员全部要会接口自动化测试框架
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 写在前边 用单元测试Junit完全可以满足日常开发自测,为什么还 ...
随机推荐
- linux IP 注释
DEVICE=name,这里name是物理设备的名字(动态分配的PPP设备应当除外,它的名字是"逻辑名". IPADDR=addr, 这里addr是IP地址. NETMASK=ma ...
- Mybatis-plus的使用步骤
Mybatis-plus的简单使用步骤 花开堪折直需折,莫待无花空折枝 导入依赖 <dependency> <groupId>org.projectlombok</gro ...
- NOIP初赛篇——09原码、反码和补码
一.数的原码.补码和反码表示 机器数和真值 在计算机中,表示数值的数字符号只有0和1两个数码,我们规定最高位为符号位,并用0表示正符号,用1表示负符号.这样,机器中的数值和符号全"数码化 ...
- PAT甲级 1155 Heap Paths (30分) 堆模拟
题意分析: 给出一个1000以内的整数N,以及N个整数,并且这N个数是按照完全二叉树的层序遍历输出的序列,输出所有的整条的先序遍历的序列(根 右 左),以及判断整棵树是否是符合堆排序的规则(判断是大顶 ...
- C#中的异步和多线程
许多开发人员对异步代码和多线程以及它们的工作原理和使用方法都有错误的认识.在这里,你将了解这两个概念之间的区别,并使用c#实现它们. 我:"服务员,这是我第一次来这家餐厅.通常需要4个小时才 ...
- Ubuntu 18.04.4 系统优化
1 ) 允许root远程登录: sudo apt install vim git net-tools openssh-server sudo vim /etc/ssh/sshd_config .... ...
- python模块详解 | pyquery
简介 pyquery是一个强大的 HTML 解析库,利用它,我们可以直接解析 DOM 节点的结构,并通过 DOM 节点的一些属性快速进行内容提取. 官方文档:http://pyquery.readth ...
- 如何实现一个简易版的 Spring - 如何实现 Constructor 注入
前言 本文是「如何实现一个简易版的 Spring」系列的第二篇,在 第一篇 介绍了如何实现一个基于 XML 的简单 Setter 注入,这篇来看看要如何去实现一个简单的 Constructor 注入功 ...
- 【MySQL】centos6中/etc/init.d/下没有mysqld启动文件,怎么办
如果/etc/init.d/下面没有mysqld的话,service mysqld start也是不好使的,同样,chkconfig mysqld on也是不能用 解决办法: 将mysql的mysql ...
- 【Oracle】Oracle SQL的优化软件
对于SQL开发人员和DBA来说,根据业务需求写出一条正确的SQL很容易.但是SQL的执行性能怎么样呢?能优化一下跑得更快吗?如果不是资深 DBA,估计很多人都没有信心. 幸运的是,自动化优化工具可以 ...