SkillAgentSearch skills...

PytestAutoApi

本框架主要是基于 Python + pytest + allure + log + yaml + mysql + 钉钉通知 + Jenkins 实现的接口自动化框架,本框架优势在于易维护,功能丰富,测试人员只需要维护测试用例,零基础小白也可以快速上手,框架支持多环境、多角色任意切换,支持接口响应断言以及数据库断言。

Install / Use

/learn @yushaoqi/PytestAutoApi
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

框架介绍

本框架主要是基于 Python + pytest + allure + log + yaml + mysql + redis + 钉钉通知 + Jenkins 实现的接口自动化框架。

如果对您有帮助,请点亮 小星星 以表支持,谢谢

img.png

前言

公司突然要求你做自动化,但是没有代码基础不知道怎么做?或者有自动化基础,但是不知道如何系统性的做自动化, 放在yaml文件中维护,不知道如何处理多业务依赖的逻辑?

那么这里 Gitte 中开源的自动化框架,将为你解决这些问题。 框架主要使用 python 语言编写,结合 pytest 进行二次开发,用户仅需要在 yaml 文件中编写测试用例, 编写成功之后,会自动生成 pytest 的代码,零基础代码小白,也可以操作。

本框架支持多业务接口依赖,多进程执行,mysql 数据库断言和 接口响应断言,并且用例直接在yaml文件中维护,无需编写业务代码, 接口pytest框架生成allure报告,并且发送 企业微信通知/ 钉钉通知/ 邮箱通知/ 飞书通知,灵活配置。

实现功能

  • 测试数据隔离, 实现数据驱动
  • 支持多接口数据依赖: 如A接口需要同时依赖B、C接口的响应数据作为参数
  • 数据库断言: 直接在测试用例中写入查询的sql即可断言,无需编写代码
  • 动态多断言: 如接口需要同时校验响应数据和sql校验,支持多场景断言
  • 自动生成用例代码: 测试人员在yaml文件中填写好测试用例, 程序可以直接生成用例代码,纯小白也能使用
  • 代理录制: 支持代理录制,生成yaml格式的测试用例
  • 统计接口的运行时长: 拓展功能,订制开关,可以决定是否需要使用
  • 日志模块: 打印每个接口的日志信息,同样订制了开关,可以决定是否需要打印日志
  • 钉钉、企业微信通知: 支持多种通知场景,执行成功之后,可选择发送钉钉、或者企业微信、邮箱通知
  • 自定义拓展字段: 如用例中需要生成的随机数据,可直接调用
  • 多线程执行
  • 支持swagger接口文档转成yaml用例,节省用例编写时间

遇到问题

  • 请仔细阅读文档,文档中几乎可以帮你避免所有的问题
  • 可以添加微信: being_chaoren, 添加微信会将你拉倒自动化交流群中,群内有很多热心的小伙伴,但是前提是希望你已经阅读了文档中的所有内容
  • 你也可以请作者为你解答,当然我不是免费的

img.png

目录结构

├── common                         // 配置
│   ├── conf.yaml                  // 公共配置
│   ├── setting.py                 // 环境路径存放区域
├── data                           // 测试用例数据
├── File                           // 上传文件接口所需的文件存放区域
├── logs                           // 日志层
├── report                         // 测试报告层
├── test_case                      // 测试用例代码
├── utils                          // 工具类
│   └── assertion                
│       └── assert_control.py      // 断言
│       └── assert_type.py         // 断言类型
│   └── cache_process              // 缓存处理模块
│       └── cacheControl.py
│       └── redisControl.py  
│   └── logUtils                   // 日志处理模块
│       └── logControl.py
│       └── logDecoratrol.py       // 日志装饰器
│       └── runTimeDecoratrol.py   // 统计用例执行时长装饰器
│   └── mysqlUtils                 // 数据库模块
│       └── get_sql_data.py       
│       └── mysqlControl.py   
│   └── noticUtils                 // 通知模块
│       └── dingtalkControl.py     // 钉钉通知 
│       └── feishuControl.py       // 飞书通知
│       └── sendmailControl.py     // 邮箱通知
│       └── weChatSendControl.py   // 企业微信通知
│   └── otherUtils                 // 其他工具类
│       └── allureDate             // allure封装
│           └── allure_report_data.py // allure报告数据清洗
│           └── allure_tools.py   // allure 方法封装
│           └── error_case_excel.py   // 收集allure异常用例,生成excel测试报告
│       └── localIpControl.py      // 获取本地IP
│       └── threadControl.py       // 定时器类
│   └── readFilesUtils             // 文件操作
│       └── caseAutomaticControl.py // 自动生成测试代码 
│       └── clean_files.py          // 清理文件
│       └── excelControl.py         // 读写excel
│       └── get_all_files_path.py   // 获取所有文件路径
│       └── get_yaml_data_analysis.py // yaml用例数据清洗
│       └── regularControl.py        // 正则
│       └── yamlControl.py          // yaml文件读写
│   └── recordingUtils             // 代理录制
│       └── mitmproxyContorl.py
│   └── requestsUtils 
│       └── dependentCase.py        // 数据依赖处理
│       └── requestControl.py      // 请求封装
│   └── timeUtils
├── Readme.md                       // help
├── pytest.ini                  
├── run.py                           // 运行入口  

依赖库

allure-pytest==2.9.45
allure-python-commons==2.9.45
atomicwrites==1.4.0
attrs==21.2.0
certifi==2021.10.8
cffi==1.15.0
charset-normalizer==2.0.7
colorama==0.4.4
colorlog==6.6.0
cryptography==36.0.0
DingtalkChatbot==1.5.3
execnet==1.9.0
Faker==9.8.3
idna==3.3
iniconfig==1.1.1
jsonpath==0.82
packaging==21.3
pluggy==1.0.0
py==1.11.0
pycparser==2.21
PyMySQL==1.0.2
pyOpenSSL==21.0.0
pyparsing==3.0.6
pytest==6.2.5
pytest-forked==1.3.0
pytest-xdist==2.4.0
python-dateutil==2.8.2
PyYAML==6.0
requests==2.26.0
six==1.16.0
text-unidecode==1.3
toml==0.10.2
urllib3==1.26.7
xlrd==2.0.1
xlutils==2.0.0
xlwt==1.3.0

安装教程

首先,执行本框架之后,需要搭建好 python、jdk、 allure环境

搭建python教程:http://c.biancheng.net/view/4161.html

搭建jdk环境:https://www.cnblogs.com/zll-wyf/p/15095664.html

安装allure:https://blog.csdn.net/m0_49225959/article/details/117194318

如上环境如都搭建好,则安装本框架的所有第三方库依赖,执行如下命令

pip3 install -r requirements.txt

img.png

如果在安装过程中出现如下 Could not find a version 类似的异常, 不用担心,可能是因为你安装的python环境 版本和我不一致导致的,直接 pip install 库名称,不指定版本安装就可以了。

如上方截图说没有找到 asgiref==3.5.1,报错的意思是,没有找到3.5.1这个版本,那么直接控制台输入 pip3 install asgiref 进行安装即可

接口文档

这里非常感谢一位安卓的朋友,给我推荐了开源的接口文件,框架中会针对开源接口中的登录、个人信息、收藏(新增、查看、修改、删除)等功能,编写结果自动化案例 下方是接口文档地址,大家可以自行查看(因为开源的接口,里面有些逻辑性的功能,如修改被删除的网址接口并没有过多的做判断, 因此用例中只写了一些基础的场景,仅供大家参考。) https://wanandroid.com/blog/show/2

如何创建用例

创建用例步骤

1、在data文件夹下方创建相关的yaml用例

2、写完之后,需要执行 utils\readFilesUtils\caseAutomaticControl.py 这个文件,生成自动化代码

3、执行caseAutomaticControl.py文件之后,会发现,在test_case层新增该条用例的对应代码,可直接执行该用例调试

4、注意,如果生成对应的测试代码之后,期间有更改过yaml用例中的内容,需要重新生成代码,必现因为更改yaml用例之后导致运行失败

5、当所有接口都编写好之后,可以直接运行run.py主程序,执行所有自动化接口

下面我们来看一下,如何创建用例

用例中相关字段的介绍

img.png

上方截图,就是一个用例中需要维护的相关字段,下面我会对每个字段的作用,做出解释。

img.png

如何发送get请求

上方了解了用例的数据结构之后,下面我们开始编写第一个get请求方式的接口。 首先,开始编写项目之后,我们在 conf.yaml 中配置项目的域名

img.png

域名配置好之后,我们来编写测试用例,在 data 文件下面,创建一个名称为 collect_tool_list.yaml 的用例文件,请求/lg/collect/usertools/json这个收藏网址列表接口,所有接口的详细信息,可以在接口文档中查看,下方不在做赘述

接口文档:https://wanandroid.com/blog/show/2

# 公共参数
case_common:
  allureEpic: 开发平台接口
  allureFeature: 收藏模块
  allureStory: 收藏网址列表接口

collect_tool_list_01:
    host: ${{host()}}
    url: /lg/collect/usertools/json
    method: GET
    detail: 查看收藏网址列表接口
    headers:
      Content-Type: multipart/form-data;
      # 这里cookie的值,写的是存入缓存的名称
      cookie: login_cookie
    # 请求的数据,是 params 还是 json、或者file、data
    requestType: data
    # 是否执行,空或者 true 都会执行
    is_run:
    data:
      pageNum: 1
      pageSize: 10
    # 是否有依赖业务,为空或者false则表示没有
    dependence_case: False
        # 依赖的数据
    dependence_case_data:
    assert:
      # 断言接口状态码
      errorCode:
        jsonpath: $.errorCode
        type: ==
        value: 0
        AssertType:
    sql:

get请求我们 requestType 写的是 params ,这样发送请求时,我们会将请求参数拼接中url中,最终像服务端发送请求的地址格式会为:

如: ${{host()}}/lg/collect/usertools/json?pageNum=1&pageSize=10

如何发送post请求

# 公共参数
case_common:
  allureEpic: 开发平台接口
  allureFeature: 收藏模块
  allureStory: 收藏网址接口

collect_addtool_01:
    host: ${{host()}}
    url: /lg/collect/addtool/json
    method: POST
    detail: 新增收藏网址接口
    headers:
      Content-Type: multipart/form-data;
      # 这里cookie的值,写的是存入缓存的名称
      cookie: login_cookie
    # 请求的数据,是 params 还是 json、或者file、data
    requestType: data
    # 是否执行,空或者 true 都会执行
    is_run:
    data:
      name: 自动化生成收藏网址${{random_int()}}
      link: https://gitee.com/yu_xiao_qi/pytest-auto-api2
    # 是否有依赖业务,为空或者false则表示没有
    dependence_case: False
        # 依赖的数据
    dependence_case_data:
    assert:
      # 断言接口状态码
      errorCode:
        jsonpath: $.errorCode
        type: ==
        value: 0
        AssertType:
    sql:
        

这里post请求,我们需要请求的数据格式是json格式的,那么requestType 则填写为json格式。 包括 PUT/DELETE/HEAD 请求的数据格式都是一样的,唯一不同的就是需要配置 reuqestType, 如果需要请求的参数是json格式,则requestType我们就填写json,如果是url拼接的形式,我们就填写 params

如何测试上传文件接口

首先,我们将所有需要测试的文件,全部都放在 files 文件夹中 img.png

requestType: file
# 是否执行,空或者 true 都会执行
is_run:
data:
  file:
     xxx: 排入水体名.png

在yaml文件中,我们需要注意两个地方,主要是用例中的requestType、和 filename 字段:

  • requestType: 上传文件,我们需要更改成 file
  • file: 上传文件中,新增一个file关键字,在下方传我们需要的数据
  • file_name: 首先,这个xxx是我们公司接口定义的上传文件的参数,排入水体名.png 这个是我们放在Files这个文件夹下方的文件名称 程序在执行的时候,会判断如果你的requestType为 file的时候,则会去执行file下方的参数,然后取到文件名称直接去执行用例

上传文件接口,即需要上传文件,又需要上传其他参数

requestType: file
# 是否执行,空或者 true 都会执行
is_run:
data:
  file:
     file_name: 排入水体名.png
  data:
     is_upload: 0
  params:
     collect: false

上方的这个案例,请求参数即上传了文件,又上传了其他参数

  • 1、file: 这里下方上传的是文件参数
  • 2、data: 这个data下方是该接口,除了文件参数,还需要上传其他的参数,这个参数会以json的方式传给服务端(如果没有其他参数,可以不用写这个)
  • 3、params: 这个是除了文件参数以外的,上传的其他参数,这个参数是拼接在url后方的

img.png

为了方便大家理解,上方将该参数,以postman的形式上传

多业务逻辑,如何编写测试用例

多业务这一块,我们拿个简单的例子举例,比如登录场景,在登陆之前,我们需要先获取到验证码。

img.png

img.png

首先,我们先创建一个 get_send_sms_code.yaml 的文件,编写一条发送验证码的用例

# 公共参数
case_common:
  allureEpic: 盲盒APP
  allureFeature: 登录模块
  allureStory: 获取登录验证码

send_sms_code_01:
    host: ${{host()}}
    url: /mobile/sendSmsCode
    method: POST
    detail: 正常获取登录验证码
    headers:
      appId: '23132'
      masterAppId: masterAppId
      Content-Type: application/json;charset=UTF-8
    # 请求的数据,是 params 还是 json、或者file
    requestType: json
    # 是否执行,空或者 true 都会执行
    is_run:
    data:
      phoneNumber: "180****9278"
      # 是否有依赖业务,为空或者false则表示没有
    dependence_case: False

Related Skills

View on GitHub
GitHub Stars365
CategoryData
Updated18h ago
Forks100

Languages

Python

Security Score

85/100

Audited on Apr 1, 2026

No findings