1、什么是 apin
apin是柠檬班——木森老师开发的一个无需写代码、就可以进行接口自动化测试的框架。
只需要通过json或yaml文件编写非常简洁的用例数据,即可完成接口自动化测试,并生成自动化测试报告。
apin旨在帮助更多不会写代码的小伙伴掌握接口自动化测试的能力。框架使用起来非常简单,易上手,只需要几个小时就能大体掌握!
目前发布的是第一个版本后续会持续优化,丰富新的功能。
2、安装 apin
apin 是基于 python3.6 开发的,安装前请确认你的 python 版本 >3.6。
安装命令
pip install apin
如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386
1、项目创建
创建命令
apin create 项目名
安装好 apin 之后,打开命令终端输入创建命令,即可在当前路径下创建项目。
cd 切换到项目之中,即可看到如下的项目结构:

项目文件说明
casedata: 存放 YAML 和 JSON 格式编写的用例文件
testcases:py:存放 py 编写的用例目录
func_tools.py:自定义的函数工具文件
setting.py:整个项目的全局配置文件
run.py:项目运行入口文件
2、用例编写
apin 用例编写支持 YAML 文件,JSON 文件,py 文件三种方式,下面通过一个接口的用例 demo 来快速了解一下。
接口demo
接口地址:http://httpbin.org/post
请求方法:post
请求参数类型:application/json
请求参数:
| 参数名 | 类型 | 说明 |
| user | str | 账号 |
| pwd | str | 密码 |
JSON 编写用例
在项目的 casedata 目录下,定义一个以 test 开头的 JSON 文件,按照【apin 用例编写规范-json】编写用例即可。
案例:
- {
- "host": "http://api.XXX.com/futureloan/",
- "Cases": [
- {
- "title": "普通用户注册",
- "interface": "member/register",
- "method": "post",
- "json":{"mobile_phone":"133010121224","pwd":"lemonban"},
- "verification": []
-
- }
- ]
- }
YAML 编写用例
在项目的 casedata 目录下,定义一个以 test 开头的 YAML 文件,按照【apin 用例编写规范-yaml】编写用例即可。
案例:
- # 域名
- host: http://api.XXX.com/futureloan/
- # 用例数据
- Cases:
- - title: 普通用户注册
- interface: member/register
- method: post
- json:
- mobile_phone: ${{user_mobile}}
- pwd: lemonban
py 文件编写用例
在testcases目录中定义一个以test开头的py文件,定义一个以Test开头的类,并且继承于apin.core.httptest.HttpCase类,按照【apin用例编写规范-py】编写用例即可。
案例:
- from apin.core.httptest import HttpCase
-
- class TestStreamV3(HttpCase):
- host = "http://api.XXX.com/futureloan/"
- Cases = [
- # 用例1:普通用户注册
- {
- 'title': "普通用户注册",
- 'interface': "member/register",
- "method": "post",
- 'json': {"mobile_phone": "${{user_mobile}}", "pwd": "lemonban"},
- },
- ]
3、用例运行
方式1
终端项目路径下输入命令
apin run
方式2
直接使用 python 运行项目的 run.py 文件
4测试报告和日志
日志:项目运行完,会自动在项目路径下生成详细的运行日志

测试报告:apin 的测试报告是基第三方库 unittestreport 生成的
运行完会在项目目录的 reports 目录中,自动生成详细的 HTML 测试报告。

关于 apin 的入门使用就介绍到这里啦,后续会更新 apin 使用的详细文档~
三、用例编写规范
1概念介绍
用例集:
apin 中创建的每一个 test 开头的用例文件(py,json,yaml),被称之为一个用例集。一个用例集下面可以定义多条测试用例。
测试用例:
用例集中 Cases 字段中的一条数据就是一个测试用例。
2用例集的主要字段介绍
host:用例接口的 host 地址(接口的域名)
类型:字符串
例:
host = "http://api.lemonban.com/futureloan/"
headers:指定用例使用的请求头
类型:字典
例:
headers = {"User-Agent": "apin/musen"}
method:指定用例接口的请求方法
类型:字符串
例:post,get
interface:指定用例接口地址(接口 url 域名后面的部分)
类型:字符串
env: 设置用例集运行环境的局部变量
类型:字典
例:
env = {
"user_mobile": '13109099878',
"pwd": 'lemonban'
}
extract:指定用例请求完要提取的变量
verification:指定用例的断言
Cases:设置该测试集下的用例
3用例字段介绍
主要字段
用例集中除 env 字段之外的字段
①用例集中除 env 和 Cases 字段之外,上述用例集中的字段,均支持在用例中自定义。
②如果用例中定义了用例集中的字段,就使用自己定义的,没定义则引用 用例集中的。
title:用例的描述字段)
测试报告和日志信息中用例的描述
json: 用来传递 JSON 类型的请求参数
请求参数类型为:content-type:application/json,使用该字段来传递请求参数
data:用来传递表单类型的请求参数
请求参数类型为:content-type: application/x-www-form-urlencoded,使用该字段来传递请求参数
params: 用来查询字符串参数
请求参数,以?key=value 的形式 拼接在 url 后面的参数
其他字段
除了上述主要字段之外,python 中的 requests 库中的 requests.request 方法所有的请求参数,均支持在用例中定义字段。
这些字段在大多数情况下都用不到。
files:接口用于文件上传
请求参数类型为:content-type:application/from-data,使用该字段来传递请求参数,常用于文件上传
cookies:
请求的 cookie 信息(apin 中同一个用例集会自动化传递 cookie,一般情况下,不需要使用该字段来传递 cookie)
auth: 用于 Basic/Digest/Custom HTTP 认证
timeout:设置 http 请求超时时间
allow_redirects:是否运行请求重定向
proxies:代理请求的
stream:是否立即下载响应内容
verify:是否进行证书校验(如果要忽略 HTTPS 请求的证书校验,则将此参数设置为 False)
cert:指定校验证书的路径
4、用例编写
python 编写用
步骤一,在 testcases 目录中定义一个以 test 开头的 py 文件
步骤二,在文件中定义一个以 Test 开头的类,并且继承于 apin.core.httptest.HttpCase 类
步骤三、在类中,编写测试集的字段值
字段名 = 字段值
- from apin.core.httptest import HttpCase
- class TestDomeV3(HttpCase):
- host = "http://api.lemonban.com/futureloan/"
- headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
- # 定义测试前置方法
- setup_hook = {"timestamp": 'F{get_timestamp()}'}
- # 预设变量
- env = {
- "user_mobile": 'F{rand_phone("155")}',
- "admin_mobile": 'F{rand_phone("133")}'
- }
- # 结果校验
- verification = [
- ["eq", 0, 'V{{$..code}}'],
- ["eq", "OK", "V{{$..msg}}"]
- ]
步骤四、在 Cases 字段中编写用例数据
- from apin.core.httptest import HttpCase
- class TestDomeV3(HttpCase):
- host = "http://api.XXXX.com/futureloan/"
- headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
- # 定义测试前置方法
- setup_hook = {"timestamp": 'F{get_timestamp()}'}
- # 预设变量
- env = {
- "user_mobile": 'F{rand_phone("155")}',
- "admin_mobile": 'F{rand_phone("133")}'
- }
- # 结果校验
- verification = [
- ["eq", 200, 'status_code'],
- ["eq", {'code': 0, "msg": "OK"}, {'code': 'V{{$..code}}', "msg": "V{{$..msg}}"}]
- ]
- Cases = [
- # 用例1:普通用户注册
- {
- 'title': "普通用户注册",
- 'interface': "member/register",
- "method": "post",
- 'json': {"mobile_phone": "${{user_mobile}}", "pwd": "lemonban"},
-
- },
- # 用例2:管理员注册
- {
- 'title': "管理员注册",
- 'interface': "member/register",
- "method": "post",
- 'json': {"mobile_phone": "${{admin_mobile}}", "pwd": "lemonban", "type": 0}
- },
- ]
-
YAML 编写用例
使用yaml编写用例前 建议先去学习一下yaml的语法。
步骤一:在 casedata 中定义一个 test 开头的 YAML 文件
步骤二:在 YAML 文件中定义测试集的字段值
- # 域名
- host: http://api.xxxxx.com/futureloan/
- # 请求头
- headers:
- X-Lemonban-Media-Type: lemonban.v2
- # 用例前置钩子函数
- setup_hook:
- timestamp: F{get_timestamp()}
- # 预设运行变量
- env:
- user_mobile: F{rand_phone("155")}
- admin_mobile: F{rand_phone("133")}
- # 结果校验字段
- verification:
- - ["eq", 0, 'V{{$..code}}']
- - ["eq", "OK", "V{{$..msg}}"]
步骤三:在 Cases 字段中编写测试用例
- # 用例数据
- Cases:
- - title: 普通用户注册
- interface: member/register
- method: post
- json:
- mobile_phone: ${{user_mobile}}
- pwd: lemonban
- - title: 管理员注册
- interface: member/register
- method: post
- json:
- mobile_phone: ${{admin_mobile}}
- pwd: lemonban
- type: 0
JSON 编写用例
使用 YAML 编写用例前 建议先去学习一下 JSON 的语法,JSON 文件中字段名都需要使用双引号。
步骤一:在 casedata 中定义一个 test 开头的 JSON 文件
步骤二:在 JSON 文件中定义测试集的字段值
步骤三:在 JSON 文件中定义测试集的字段值
- {
- "host": "http://api.XXXXX.com/futureloan/",
- "headers": {"X-Lemonban-Media-Type": "lemonban.v2"},
- "setup_hook": {"timestamp": "F{get_timestamp()}"},
- "env": {
- "user_mobile": "F{rand_phone('155')}",
- "admin_mobile": "F{rand_phone('133')}"
- },
- "verification": [
- ["eq", {"code": 0, "msg": "OK"}, {"code": "V{{$..code}}", "msg": "V{{$..msg}}"}]
- ],
- "Cases": [
- {
- "title": "普通用户注册",
- "interface": "member/register",
- "method": "post",
- "json": {
- "mobile_phone": "${{user_mobile}}",
- "pwd": "lemonban"
- }
- },
- {
- "title": "管理员注册",
- "interface": "member/register",
- "method": "post",
- "json": {
- "mobile_phone": "${{admin_mobile}}",
- "pwd": "lemonban",
- "type": 0
- }
- }
- ]
- }