每天掌握一个软测高级技巧:接口自动化神器apin进阶操作

之前写了一篇关于接口自动化框架 apin 入门使用是文章,主要介绍了 apin 的安装以及用例编写的方法。

今天这篇文章来给大家聊聊,apin 中的一些高级使用技巧。比如依赖接口的变量提取和引用,用例断言,以及函数工具的使用。

01  变量提取和引用

变量提取和引用主要是为了解决接口之间的参数依赖问题

使用场景:接口 A 的参数中需要使用接口 B 返回的某个数据,那么就要在请求 B 接口之后,提取数据保存,给请求 A 接口时使用。

1   变量提取

在用例集或用例数据中,通过 extract 字段指定要提取的变量。

语法:

"extract": {"变量名": ("变量保存的级别", "提取方式", "提取表达式"),
}
  • 变量名

保存数据的变量名

  • 变量保存的级别

EVN: 全局变量,settings 文件中的 EVN
env : 为局部变量(只对当前用例集有效):用例集的 env 字段

  • 提取方式

re: 正则表达式提取
jsonpath: 通过 jsonpath 提取

案例:

"extract": {
# 通过jsonpath提取
"token": ("env", "jsonpath", "$..token"),
# 通过正则表达式提取
'member_id': ("env", "re", r'"id":(.+?),')
}

2   变量引用

变量引用表达式:

$}

引用优先级:

优先引用该用例的局部变量(用例的 env 中的变量),如果局部变量不存在,则会引用全局变量(setting.py 中 ENV 中保存的变量)。

02   用例断言

关于测试用例预期结果和实际结果的比对的,apin 中封装了一个 verification 字段,只需要在 verification 中定义预期结果,实际结果提取表达式,和断言的方法,即可实现用例的断言!

1   基本语法

verification = [
[断言方式, 预期结果, 实际结果]
]

2   断言方式

apin 中目前支持两种断言方式:

断言相等 :eq

预期结果和实际结果相等

verification = [
['eq', 预期结果, 实际结果]
]

断言包含:contains

实际结果中包含预期结果的内容

verification = [
['contains', 预期结果, 实际结果]
]

3   实际结果获取

关于断言的实际结果提取,需要使用V{{表达式}} 来进行提取,表达式支持 jsonpath 正则表达式两种提取方式方式。

正则表达式提取

# 通过正则表达式来提取实际结果中的msg字段。
verification = [
['eq', {'msg':"OK"}, {"msg": "V{{msg:'(.+?)'}}"}]
]

通过 jsonpath 提取

# 通过jsonpath来提取实际结果中的msg字段。
verification = [
['eq', {'msg':"OK"}, {"msg": 'V{{$..msg}}']
]

4   HTTP 状态码的断言

上述两种方式,已可提取结果返回的数据,那如果要断言接口http请求的状态码呢?

apin中也提供了一个内置的字段名,来表示http状态码。

# 断言接口请求的http状态码是否等于200
verification = [
['eq', 200, 'status_code']
]

03   函数工具的使用

apin 支持在测试用例中调用自定义的函数来处理数据,如对数据进行加密处理、随机生成数据等等。

1   自定义函数

apin 创建的项目中有一个 funcTools.py,在该文件中可以自己定义函数,然后在用例中通过 F{xxx()}来调用。

  • 案例:funcTools.py 文件

import hashlib,random

def md5_encrypt(msg):
"""md5加密"""
md5 = hashlib.md5()
md5.update(msg.encode("utf8"))
return md5.hexdigest()

def rand_phone():
"""随机生成手机号的函数"""
import random
for i in range(8):
phone += str(random.randint(0, 9))
return str(phone)


def get_timestamp():
"""获取时间戳"""
return time.time()

  • 注意点:函数处理完的数据需要 return 返回哦

2   用例中引用函数

  • 引用表达式:F
  • demo1:用例数据中的 user,引用前面定义的 rand_phone 函数
{'title': "普通用户注册",'interface': "member/register","method": "post",'json': {"user": "F{rand_phone()}", "pwd": "lemon123"},
}
  • demo2:用例数据中的 pwd,引用前面定义的 md5_encrypt 函数对密码进行 md 加密

注意点:引用的函数,传递的参数如果是变量,则不需要在变量应用表达式外加引号

{
'title': "普通用户登录",
'interface': "member/login",
"method": "post",
'json': {"user": "13109877890", "pwd": "F{md5_encrypt('lemon123')}"},
}

# 引用函数,变量作为参数传递
{
'title': "普通用户登录",
'interface': "member/login",
"method": "post",
'json': {"user": "${{user}}", "pwd": "F{md5_encrypt(${{pwd}})}"},
}

04   项目全局配置

项目中的 setting.py 文件,是整个项目的配置文件,接下来详细介绍一下项目的配置选项。

1   debug 模式运行

项目创建之后,默认运行是开启了 debug 模式,运行过程中会输出详细的 debug 级别日志。

如果不像看运行日志,则将 settings 中的 DEBUG 设置为 Flase 即可。

# 是否开启debug模式:True为debug模式,False为关闭debug模式
DEBUG = False

2  ENV 全局的变量

将 settings.py 中的 ENV 可以设置项目全局配置

全局的域名

推荐在 ENV 中设置全局的 host,不建议在每一个测试用例中去设置 host,切换测试环境切换也更方便(如果用例数据中没有自己定义 host,会自动引用全局的 host 地址)。

ENV = {
"host":"http://WWW.XXX.com/",
}

全局的请求头

如果项目接口有必传的请求头数据,也可以直接在 ENV 中设置(如果用例数据中没有定义时,也会自动引用全局的 headers)。

ENV = {
"host":"http://WWW.XXX.com/",
"headers": {"UserAgent": "apin-test01"}
}

全局的测试数据

如果用例中需要引用事先准备好的一些测试数据,如测试账号、密码之类的

如:定义一个测试账号、测试密码、用户 id

ENV = {"host":"http://WWW.XXX.com/","headers": {"UserAgent": "apin-test01"},"user":"musen@qq.com","pwd":"lemon123","user_id":111
}

测试用例中直接使用 ${{}} 即可引用,

# 引用user和pwd
{
'title': "登录",
'interface': "member/register",
"method": "post",
'json': {"mobile_phone": "${{user}}", "pwd": "${{pwd}}"},
}

注意点:如果局部环境和全局变量重名,优先引用局部变量。

3   测试报告

通过setting中的TEST_RESULT,可以配置测试报告的输出信息。

TEST_RESULT = {
# 测试报告文件名
"filename": "report.html",
# 测试人员
"tester": "测试员",
# 报告标题
"title": "测试报告",
# 报告样式 :有1,2,三个样式
"templates": 1,
# 报告描述信息
"desc": "XX项目测试生成的报告"
}

4 邮件推送测试结果

如果要将测试结果发送到指定的邮箱中,则在 settings.py 添加 EMAIL 配置即可。

EMAIL = {
# smtp服务器地址
"host": 'smtp.qq.com',
# smtp服务器端口
"port": 465,
# 邮箱账号
"user": "xxxx@qq.com",
# smtps授权码
"password": "xxxx",
# 收件人列表
"to_addrs": ['xxx@qq.com','xxx@qq.com'],
# 是否发送附件
"is_file": True
}

5   测试结果推送到钉钉群

如果要将测试结果推送到钉钉群,则在 settings.py 添加 DINGTALK 配置即可。

DINGTALK = {
# 钉钉机器人的Webhook地址
"url": "",
# 如果钉钉机器人安全设置了关键字,则需要传入对应的关键字
"key": None,
# 如果钉钉机器人安全设置了签名,则需要传入对应的密钥
"secret": None,
# 钉钉群中要@人的手机号列表,如:[137xxx,188xxx]
"atMobiles": [],
# 是否@所有人
"isatall": False
}

6   测试结果推送到企业微信群

如果要将测试结果推送到企业微信群,则在 settings.py 添加 WECHAT 配置即可。

WECHAT = {
# 企业微信群ID
"chatid": "",
# 调用企业微信API接口的凭证
"access_token": ""
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web安全学习笔记【09】——算法2

基础[1] 入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA #知识点: 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载…

Web09--jQuery基础

1、jQuery概述 1.1 什么是jQuery jQuery是一款优秀的JavaScript的轻量级框架之一,封装了DOM操作、事件绑定、ajax等功能。特别值得一提的是基于jQuery平台的插件非常丰富,大多数前端业务场景都有其封装好的工具可直接使用。 jQuery下载和版本介绍 官…

Make.com的发送邮件功能已经登峰造极

make.com的发送邮件功能已经做到了登峰造极。 我给你个任务,让你发送个新邮件给谁谁,你一定想到SMTP服务器不就行了。 我给你第二个任务,我让你自动回复一个邮件,注意是回复。 做不到了吧~~!…

TS基础知识点快速回顾(上)

基础介绍 什么是 TypeScript? TypeScript,简称 ts,是微软开发的一种静态的编程语言,它是 JavaScript 的超集。 那么它有什么特别之处呢? js 有的 ts 都有,所有js 代码都可以在 ts 里面运行。ts 支持类型支持&#…

一篇部署frp

利用宝塔第三方插件安装Frp穿透 参考网址:https://blog.csdn.net/qq_17754023/article/details/127438606 宝塔官方第三方插件下载 https://www.bt.cn/bbs/forum.php?modattachment&aidMzQ5MDF8MTBmM2E3YTh8MTYxNDk1MTY4MXwwfDM1OTY3 网盘下载: …

HTTP 基本概念

1. HTTP (Hypertext Transfer Protocol)超文本传输协议,是互联网上应用最为广泛的协议之一。 小林coding的解析特别通俗易懂 https://xiaolincoding.com/network/2_http/http_interview.html#http-%E6%98%AF%E4%BB%80%E4%B9%88 协议&#…

Transfomer相关最新研究

文章目录 LogTrans * (有代码)TFT (有代码)InfluTran (有代码)Informer *(有代码)(长时间)ProTranAutoformer ***(有代码)AliformerPyraformer &a…

JRT的无源码发布

之前介绍过JRT最大的特点就是业务脚本化。老javaer就会说你业务代码都在发布环境放着,那怎么代码保密,在发布环境别人随便改了启不是不安全,或者一些代码我就是不想让人看源码呢。 其实JRT的业务脚本化只是特性,不是代表就必须要…

选择排序(堆排序和topK问题)

选择排序 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 如果我们用扑克牌来举例,那么选择排序就像是提前已经把所有牌都摸完了,而再进行牌…

Java中文乱码浅析及解决方案

Java中文乱码浅析及解决方案 一、GBK和UTF-8编码方式二、idea和eclipse的默认编码方式三、解码和编码方法四、代码实现编码解码 五、额外知识扩展 一、GBK和UTF-8编码方式 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节如果…

list的介绍及其模拟实现

今天我们了解list,list在python中是列表的意思 ,但是在C中它是一个带头双向循环链表: list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构&#xf…

springboot项目快速引入knife4j

引入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version> </dependency>knife4j配置文件 basePackage改为自己存放接口的包名 /*** Kn…

【网络安全 | 漏洞挖掘 】Firefox长达21年的 “陈年老bug”,终于被修复了!

Firefox 的工单记录页面显示&#xff0c;一个在 21 年前发现的 bug 终于被修复了。 根据描述&#xff0c;具体错误是表格单元格无法正确处理内容 “溢出” 的情况&#xff0c;不支持 ‘hidden’、‘auto’ 和’scroll’ 属性。 如下图所示&#xff1a; 开发者在评论中指出&a…

如何使用Stable Diffusion的ReActor换脸插件

ReActor插件是从roop插件分叉而来的一个更轻便、安装更简单的换脸插件。操作简单&#xff0c;非常容易上手&#xff0c;下面我们就介绍一下&#xff0c;如何将ReActor作为stable diffusion的插件进行安装和使用。 一&#xff1a;安装ReActor插件 项目地址&#xff1a;https:/…

计算机网络——网络层(1)

计算机网络——网络层(1&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络层&#xff1a;数据平面网络层概述核心功能协议总结 路由器工作原理路由器的工作步骤总结 网际协议IPv4主要特点不足IPv6主要特点现状 通用转发和SDN通用转发SDN&#xff08;软件…

前端[新手引导动画]效果:intro.js

目录 一、安装 二、配置 三、编写需要引导动画的页面 四、添加引导效果 一、安装 npm i intro.js 二、配置 详细配置可以参考&#xff0c;官网&#xff1a; Intro.js Documentation | Intro.js Docs https://introjs.com/docs 新建一个intro.js的文件&#xff1a; 三、…

06.Elasticsearch应用(六)

Elasticsearch应用&#xff08;六&#xff09; 1.什么是分词器 ES文档的数据拆分成一个个有完整含义的关键词&#xff0c;并将关键词与文档对应&#xff0c;这样就可以通过关键词查询文档。要想正确的分词&#xff0c;需要选择合适的分词器 2.ES中的默认分词器 fingerprint…

15- OpenCV:模板匹配(cv::matchTemplate)

目录 1、模板匹配介绍 2、cv::matchTemplate 3、模板匹配的方法&#xff08;算法&#xff09; 4、代码演示 1、模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。 它可以在一幅图像中寻找与给定模板最相似的部分。 模板匹配的步骤&#xff1a; &a…

Unity中URP下计算额外灯的方向

文章目录 前言一、为什么额外灯的方向&#xff0c;不像主平行灯一样直接获取&#xff1f;1、主平行灯2、额外灯中&#xff0c;包含 点光源、聚光灯 和 平行灯 二、获得模型顶点指向额外灯的单位向量三、Unity中的实现 前言 在上一篇文章中&#xff0c;我们获取了URP下额外灯的…

eNSP学习——交换机配置Trunk接口

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验编址&#xff1a; 试验步骤 基本配置 创建VLAN&#xff0c;配置Access接口 配置Trunk接口 思考题 原理概述 在以太网中&#xff0c;通过划分VLAN来隔离广播域和增强网络通信的安全性。以太网通常由多台交换机组…