背景介绍
起初并不想转向 Python,没有花括号来包括一个代码块总感觉怪怪的,C、C#、VBA、Java、PHP 都有的,也许是见过了太多有花括号的代码。但是 Python 的火热让人不得不前去一探究竟,再说我想尝试的机器学习也是它的一大优势,所以在去年 10 月份终于开始了 Python 之旅。
Python 2 终将成为过去,选择 Python 3 开始是非常不错的,也是必然的。配置了 Python 3 + PyCharm,单元测试选择了 pytest。学习一门语言必定要先看一下它的语法,Python 语法还是比较 easy 的,很快我就开始了解 Python 特有的一些概念了,什么装饰器、生成器、列表推导式、用 with 子句自动管理资源等等,以及一些 Pythonic 的写法。过了一段时间就慢慢地开始搭建接口自动化测试框架了,一切似乎并不难。接口签名方式、配置变量、常用方法逐一攻略,很快就在小模块的持续集成上小试牛刀了,效果还不错。
一直觉得当初用 PHP 完成的《单接口层面的异常测试》脚本是个非常棒的作品,所以非常想用 Python 也来实现一套,否则我总免不了寝食难安。就这样在自我驱动的情况下逐步开始“搬迁”那个令我欣赏的作品。
我们都知道接口测试中最大的一个痛点就是异常测试(确切来说是单个接口层面的异常测试):
一个接口少则有一两个字段,多则十几二十多个字段;
每一个字段都包含各种异常,字段缺失、字段值包含特殊字符、字段值格式不正确、字段值长度过短或者超长等;
频繁的改动字段值和发送请求,耗时且繁琐。
所以该脚本主要完成两个任务:
必填字段逐一缺失的异常请求
每一个字段无效值的异常测试
做了简单介绍之后,我们看看如何用 Python 来实现相同功能的脚本吧。
成果展示
完成单接口层面的异常测试脚本最重要的一步,就是解析 dict 格式的 body 请求体,比如有下面这样一个请求参数:
{
"app": "app_llperTuvn9e18928",
"merchant_order_no": "202062004066865",
"amount": 100,
"currency": "cny",
"client_ip": "218.64.183.95",
"subject": "order subject 测试",
"body": "order body 测试",
"balance_settlement": {
"user": "b_user@gmail.com"
}
}
就是一个 dict 类型的请求 body(真正请求时会通过 json.dumps 转为 json string),可我又怎么知道哪个字段是必填哪个是选填呢?每个字段又是什么类型呢?长度范围是多少呢?
所以我们需要把它改造成下面的格式:
{
"app": "string,f_20, app_llperTuvn9e18928",
"merchant_order_no": "string,8~20,202062004066865",
"amount": "int,1~1000000000,100",
"currency": "string,f_cny,cny",
"client_ip": "string,f_127.0.0.1," + util.gen_ip(),
"subject": "string,1~32,order subject 测试",
"body": "string,1~128,order body 测试",
"balance_settlement": {
"user": "string,0~64,b_user@gmail.com",
"user_fee": "o_int,0~1000000000,1"
}
}
这样一来我们就可以回答上面的哪些疑问了,至于为什么,请看一下下面的规则: