lemon-easytest 内测版发布

本贴最后更新于 1014 天前,其中的信息可能已经事过境迁

easytest

easytest是一个接口自动化框架。

功能特点:

安装

pip install lemon_easytest

快速使用

不需要写任何代码,所有你需要做的就是按照规则编写用例文档,然后运行命令easytest

easytest支持yaml格式和excel格式的用例文档。

在任意目录下创建文件singe_test.yaml,内容如下:

test:                                 # 表名这是单个测试用例
  title: 一个简单的测试                 # 用例名称
  url: http://httpbin.org/get         # url
  method: get                         # 请求方法
  request:                            # 请求参数字段
    headers:                          # 请求头
      CustomerHeader: lemonban        # 头信息
    params:                           # url参数
      search: lemonban                # url参数键值对
  res_type: json                      # 响应数据类型
  status_code: 200                    # 状态码
  assertion:                          # 断言表达式
    -
      - lemonban                      # 期望值
      - eq                            # 相等
      - $..Customerheader             # 结果提取表达式
    -
      - lemonban
      - eq
      - $..search

然后在命令行运行

easytest yourpath/single_test.yaml
INFO 2021-10-30 14:53:26,081 :==========single_test测试开始============
INFO 2021-10-30 14:53:26,081 :用例【一个简单的测试】开始测试>>>>>>>>
INFO 2021-10-30 14:53:26,591 :用例【一个简单的测试】测试结束<<<<<<<<<
INFO 2021-10-30 14:53:26,591 :==========single_test测试结束============
用例总数:1,成功:1个,跳过:0,失败:0个,错误:0个

通过python代码调用easytest

可以直接通过python调用easytest

import easytest
easytest.main()

也可传递参数

easytest.main(['test_dir', '--debug', '--logfile', 'test.log'])

编写用例

测试用例

easytest中编写单条测试用例可以使用yaml格式,也可以使用excel文件。

excel格式

使用excel文件编写单条测试用例非常简单,例如将上面的案例编写到excel文件中格式如下:

企业微信截图16470927203556.png

当用excel文件编写用例时保持数据的整洁,其他单元格不要有任何数据,以免加载用例数据失败。easytest会根据excel文件的sheetname来组织用例,所以单条用例请删除其他的表。

yaml格式

当使用yaml文件编写单条测试用例时最外层键必须为test,因为easytest根据它来确定一个yaml文件中的数据是单条测试用例。

test:                                 # 表名这是单个测试用例
  title: 一个简单的测试                 # 用例名称
  url: http://httpbin.org/get         # url
  method: get                         # 请求方法
  request:                            # 请求参数字段
    headers:                          # 请求头
      CustomerHeader: lemonban        # 头信息
    params:                           # url参数
      search: lemonban                # url参数键值对
  res_type: json                      # 响应数据类型
  status_code: 200                    # 状态码
  assertion:                          # 断言表达式
    - 
      - lemonban                      # 期望值
      - eq                            # 相等
      - $..Customerheader             # 结果提取表达式
    -
      - lemonban
      - eq
      - $..search

测试套件

easytest中测试套件表示一组有顺序的测试用例,当启动多线程时,以测试套件为单位交给线程去按照套件中的顺序执行测试用例。注意套件和套件间的执行顺序是不固定的。

单个测试用例也会被套上一层测试套件的壳子,yaml格式的单测试用例会被封装到以yaml文件名为名字的测试套件中,excel格式的单测试用例会被封装到以表名为名字的测试套件中。

excel格式

excel文件中编写测试套件与单测试用例没有区别,按照执行顺序从上往下依次编写即可,例如:

企业微信截图16470927711601.png

在单个excel文件中可以编写多个测试套件,一个表即为一个测试套件,所以非测试用例或者项目设置的表请删除。

yaml格式

在yaml文件中编写测试套件,最外层的key必须为test_suit,因为easytest根据它来确定一个yaml文件中的数据是一个测试套件。注意和excel不同,yaml格式不支持在一个文件中编写多个测试套件,因为多层级的嵌套缩进将是噩梦。

test_suit:
  - title: 一个简单的测试
    url: http://httpbin.org/post
    method: post
    status_code: 200
    res_type: json
    request:
      json:
        username: xinlan
        password: 123456
    assertion:
      - [xinlan,eq,$..username]
      - [xinlan,eq,$..password]

  - title: 一个不简单的测试
    url: http://httpbin.org/post
    method: post
    status_code: 200
    res_type: json
    request:
      json:
        username: xinlan
        password: 123456
    assertion:
      - [xinlan,eq,$..username]
      - [xinlan,eq,$..password]

用例收集规则

easytest 命令后接受一个位置参数file_or_dir,它可以是一个用例文件,也可以是一个目录。

当传入一个用例文件时,它必须是上一节提到的符合格式的excel或者yaml文件,excel文件只支持.xlsx后缀的格式,yaml文件支持.yaml或者.yml后缀。

当传入一个目录时,easytest会递归的去这个目录下搜索所有符合规则的用例文件(excel、yaml),并从中提取用例,当遇到格式错误时,程序会中断,所以不要把无关的Excel文件和yaml文件放在用例目录下。

注意:easytest采用流式的读取用例数据。

用例字段说明

项目配置

easytest命令会从当前目录下读取名为easytest.ini的配置文件,下面是一个完整配置文件的例子:

# 项目配置段
[project]
# 项目名称
name = xxx项目
# 项目接口根地址
host = http://some.api.root.com
# 数据库配置
[db_config]
# 数据库主机
host = dbhost										        
# 数据库用户
user = root															
# 数据库密码
password = 123456                       
# 数据库名
db = somedb
# 字符编码
charset = utf8
# 端口
port = 3306
# 接口地址
[interfaces]
# 注册接口对应地址
register: /member/register
# 登录接口对应地址
login: /member/login										
withdraw: /member/withdraw	
recharge: /member/recharge
add: /loan/add
audit: /loan/audit
invest: /member/invest
# 运行时参数
[run]
# 开启调试模式
debug=true
# 日志文件
logfile=a.log
# 筛选标记 success,login表示标记为success或login的用例会被执行
marks=success,login
# 启动线程数量
thread_num=10
# 失败重跑次数
retry=3
# 报告文件(开发中)
report=result.json											

project

project段,支持name和host

db_config

db_config段,数据库配置,目前仅支持mysql

interfaces

interfaces段,接口名称配置,格式:key=value,key是接口名称字符串,value是去掉主机后的接口地址以/开头,在用例中url字段可以填写key,easytest内部会使用项目host+接口地址进行拼接。

run

run字段,运行时的参数。

注意:命令行参数会覆盖项目配置。

生成模拟测试数据

在测试过程中有时需要动态的生成测试数据,例如手机号码,人名等。easytest通过Faker模块来生产模拟数据,暂时只支持简体中文语言下的接口,详情见Faker简体中文providers

用例中支持生产模拟测试数据的字段有,url,request

使用格式为$生成数据接口名$

例如在Faker中生成手机号码的方法名为phone_number,那么在用例中使用$phone_number$表示动态生成手机号码。

test:                                 # 表名这是单个测试用例
  title: 一个简单的测试                  # 用例名称
  url: http://httpbin.org/get         # url
  method: get                         # 请求方法
  request:                            # 请求参数字段
    headers:                          # 请求头
      CustomerHeader: lemonban        # 头信息
    params:                           # url参数
      search: lemonban                # url参数键值对
      phone: $phone_number$

上面这个用例表示url参数phone是一个动态生成的手机号码。

接口依赖的处理

easytest中,同一个测试套件下,前一个用例返回的数据可以通过变量传递给下一个用例。

例如登录成功后将返回的token值传递给下一个需要token的用例。传递步骤如下:

  1. 在登录用例中添加extract字段提取响应回的token值,并绑定到你定义的变量名admin_token
  2. 在后面的用例中,在需要使用到token的数据部分就可以使用#admin_token#,来表示,easytest会在自动进行替换

所有你需要做的,只是按照规则编写用例,剩下的交给easytest。

支持#变量名#进行替换的字段有,url,request,assertion, db_assertion

因为参数提取是在数据库断言之前进行的,所以db_assertion中可以直接引用本条用例中的提取数据。其他字段引用之前响应数据断言成功的用例提取的数据。

提取数据会根据提取表达式和响应类型进行提取,并支持通过jsonpath表达式在请求头中提取。

res_type的值不为json时,如果提取表达式是jsonpath格式,那么easytest会从请求头中提取数据。

rest_type的值为json,如果提取表达式的格式为jsonpath格式,那么easytest会先尝试从响应数据中提取数据,如果提取不到再尝试从响应头中提取数据。

所有格式的表达式提取数据时,如果只有一个匹配的值,会返回值本身,如果有多个匹配会返回列表。这在断言条件in的时候很有用。

命令行参数说明

字符串,运行时选择的标记
1 回帖
请输入回帖内容 ...