第三代api自动化测试框架使用教程(pytest+allure+sql+yaml)

简介: 第三代api自动化测试框架使用教程(pytest+allure+sql+yaml)

一、配置

1、环境配置

环境名称:自定义名称

headers:键值对字典格式,注意写法格式

http:协议http://或这https://

2、框架配置

Environment:框架测试环境配置,使用之前自定义的环境的名称

log_path:日志这里用自己电脑的文件路径

exclude_dir:执行用例要排除的case下的二级目录,例:‘bd’

exclude_file:执行用例要排除的case下的文件 例:‘case/mb.yaml’

raw_case_path:当前用例原始文件总目录

MYSQL_CONFIG:MYSQL_CONFIG_1,MYSQL_CONFIG_2数据库配置,使用数据库操作时使用,需要几个就写几个

submodule_list:子模块,用于数据统计,就是case目录下的所有二级目录(暂时无用)

case_amount_sum,case_amount_execute:数据统计需要无需修改

3、启动入口

二、用例编写

1、用例模板

使用请严格按照格式编写用例

#用例(名称)标题,需要参数依赖的全部设置字符格式,后期解析成字典列表等格式
用例标题0:
  #接口地址,也支持参数依赖,没写
  path: /test/${id}
  #请求方法
  method: post
  #有值就用这个,没用就使用默认配置的,有header里面使用参数依赖的场景
  headers: '{"token":"${token}"}'
  # 是否运行
  is_run: False
  # 前置sql:sql有2大类,一个是查询有返回值,一个是增删改无返回值,前置sql为无返回值类型
  #  precondition_sql:
  #    - UPDATE case_test SET title = '标题2', ex = '44' WHERE id = 2
  #    - UPDATE case_test SET title = '标题3', ex = '55' WHERE id = 3
  #请求参数较多,这里就使用原始字典格式,除了提取表达式,其他的都带上引号,预防出错,random_time()随机函数使用
  data:
    '{
           "id":${id},
           "projectNo": "320SF000206004",
           "name": ${name},
           "time": ${random_int()},
         }'
  #上传文件,文件名路径必须是英文
  file:
    '[
            ("file", ("bug.xlsx", open("C:/Users/Cassie/Desktop/bug.xlsx", "rb"),
                      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
        ]'
   #参数类型 json 或者 form表单
  data_type: json
  #从接口返回结果提取哪些字段和提取表达式,比如从返回数据提取用户id和name
  extract_key:
    id: $.id
    name: $.name
  #断言表达式
  # 除了数字类型比较,其他的字符或者表达式全部带上引号,表达式必须要写在后面(必须按照格式来)
  # 断言sql为有返回值查询
  assert_expression:
    #判断响应码是否和预期一致
    code: 200
    #判断预期值是否在返回值里面(用值是否在接口返回的内容里面判断)
    body: 内容包含
    #判断json提取值是否和预期一致(用键和值比较等于,大于小于或者in判断)
    json:
      id: $.id
      name: $.name
      1: $.int
    #判断sql查询值是否和预期一致(用键和值作判断,规则和上面一致)
    sql:
      #外层一个大列表,里面没个小列表就是一个sql断言
      #小列表断言元素1是数据库名,第二个是比较值,第三个是逻辑运算符,第四个是sql
      [["db_test2","$.book_jg","<","SELECT book_name FROM book where book_name=${book_name}"],
       ["db_test","$.title","==","SELECT title FROM case where id=${id}"]]

2、参数依赖写法

参数依赖可以写在path,headers,data里面

参数池{‘id’:1,‘name’:‘kk’,‘info’:{‘wo’:2}}

${id}: 相当于在参数池子里面取id的值也就是1

${info.wo}: 相当于在参数池子里面取wo的值也就是2

2、函数(方法插件)写法

${random_int()}:使用函数里面的这个方法

3、接口上传文件和表单参数

data:使用引号包起来的字典,作为接口表单格式参数发送(复制data里面的数据在外面加上引号)

file:使用引号包起来的python文件对象,作为接口文件格式参数发送(复制file里面的数据在外面加上引号)

调试代码

data_type: 设置为form

   import requests
    url = "https://xx/file"
    data= {'uid': '78axx90011',
               'file_name': 'bug.xlsx',
               'file_type': 'proof_of_address'}
    files = [
        ('raw_body', ('bug.xlsx', open('C:/Users/Cassie/Desktop/bug.xlsx', 'rb'), 'text/plain'))
    ]
    headers = {
        'Authorization': 'Bearer eyJ0xxxe',
        'Accept': 'application/json'}
    response = requests.request("POST", url, headers=headers, data=data, files=files)
    print(response.text)

用例写法

 data:
    "
    {'uid': '78asdf99890011',
     'file_name': 'bug.xlsx',
     'file_type': 'proof_of_address'}
    "
  file:
    "
    [
           ('raw_body', ('bug.xlsx', open('C:/Users/Cassie/Desktop/bug.xlsx', 'rb'), 'text/plain'))
       ]
    "
  data_type: form

4、接口上传json参数

data:使用引号包起来的字典,作为接口json格式参数发送(复制data里面的数据在外面加上引号)

file:不填

data_type: 设置为 json

  data:
    '
    {
        "waybill_no":"${waybill_no}",
        "lu_dan_ren":"${cc1}",
         "aa":[{"a":"${random_str(22)}"},{"b":"${random_int(2)}"},{"c":"${cc1}"},{"d":{"d1":"${random_int(2)}"}}]
    }
    '
  file:
  data_type: json

5、接口无数据填写

都填空,不写

data:
file:
data_type:

6、code断言

需要填写预期接口返回码,完全相等就是断言成功

   code: 200

7、body断言

填写预期接口返回的内容,该内容在接口返回数据里面就是断言成功

    body: 520

7、json断言

运单创建成功301是预期结果,$.msg$.book_jg是预期结果表达式(可以写多个),当预期结果和预期结果表达式从接口返回提取的值相等时就是断言成功

    运单创建成功: $.msg
    301: $.book_jg

8、sql断言

格式是一个大列表嵌套一个或者多个小列表,几条sql断言就几个小列表

sql断言第一个值: db_test2,数据库对象,需要先在config.py配置里面写上数据库连接数据,然后去mysql_.py里面生成数据库对象,然后把对象名写在db_list=[‘db_test’,‘db_test2’]上。只有在db_list里面的数据库才可以进行断言使用

sql断言第二个值:预期结果,可以写明确的值,也可以去写$.book_jg去接口返回值里面拿数据作为预期结果


sql断言第三个值:逻辑运算符 < > ==


sql断言第四个值:sql语句,可以在sql语句里面使用${case_id}去接口返回里面拿值来用,和参数依赖一样都是使用jsonpath去提取的写法。

      [['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]

9、完整断言写法:

 assert_expression:
    code: 201
    body: 520
    json:
      运单创建成功: $.msg
      301: $.book_jg
    sql:
      [['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]

三、邮件发送

配置邮箱的发送邮箱,和授权码(指定163邮箱和该邮箱的授权码)

收件人支持其他邮箱,填写格式如下

# 邮箱的地址
addresser = "xxn@163.com"
# 授权码
authorization_code = "xxxxxTN"
# 收件人
recipients=['xxxxx@gmail.com', 'lxxx@163.com']

四、全局前后置

可以自定义前置干什么后置干什么,我这边只写了后置数据统计和邮件发送

五、测试

1、启动mock接口

2、配置环境,配置mock接口的协议和域名

3、配置环境名称和用例执行目录配置,最多支持2级目录,一般一个目录一个模块

4、用例编写

获取运单号:
  path: /get_waybill_no
  method: get
  headers: '{"token": "${token}"}'
  is_run: True
  data:
  file:
  data_type:
  extract_key:
    waybill_no: $.waybill_no
  assert_expression:
    code: 200
    body: 520
    json:
      lj520: $.waybill_no
    sql:
      [
      ['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}'],
      ['db_test', '$.title', '==', 'SELECT title FROM case_t where case_id=${case_id}'],
      ['db_test', '唤醒不了', '==', 'SELECT title FROM case_t where case_id=2']
      ]
录单:
  path: /lu_dan?aa=${cc1}
  method: post
  headers: '{"token": "em123dca666333"}'
  is_run: True
  data:
    '
    {
        "waybill_no":"${waybill_no}",
        "lu_dan_ren":"${random_int(21)}",
         "aa":[{"a":"${random_str(22)}"},{"b":"${random_int(2)}"},{"c":"${cc1}"},{"d":{"d1":"${random_int(21)}"}}]
    }
    '
  file:
  data_type: json
  extract_key:
  assert_expression:
    code: 201
    body: 520
    json:
      运单创建成功: $.msg
      301: $.book_jg
    sql:
      [['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]

5、执行测试

6.邮箱配置和报告查看

记得先配置邮箱哦

邮箱报告,这里面的一个报告连接就是allure报告的地址

allure报告



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
11月前
|
数据采集 人工智能 自然语言处理
Playwright MCP 浏览器自动化框架全面解析
Playwright MCP是微软推出的开源项目,结合Playwright与MCP协议,让AI通过结构化数据直接操作浏览器。告别传统视觉识别,实现高效、精准的网页自动化,广泛应用于测试、爬虫、办公自动化等场景,大幅提升效率与可靠性。
|
12月前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
1321 11
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。
|
Java 测试技术 API
自动化测试框架深度解析与选择指南
Apache JMeter是Apache组织基于Java开发的一款压力测试工具,旨在测试软件的性能承受能力。它支持多种协议测试及功能测试,提供灵活的断言创建能力,如同创建带断言的脚本来验证程序是否返回预期结果。
|
11月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
1408 62
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
12月前
|
运维 Linux 网络安全
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
345 4
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
540 4

热门文章

最新文章