第三代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;
相关文章
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
633 11
|
11月前
|
人工智能 数据可视化 测试技术
Postman 性能测试教程:快速上手 API 压测
本文介绍API上线后因高频调用导致服务器告警,通过Postman与Apifox进行压力测试排查性能瓶颈。对比两款工具在批量请求、断言验证、可视化报告等方面的优劣,探讨API性能优化策略及行业未来发展方向。
Postman 性能测试教程:快速上手 API 压测
|
JSON JavaScript 测试技术
用Postman玩转电商API:一键测试+自动化请求教程
Postman 是电商 API 测试的高效工具,涵盖基础配置、自动化测试、环境管理与请求自动化,助你快速提升开发效率。
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
430 11
|
12月前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
2183 10
|
11月前
|
监控 测试技术 API
n8n自动化测试教程 (1):环境搭建与初识n8n
n8n是一款开源、可视化的工作流自动化工具,测试工程师可通过拖拽节点快速构建API测试流程,实现测试编排、数据管理、自动化监控与告警等功能,提升测试效率与覆盖率。
|
SQL 安全 Java
除了Flask框架,还有哪些框架能防止SQL注入攻击?
这些框架都在安全方面有着较好的表现,通过它们的内置机制和安全特性,可以有效地降低 SQL 注入攻击的风险。然而,无论使用哪个框架,开发者都需要具备良好的安全意识,正确配置和使用框架提供的安全功能,以确保应用的安全可靠。同时,持续关注安全更新和漏洞修复也是非常重要的。
767 162
|
JSON 安全 测试技术
什么是API接口测试?这可能是全网最全的教程了!
API 是应用程序间的“中间人”,用于实现通信和数据交换。随着微服务架构的普及,API 数量激增,其质量对系统稳定性至关重要。API 测试可验证功能、性能与安全性,帮助开发者在部署前发现并修复问题,提升系统可靠性。测试内容包括请求方法、URL、请求头、请求体、响应状态码与响应数据等。常用工具如 Postman、AREX 可辅助测试,确保 API 在不同场景下的正确性与稳定性。
|
SQL 存储 大数据
Dataphin V5.0:支持创建异步调用API,实现慢 SQL 复杂计算的直连消费
本文介绍了数据服务产品中异步调用的应用场景与优势,包括大数据引擎查询、复杂SQL及大规模数据下载等场景,解决了同步调用可能导致的资源浪费和性能问题。通过创建异步API、测试发布以及权限申请等功能,实现高效稳定的服务提供。以电商订单查询为例,展示了如何利用异步调用提升系统性能与用户体验。
524 9
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
821 0