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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 第三代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;
相关文章
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
476 11
|
4月前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
149 4
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
291 11
|
7月前
|
人工智能 自然语言处理 JavaScript
专为 Claude Code 设计的基于 YAML 的 Playwright MCP 自动化测试
YAML配置结合Claude Code与Playwright MCP,将自动化测试变得人人可用。通过简洁的YAML语法替代复杂的JavaScript代码,解决传统测试中冗长、硬编码和复用性差等问题。自然语言描述测试步骤,AI解析执行,支持多环境切换与智能报告生成,极大降低技术门槛,提升团队协作效率。无论是开发、QA还是产品经理,都能轻松参与测试流程,真正实现可读、易维护的自动化测试新范式。
1478 3
|
存储 人工智能 开发框架
Kheish:开源的多智能体开发框架,通过 YAML 配置工作流和多个 Agent 共同协作解决复杂任务
Kheish 是一个开源的多智能体协调平台,基于大型语言模型(LLM)设计,能够通过灵活配置多个智能体来解决复杂任务。平台支持模块化集成、聊天式提示、反馈循环等功能,适用于代码审计、法律文件分析、客户服务自动化等多种应用场景。
425 18
Kheish:开源的多智能体开发框架,通过 YAML 配置工作流和多个 Agent 共同协作解决复杂任务
|
存储 测试技术 API
pytest接口自动化测试框架搭建
通过上述步骤,我们成功搭建了一个基于 `pytest`的接口自动化测试框架。这个框架具备良好的扩展性和可维护性,能够高效地管理和执行API测试。通过封装HTTP请求逻辑、使用 `conftest.py`定义共享资源和前置条件,并利用 `pytest.ini`进行配置管理,可以大幅提高测试的自动化程度和执行效率。希望本文能为您的测试工作提供实用的指导和帮助。
1517 15
|
Java 测试技术 API
探索软件测试中的自动化测试框架
本文深入探讨了自动化测试在软件开发中的重要性,并详细介绍了几种流行的自动化测试框架。通过比较它们的优缺点和适用场景,旨在为读者提供选择合适自动化测试工具的参考依据。
|
jenkins 测试技术 持续交付
自动化测试框架的搭建与实践
在软件开发领域,自动化测试是提升开发效率、确保软件质量的关键手段。本文将引导读者理解自动化测试的重要性,并介绍如何搭建一个基本的自动化测试框架。通过具体示例和步骤,我们将探索如何有效实施自动化测试策略,以实现软件开发流程的优化。
495 7
|
监控 测试技术 定位技术
探索软件测试中的自动化测试框架选择与实施###
本文不概述传统意义上的摘要内容,而是直接以一段对话形式引入,旨在激发读者兴趣。想象一下,你是一名勇敢的探险家,面前摆满了各式各样的自动化测试工具地图,每张地图都指向未知的宝藏——高效、精准的软件测试领域。我们将一起踏上这段旅程,探讨如何根据项目特性选择合适的自动化测试框架,并分享实施过程中的关键步骤与避坑指南。 ###
205 4
|
测试技术 持续交付 数据安全/隐私保护
软件测试的艺术与科学:探索自动化测试框架
在软件开发的世界中,测试是确保产品质量的关键环节。本文将深入探讨自动化测试框架的重要性和实现方法,旨在为读者揭示如何通过自动化测试提升软件测试效率和准确性。我们将从测试的基本概念出发,逐步引导读者了解自动化测试框架的设计和实施过程,以及如何选择合适的工具来支持测试活动。文章不仅提供理论知识,还将分享实用的代码示例,帮助读者将理论应用于实践。无论你是测试新手还是经验丰富的开发者,这篇文章都将为你打开一扇通往更高效、更可靠软件测试的大门。
196 1