接口自动化神器appium进阶操作

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.niftyadmin.cn/n/147553.html

相关文章

【SpringMVC】SpringMVC面试题总结

SpringMVC面试题1、SpringMVC的理解2、SpringMVC的工作流程3、SpringMVC的常用注解4、SpringMVC的九大内置组件5、Spring、SpringMVC、SpringBoot的区别1、SpringMVC的理解 2、SpringMVC的工作流程 3、SpringMVC的常用注解 RequestMapping: 用于处理请求url映射的注解&#xf…

Matlab具有状态相关延迟的 DDE

使用ddesd求解具有状态相关延迟的 DDE(延迟微分方程)系统。这个 DDE 系统被 Enright 和 Hayashi [1] 用作测试问题。 方程组是 y1′(t)=y2(t), y

Vector - CAPL - 字符串复制与替换函数

在开发脚本过程中,经常会涉及到字符串的复制与替换处理,相较于C语言,CAPL中做了些许改动,并提供了一些范例供我们学习,方便我们更加快速的去完成脚本开发。下面介绍的主要是字符串的复制与替换,我们使用的时…

小迪安全day04

小迪安全day04 记:今天刚刚结束四级考试,希望四级稳过!!!(ps:开学考终于要差不多了,还差一个英语期末考试) 一结束考试,就开始搞喜欢的安全了!&…

Python中类的定义和使用细讲

文章目录前言一、定义类二、创建类的实例三、创建 _ _ init _ _() 方法四、创建类的成员并访问1. 创建实例方法并访问2. 创建数据成员并访问五、访问限制前言 在 Python 中,类表示具有相同属性和方法的对象的集合。在使用类时,需要先定义类,然…

底层原理计划--线程与线程池

线程 线程安全的集合 Vector hashtable 》synchronized 使用Collections包装成线程安全,本质上是将原本的集合在执行之前加上了synchronized(){}的对象锁,将对象先锁定再来运行。 》synchronized Synchronize lock区别 synchronized jvm 自动释放锁 L…

职业规划——我是怎么在第一份工作中就能做到运维部门副经理的?

这个标题一出来,想必应该就有相当一部分人在无限嘴嗨: “what?这人装啥B,吹B也不带打草稿的?” “还以为是哪个大厂出来的?就一无名小公司,坐上去不停容易的嘛,还发出来博人眼球干啥…

ubuntu 20.04.3 LTS安装RabbitVCS SVN图形化客户端

我们一般在Windows环境下用的SVN是TortoiseSVN,如果想在Linux下使用SVN,那么图形化界面的RabbitVCS客户端软件是一个不错的选择,他和TortoiseSVN的功能基本一样。 其官网下载地址为http://wiki.rabbitvcs.org/wiki/download,Rabbi…