用 Python 为接口测试自动生成用例
off999 2024-12-09 16:18 31 浏览 0 评论
基于属性的测试会产生大量的、随机的参数,特别适合为单元测试和接口测试生成测试用例
尽管早在2006年haskell语言就有了QuickCheck来进行”基于属性的测试“,但是目前来看这依然是一个比较小众的领域,参考资料有限,本文如有不足,欢迎指正。
1. 基于表的测试
在过去的测试实践中,执行测试时通常需要明确的内容(Value):
- 条件
- 输入
- 结果
这些内容可以通过”判定树“或者”判断表“来表示,然后测试的执行过程变成了这样
“给定输入 X,我们期望 Y”
可以称为 基于表的测试
在最初,这给了我们测试的方向,但是缺点也非常明显:
你要足够多的"X->Y" 才能可能覆盖到隐蔽的bug。
这里请大家回答几个问题:
你是否已经为每一个测试编写了足够多的用例,以至于你十分确定真的不需要再增加用例了这么多的用例,你编写的是否开心?是否高效?是否愿意继续坚持?
如果以上问题的答案不是yes,那么基于属性的测试就是你需要掌握的东西!
2. 基于属性的测试
基于属性的测试和基于表的测试,最大的区别可以这样描述:
“给定输入 X值,我们期望 Y值”
vs
“给定输入 X类,我们期望 Y类”
于是利用工具生成大量的X类数据,进行测试,并验证结果是否Y类。
值得注意的是:
- 关注输入的类型,而不是输入的值
- 根据类型自动生成大量的、随机的输入值
换言之,它在自动的生成测试用例,虽然输入值是随机的,但是值得类型符合规范要求
3. 如何进行基于属性的测试
在不同的语言中有不同的工具来实现,比如:
- haskell中的QuickCheck、
- java中的quicktheories
- python中的hypothesis
本文以python为例进行演示:
假设有add函数,接收两个类型整数参数,并返回它们的相加结果
def add(a: int, b: int) -> int:
pass
首先写出一个简单的测试用例
def test_add():
assert 3 == add(1, 2)
正如前面所说,一个这样的用例,根本没信心覆盖全部的场景,例如:
- 参数是0
- 参数是负数
- 参数值特别大
- 其他...
所以接下来怎么办?
改为基于属性的测试
import hypothesis.strategies as st
from hypothesis import given
@given(st.integers(), st.integers())
def test_add(a, b):
c = add(a, b)
print(f"{a=},{b=}, {c=}")
assert isinstance(c, int)
assert c == a + b
执行结果
a=0,b=0, c=0
a=0,b=0, c=0
a=0,b=0, c=0
a=16926,b=11053, c=27979
a=0,b=0, c=0
a=0,b=0, c=0
a=21010,b=-2732672789497425072, c=-2732672789497404062
a=0,b=0, c=0
a=14554,b=-15956, c=-1402
a=15597,b=0, c=15597
a=15597,b=13, c=15610
a=15597,b=0, c=15597
a=15597,b=15597, c=31194
a=28965,b=-36, c=28929
a=113,b=-36, c=77
a=28929,b=-36, c=28893
a=28929,b=9356, c=38285
a=9356,b=9356, c=18712
a=10278,b=-62, c=10216
a=-62,b=-62, c=-124
a=1625,b=-68244995710046113596363052355575247332, c=-68244995710046113596363052355575245707
a=1625,b=-13143, c=-11518
a=1625,b=1625, c=3250
a=-1940,b=-31868, c=-33808
a=-7,b=1, c=-6
a=-1,b=0, c=-1
a=-1,b=0, c=-1
a=13,b=7245, c=7258
a=13,b=13, c=26
a=-99,b=-18, c=-117
a=-30172,b=66, c=-30106
a=-30172,b=-16940, c=-47112
a=-16940,b=-16940, c=-33880
a=-1233214851,b=-5152, c=-1233220003
a=-5152,b=-5152, c=-10304
a=-16,b=-29706, c=-29722
a=-29706,b=-29706, c=-59412
a=-29706,b=116, c=-29590
a=29696,b=90, c=29786
a=29696,b=29696, c=59392
a=-11446,b=-21185, c=-32631
a=-21185,b=-21185, c=-42370
a=-12,b=16437, c=16425
a=-12,b=16437, c=16425
a=3202,b=53, c=3255
a=3202,b=3202, c=6404
a=-98,b=3, c=-95
a=82691970030325711417874227410289695610,b=1316378701, c=82691970030325711417874227411606074311
a=82691970030325711417874227410289695610,b=82691970030325711417874227410289695610, c=165383940060651422835748454820579391220
a=24100,b=14385, c=38485
a=24100,b=14385, c=38485
a=24100,b=24100, c=48200
a=12293,b=-106, c=12187
a=12293,b=27280, c=39573
a=27280,b=27280, c=54560
a=-18887,b=-5530, c=-24417
a=-18887,b=-18887, c=-37774
a=4738,b=122351151658095310625663643505383743930, c=122351151658095310625663643505383748668
a=-24601163521689169516616964879873921492,b=565838202, c=-24601163521689169516616964879308083290
a=4738,b=122351151658095310625663643281738736058, c=122351151658095310625663643281738740796
a=-96098295006598318424285019062007505,b=25207226, c=-96098295006598318424285019036800279
a=-96098295006598318424285019062007505,b=-1997122225172868107163535967078611096, c=-2093220520179466425587820986140618601
a=-96098295006598318424285019062007505,b=-96098295006598318424285019062007505, c=-192196590013196636848570038124015010
a=-36,b=1190, c=1154
a=-36,b=-4, c=-40
a=-36,b=-36, c=-72
a=2047897602,b=-4641, c=2047892961
a=2047897602,b=2047897602, c=4095795204
a=-1307873608,b=11753, c=-1307861855
a=-1307873608,b=-3308225400997338452, c=-3308225402305212060
a=-1307873608,b=770256249, c=-537617359
a=-1307873608,b=-1307873608, c=-2615747216
a=-4715910568460396013,b=-18622, c=-4715910568460414635
a=16754,b=-6053, c=10701
a=-6053,b=-6053, c=-12106
a=-6053,b=-6053, c=-12106
a=-22264,b=44, c=-22220
a=-22264,b=-22264, c=-44528
a=-86,b=-86, c=-172
a=-86,b=-86, c=-172
a=1794,b=28170, c=29964
a=1794,b=28170, c=29964
a=-93,b=482, c=389
a=-1,b=482, c=481
a=-1,b=-1, c=-2
由结果可知,工具根据参数是整数这一规范,自动生成、执行了大量的测试用例
4. 在接口测试中自动生成用例
接口测试和函数的单元测试非常相似:
- 输入数据
- 返回数据
此外接口文档作为前后端、甚至测试开发的对接窗口,对参数的要求约定的更加细致,
以OpenAPI为例,每个参数可以有以下属性:
- type:数字还是字符串?
- format:密码还是电子邮箱?
- maxLength:长度不超过多少?
- required:是否必填?
- in:参数通过什么传递?
- 其他...
于是为接口生成符合要求的参数就变得可行了,举个例子:
import logging
import unittest
import requests
from api_tools import APITestCase
class UserCase(APITestCase):
schema = "http://127.0.0.1:7600/openapi.json"
if __name__ == "__main__":
unittest.main()
这是以unittest为例进行封装的结果,只需要在TestCase中指定openapi的内容(或路径),
启动测试框架时,会自动读取、解析接口文档,并生成测试用例
下面是部分执行日志,可以看到对接口发送了随机参数,并获得返回值
INFO 2022-04-10 01:02:59,223 : 执行用例 login_login_access_token_post
INFO 2022-04-10 01:02:59,223 : -----调用接口:login_login_access_token_post-----
INFO 2022-04-10 01:02:59,223 : 发送请求>>> :请求数据 = {'userin': {'password': 'bEYtwDZUxdBVThEFOqTz', 'email': 'KEfQnAtTNtwZOXRjoIjp'}}
INFO 2022-04-10 01:02:59,578 : 接收响应 <<<: <Response [400]>
INFO 2022-04-10 01:02:59,578 : -----调用完毕:login_login_access_token_post-----
INFO 2022-04-10 01:02:59,578 : 执行用例 test_token_login_test_token_post
INFO 2022-04-10 01:02:59,578 : -----调用接口:test_token_login_test_token_post-----
INFO 2022-04-10 01:02:59,578 : 发送请求>>> :请求数据 = {}
INFO 2022-04-10 01:03:00,035 : 接收响应 <<<: <Response [200]>
INFO 2022-04-10 01:03:00,035 : -----调用完毕:test_token_login_test_token_post-----
INFO 2022-04-10 01:03:00,035 : 执行用例 sign_up_login_sign_up_post
INFO 2022-04-10 01:03:00,035 : -----调用接口:sign_up_login_sign_up_post-----
INFO 2022-04-10 01:03:00,035 : 发送请求>>> :请求数据 = {'userin': {'password': 'GgzYcOwapTwnkkKVTraE', 'email': 'EJrXlCSNKKjdiVvAOnTM'}}
INFO 2022-04-10 01:03:00,657 : 接收响应 <<<: <Response [200]>
INFO 2022-04-10 01:03:00,657 : -----调用完毕:sign_up_login_sign_up_post-----
INFO 2022-04-10 01:03:00,657 : 执行用例 todo_list_todo_get
INFO 2022-04-10 01:03:00,657 : -----调用接口:todo_list_todo_get-----
INFO 2022-04-10 01:03:00,657 : 发送请求>>> :请求数据 = {}
INFO 2022-04-10 01:03:01,233 : 接收响应 <<<: <Response [200]>
INFO 2022-04-10 01:03:01,233 : -----调用完毕:todo_list_todo_get-----
INFO 2022-04-10 01:03:01,233 : 执行用例 todo_post_todo_post
INFO 2022-04-10 01:03:01,233 : -----调用接口:todo_post_todo_post-----
INFO 2022-04-10 01:03:01,233 : 发送请求>>> :请求数据 = {'todoin': {'title': '', 'is_done': False}}
INFO 2022-04-10 01:03:01,594 : 接收响应 <<<: <Response [200]>
INFO 2022-04-10 01:03:01,594 : -----调用完毕:todo_post_todo_post-----
INFO 2022-04-10 01:03:01,594 : 执行用例 todo_delete_all_todo_delete
INFO 2022-04-10 01:03:01,594 : 执行用例 todo_get_todo__todo_id__get
INFO 2022-04-10 01:03:01,594 : -----调用接口:todo_get_todo__todo_id__get-----
INFO 2022-04-10 01:03:01,594 : 发送请求>>> :请求数据 = {'todo_id': 2451}
INFO 2022-04-10 01:03:02,026 : 接收响应 <<<: <Response [404]>
INFO 2022-04-10 01:03:02,026 : -----调用完毕:todo_get_todo__todo_id__get-----
INFO 2022-04-10 01:03:02,026 : 执行用例 todo_put_todo__todo_id__put
INFO 2022-04-10 01:03:02,026 : -----调用接口:todo_put_todo__todo_id__put-----
INFO 2022-04-10 01:03:02,026 : 发送请求>>> :请求数据 = {'todo_id': 1519, 'todoin': {'title': '', 'is_done': False}}
INFO 2022-04-10 01:03:02,423 : 接收响应 <<<: <Response [404]>
INFO 2022-04-10 01:03:02,423 : -----调用完毕:todo_put_todo__todo_id__put-----
INFO 2022-04-10 01:03:02,423 : 执行用例 文章来自https://www.cnblogs.com/dongfangtianyu/p/api_test_by_pbt.html
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
