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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 第三代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报告



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
4天前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
7天前
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
随着软件行业的发展,代码质量和效率变得至关重要。自动化测试与单元测试是保证质量、提升效率的关键。Python凭借其简洁强大及丰富的测试框架(如Selenium、Appium、pytest和unittest等),成为了实施自动化测试的理想选择。本文将深入探讨这些框架的应用,帮助读者掌握编写高质量测试用例的方法,并通过持续集成等策略提升开发流程的效率与质量。
26 4
|
7天前
|
Web App开发 IDE 测试技术
天呐!当揭开 Selenium 自动化测试框架的神秘面纱,设计与实现令人瞠目!
【8月更文挑战第12天】Selenium 是一强大自动化测试框架,用于Web应用测试。它含WebDriver、IDE和Grid等工具,支持Chrome、Firefox等浏览器。可通过编程模拟用户交互验证应用功能。例如使用Python结合Selenium WebDriver编写自动化测试脚本,实现打开网页、操作元素及断言等功能。还可结合测试框架和Selenium Grid提升测试效率和并行执行能力。
19 1
|
13天前
|
人工智能 测试技术 持续交付
探索自动化测试框架的演进与实践
【8月更文挑战第6天】 随着软件行业的快速发展,自动化测试已经成为保障软件质量的关键手段。本文将深入分析自动化测试框架的发展脉络,从早期的线性脚本到现代的模块化、数据驱动和关键字驱动的框架,再到最新的基于AI的智能测试工具。文章还将探讨如何在实际工作中有效实施这些框架,以及在面对新技术时如何保持测试策略的灵活性和前瞻性。
|
9天前
|
JavaScript 前端开发 测试技术
一周下载量突破 500 万次!为什么说它是下一代测试框架?
一周下载量突破 500 万次!为什么说它是下一代测试框架?
|
16天前
|
JSON 前端开发 JavaScript
革新Admin.NET框架:前端体验飞跃与代码生成自动化的双重革命,引领高效开发新时代!
【8月更文挑战第3天】Admin.NET是一款专为现代企业应用打造的高效框架,凭借强大的后台管理和灵活的扩展性深受开发者喜爱。本文探讨如何优化其前端体验与开发效率。首先,通过采用Flexbox和CSS Grid等技术实现响应式布局重构,确保了不同设备上的一致体验。其次,引入Vue.js或React实现组件化开发,提高代码复用性和维护性。再者,利用Webpack等工具进行性能优化,提升页面加载速度。此外,开发了代码生成器以自动生成CRUD模块,极大提高了开发效率。这些改进使Admin.NET前端开发更高效、灵活且易于维护。
14 0
|
1月前
|
JSON JavaScript 测试技术
Postman接口测试工具详解
Postman接口测试工具详解
66 1
|
22天前
|
存储
Postman 接口测试配置 Pre-request Script
Postman 接口测试配置 Pre-request Script
65 5
Postman 接口测试配置 Pre-request Script
|
11天前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧