接口测试 基于 Jmeter 的 web 端接口自动化测试平台

81—1 · 2019年01月28日 · 最后由 zsjayy 回复于 2022年10月21日 · 15158 次阅读
本帖已被设为精华帖!

简介

基于之前的 react+unittest+flask 的接口自动化平台开发经验,和趟过的坑,我重新开发了这个接口自动化平台。
平台前端采用的 antd+dva+umi 的 antd-pro 模板,结合平台业务设计开发。后端采用的 flask+sqlalchemy+Blueprint,结构化更加清晰,ORM 的数据库操作更加稳定。自动化脚本的执行部分,我采用的是扩展性和针对性更强的 jmeter。
demo

框架

功能点

  • 批量导入 jmx、har 包生成接口用例
  • 支持前置、后置 beanshell 使用
  • 接口用例分组树形展示
  • 用例编辑失焦自动保存
  • 用例编写提供快捷调试模块
  • 支持多类型参数,json+ 文本两种校验
  • 支持同一个项目中接口参数传递
  • 提供即时任务 + 每日定时任务两种任务集
  • 全局 cookie 管理,全局默认参数,全局请求头设置
  • 可编排的用例执行顺序
  • 测试报告、简要性能结果图表化展示
  • 定时任务执行结果图表化展示,持续监控
  • 首页展示系统全局概要信息
  • docker 一键部署,启动自动同步更新

组件

首页

项目管理

定时任务列表

新建任务

新建用例&&调试

即时任务报告

定时任务报告

安装

前提:

  • 一个已经在跑的 MySQL 数据库
  • 有个 IAT 库已经导入项目 sql( db 文件在 IAT/server/db_sql/IAT.sql 先新建一个数据库名字为 IAT,在导入上面 sql 即可。)

有特殊网络要求的,可以 download 代码编译部署。如果服务器能连上外网,可以直接通过我已经封装的 docker 镜像安装。

方法 1:Docker 镜像安装

  • 我的镜像中开启了 ssh 服务,你可以通过挂载宿主机的一个端口来登录容器,默认账号为:root,密码为:root
  • 前端我挂载的是 8089,看个人需要设置
  • 命令行末尾参数,需要指定已经配置好的 MySQL

docker 命令安装

已知 Centos 安装的容器会有异常,建议使用其他系统。
优化了原来的容器时区问题,已经启动了的同学也不必担心,把原来的容器停止后,再创建个新的即可,数据是取得数据库,不会变。

# docker run --env PATH=/root/apache-jmeter-5.0/bin:$PATH -t -i -d -p 8089:80 -p 9022:22 --name=iat6 ownerworld/iat:0.0.6  /bin/start.sh "root:root@127.0.0.1:3306"

方法 2:编译安装

这种需要你有一定的运维基础和开发经验。默认你已有 node 和 python 环境。

下载代码

$ git clone https://github.com/t880216t/IAT.git

安装前端依赖

$ cnpm i

打包前端

$ npm run build

生成的 dist 文件夹便是前端部署文件

后端

服务端代码在 server 文件夹中,用的 python flask 框架不需要打包,建议用 gunicorn 启动。(确保你已经在 server 文件夹中)

$ pip install -r requirements.txt
$ gunicorn -w4 -b 0.0.0.0:5000 run:app

废话

本项目开源,欢迎 star,你可以基于自己的需求开发。当然有好的建议或迫切的需要,也欢迎提issues,南京地区非工作时间我也可以提供场外交流🙃 ,新年快乐。

有疑问欢迎也欢迎进群交流:

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 100 条回复 时间 点赞

花了一个下午终于安装好了😂 ,本人遇到几个小问题发一下供后面小伙参考
环境是 linux+python3.7

  1. 安装 node 后没有 cnpm
    安装参考 https://blog.csdn.net/qq_31642819/article/details/83058116
  2. server 目录下的几个 py 文件会报一下语法错误
    修改一下print (xxx); except Exception as e:
  3. gunicorn -w4 -b 0.0.0.0:5000 run:app`` 会报gunicorn: command not found```
    花了好长一段时间没解决,使用 python run.py 运行
  4. 修改数据库配置&数据库建表
    在 IAT/server/app/init.py 的app.config["SQLALCHEMY_DATABASE_URI"] 修改数据库配置
    修改后运行出现报 No module named 'MySQLdb'的情况
    再加入下面
    import pymysql
    pymysql.install_as_MySQLdb()
  5. 接着使用 IAT.sql 建表,本人使用了 Navicat
  6. 启动前后端 npm run start:no-mock 启动后台 python run.py
  7. 首页登录,账号 admin 密码 aa123456; 出现报错 TypeError: Unicode-objects must be encoded before hashing
    修改 login.py
    导入import binascii
    salt = binascii.hexlify(os.urandom(16)).decode()
    password = hashlib.sha256((password + salt).encode('utf-8')).hexdigest() # length 64
  8. 去掉 IAT/api.py 第 475 476 的 long

基本就这些了😵

waveboy 回复

目前没有特意去写日志系统,你可以通过 docker logs -f xxx 看到容器的日志。

使用 py 生成 jmeter 的 jmx 脚本,为什么会这样设计,调用 jmeter,需要 jmeter 层面需要配置什么么。

among 回复

之前我也有写过用 urllib+unittest 的,考虑到后期平台的扩展,决定用 jmeter,它本身已经很强大了,但团队化协作不方便。如果不是用 docker 镜像安装,需要配置个 jmeter 的环境变量。

81—1 react+unittest+flask 接口自动化测试平台 中提及了此贴 01月29日 09:15

win 开发环境部署怎么弄,gunicorn 是不是 Unix 才行

81—1 #10 · 2019年01月29日 Author
jojotester 回复

开发环境不需要配置 gunicorn,直接 python run.py 即可。如果你是 ide,右键 run.py 运行。

问一下第一张图是用什么画的呀

思寒_seveniruby 将本帖设为了精华贴 01月29日 07:24

是每起一个任务就会起一个 jmeter 的 docker 容器去执行去吗

81—1 #13 · 2019年01月29日 Author
zhanglimin 回复

不是,docker 只有一个,是我部署服务端的,可有可无,看你怎么部署。
每个任务会单独调用 jmeter 命令行,去执行对应任务 jmx 的文件。

仅楼主可见

使用 docker 安装完成启动后,web 界面的用户名和密码是什么呢?

81—1 #16 · 2019年01月29日 Author
solode 回复

随意注册个就行,目前没做用户权限区分。默认的 admin / aa123456

81—1 回复

使用默认的这个登录,或者随意注册提交的时候有这个报错:
请求错误 500: http://172.18.124.26:8089/api/auth/login
服务器发生错误,请检查服务器。

这个从哪个日志中可以看出来报错的原因吗?

win7+pycharm 遇到了点问题

 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
开始检查定时任务
[2019-01-30 13:42:56,023] ERROR in app: Exception on /api/IAT/taskList [POST]
Traceback (most recent call last):
  File "D:\cjprojects\venv\iatenv\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "D:\cjprojects\venv\iatenv\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "D:\cjprojects\venv\iatenv\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "D:\cjprojects\venv\iatenv\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "D:\cjprojects\venv\iatenv\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "D:\cjprojects\IAT\server\app\IAT\api.py", line 366, in taskList
    "add_user": row_data.username,
AttributeError: 'NoneType' object has no attribute 'username'
127.0.0.1 - - [30/Jan/2019 13:42:56] "POST /api/IAT/taskList HTTP/1.1" 500 -
请求任务信息失败,正在重试...

python+jmeter 这个想法有个性,我喜欢,git 持续关注👍

请问下响应断言的值每天不一致支持吗?

测试用例有没有版本管理,比如一个用例版本 1 适合旧系统,版本 2 适合新系统,新旧系统同时都在用,且都在迭代

81—1 #24 · 2019年02月02日 Author
jojotester 回复

这个看是任务列表找用户找不到了,估计有删库操作造成脏数据了,待我兼容下

81—1 #22 · 2019年02月02日 Author
wywincl 回复

如果迭代版本参数有变化,可以复制个改下参数配置,这相当于一个新用例。如果只是接口版本号变了,可以增加一个新版本的任务里面指定某个全局的请求参数。不知道你新老接口是怎么区分的,可以给个例子我看看。

81—1 #23 · 2019年02月02日 Author
xiaoshuangbei 回复

这种属于动态取值的了,需要看你断言的依据从哪来。最好保持测试数据纯净,需求不大目前没加断言参数传递。

81—1 #25 · 2019年02月02日 Author
solode 回复

看下服务端日志,估计数据库没连上

请问这是啥错!

81—1 #28 · 2019年02月11日 Author
美好一点 回复

请求异常了,看着和像是服务器配置的问题。你是 mac 么,参考下Mac 环境下 Safari 无法访问 127.0.0.1

@81—1 启动打开来是 hello world

81—1 回复

服务器端日志在哪里看?linux docker 版本,谢谢各位大神。

print e。。。。这让 py3 怎么通过。。。

81—1 #32 · 2019年02月13日 Author
美好一点 回复

这个是服务端的接口地址,你要访问 WEB 网页的地址。如果是按照 docker 装的,那么是http://localhost:8089

81—1 #34 · 2019年02月13日 Author
nowind 回复

😑 换 py 或者改下。

81—1 回复

谢谢,还需要在 python 程序中配置与数据库 IAT 的连接信息?能否给个联系方式。

81—1 #36 · 2019年02月14日 Author
花菜 回复

签名是指一个加密参数,还是头部参数呢。给个例子看看

使用方法二,已经在 IDE 运行起来了,前端 web 页面的访问地址是啥呀?localhost:8089 试了不好用。

81—1 #39 · 2019年02月15日 Author
thedreamly 回复

8089 是 docker 方式的端口,前端你用

$ npm run start:no-mock

默认会打开 8000 端口

81—1 #40 · 2019年02月15日 Author
waveboy 回复

数据库连接的配置文件为 IAT/server/app/init.py

app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:root@127.0.0.1:3306/IAT?charset=utf8mb4"

db 文件在 IAT/server/db_sql/IAT.sql
先新建一个数据库名字为 IAT,在导入上面 sql 即可。

81—1 #41 · 2019年02月15日 Author
waveboy 回复

562746248@qq.com,欢迎反馈。

用例是如何新增管理的?

81—1 回复

怎么打开非 docker 安装的首页啊?
:

81—1 #43 · 2019年02月18日 Author
xenos_liu 回复

1.首先要有项目:项目管理

2.选对应的项目,右键根目录新增用例:接口管理

81—1 #45 · 2019年02月18日 Author
waveboy 回复

你是自己 download 的代码?
这样启动开发服务器

$ cd IAT
$ npm i
$ npm run start:no-mock

也可以自己打包成静态文件部署。

81—1 回复

收到,感谢大佬!

81—1 回复

在请求接的时候,需要把所有的请求参数 + 指定字符串和合成一个字段串,然后 md5 生成一个字符串.需要生成的字符串也要加入请求参数中.

81—1 #52 · 2019年02月21日 Author
jojotester 回复

dist 打包出来后看个人习惯部署,gunicorn 只是启动的服务端。以 nginx 为例,dist 的文件放到 www 文件夹里,nginx 配置 api/请求的路径代理到 gunicorn 启动的服务上。

81—1 #53 · 2019年02月21日 Author
笑笑521 回复

你设置的数据库配置需要确认下是不是能远程连接上。

定时任务和即时任务进去就报 500,怎么破
File "D:\API\IAT\server\app\IAT\api.py", line 366, in taskList
"add_user": row_data.username,
AttributeError: 'NoneType' object has no attribute 'username'
127.0.0.1 - - [21/Feb/2019 11:20:43] "[1m[35mPOST /api/IAT/taskList HTTP/1.1[0m" 500 -

solode 回复

问题解决了没,我也遇到是这个问题。我是在阿里云的服务器安装的 docker,启动之后注册登录报 500,应该是数据库没连接上导致的,但是还未解决。

打包部署哪里,生成 dist 文件后,还需要配置什么吗? 走 Nginx?还是默认不用直接 gunicorn 启动

81—1 #51 · 2019年02月21日 Author
renfenghui 回复

应该是有脏数据,是不是从数据库删除了什么角色

renfenghui 回复

同样的错误,不知道怎么解决😂

81—1 回复

没有删除过哇

81—1 #56 · 2019年02月21日 Author
renfenghui 回复

@jojotester @renfenghui 我兼容下了下可能的报错,如果是 docker 安装的,重启下容器即可。

81—1 回复

没太明白你说的数据库设置是在哪里管理呢?

81—1 #62 · 2019年02月28日 Author
Jacksonluang 回复

恩,建了个群,欢迎交流

81—1 #58 · 2019年02月26日 Author
笑笑521 回复

就是确定你的数据库能远程连接上不

平台体验了挺好,就是没感受到用 JMETER 的优点在哪;扩展下和针对性是什么?

81—1 #60 · 2019年02月28日 Author
jojotester 回复

如果单纯做业务接口测试,其实底层哪个框架都一样。Jmeter 本身作为性能测试工具,可以做更多性能测试任务(目前还在规划)

作者,建个 QQ 群或者微信群吧,可以供大家讨论,以及可以为作者贡献一些

81—1 #66 · 2019年03月04日 Author
高高 回复

😓 截图里这是我开发第一版额,那个要改源码里的请求地址 url,建议你用这里的第二版,那个老的我不在维护了。


我把环境部署到其他机器上,登陆的时候直接掉的我本地的接口,这个怎么解呢?

81—1 #64 · 2019年03月04日 Author
高高 回复

你访问的是啥,截个图看看

81—1 #68 · 2019年03月11日 Author

多谢,比我整理的完善。

有计划 集成 jenkins 么

81—1 #70 · 2019年03月15日 Author

暂时没有这个计划,具体是怎样的需求呢。

用例用文件夹来组织的,文件夹/子文件夹和 jmeter 的测试计划/线程组/逻辑控制器是怎么对应的?

81—1 · #72 · 2019年03月19日 Author
仅楼主可见

demo 的账户是多少?

81—1 #74 · 2019年03月20日 Author
大大国 回复

随意注册个

麻烦请教个问题

  • 1.npm run build 和 start 均无报错
  • 2.跳转到 home 页面后出现
  • 3.请问是什么原因呢?怎么解决呢?
81—1 #76 · 2019年04月16日 Author
shoyancheung 回复

看 log 是依赖有问题,你在工程里单独装下这个库试试。

$ npm install @antv/data-set
81—1 回复
  • 按照楼主建议单独安装后,仍然会出现该现象;
  • 进一步查看并网上搜索,发现为src/pages/document.ejs中关于引用包data-set.min.js访问不成功,因为本地开发环境对网络有所限制;
  • 寻找 node-moudles 中@antv/data-set/dist中的data-set.min.js并将其拷贝至工程的 public 目录下,并更新document.ejs<script src="/data-set.min.js">
  • 以上步骤完成后,我这边本地环境可用,仅供参考。

jm 开源了这么多年,确实比较牛 B

不好意思,由于是第一次用 docker ,所以不太清楚 ‘使用配置好的 mysql’。 比方说 现在本地已经有个 mysql 了,也新建了 iat 数据库了,并且从 GitHub 上下载了 IAT/server/db_sql/IAT.sql 文件,并导入了 。我的 mysql 用户名密码举例说是 root 和 123456。
我如何从 docker 上拉取您配置好的镜像?主要就这一步不会,您上面给的命令,如果直接用的话,如下图所示,我想着应该是我缺了 mysql 相关配置的一些参数导致的,所以问一下(虽然很小白,但是问了以后估计就能明白怎么指定 mysql 配置了)截图中 root 后面的 123456 是我以为那是密码所以把原来的 root 改成了我的 123456。先感谢。

81—1 #80 · 2019年05月14日 Author
柳锐神 回复

看日志,是容器起的有问题。里面基本命令没找到,你可能得手动部署了。

提个需求:如果接口服务器的 IP 和端口变了,是不是要重新编辑所有的接口,是否有参数可以配置?或者说是我没找到修改的地儿?

81—1 #82 · 2019年05月22日 Author
t-bug 回复

不用,这个是在创建任务时才指定的,全局都是一个,接口用例中如果有单独的请求域名或端口,可以通过 beanshell 去处理。如下

String path = ctx.getCurrentSampler().toString();
path = path.replaceAll("https://xxx.xxxx.com", "http://xxx.xxx.com:8081");
sampler.setPath(path);


您好,报这个错怎么解决

81—1 #84 · 2019年06月10日 Author
老曹 回复

我没做 PY3 兼容哦,大小写的变量名冲突了。可以手动改下

URL 上支持自定义参数吗

81—1 #86 · 2019年06月28日 Author
yun-yun 回复

可以,写上 ${xxx}

请问怎么做参数传递呢

simple [精彩盘点] TesterHome 社区 2019 年 度精华帖 中提及了此贴 12月24日 23:00

求大佬指教

Starting standalone test @ Wed Dec 04 20:37:05 CST 2019 (1575463025134)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
Warning: Nashorn engine is planned to be removed from a future JDK release
summary +      1 in 00:00:00 =    6.7/s Avg:     0 Min:     0 Max:     0 Err:     1 (100.00%) Active: 1 Started: 1 Finished: 0
summary =      1 in 00:00:00 =    6.6/s Avg:     0 Min:     0 Max:     0 Err:     1 (100.00%)
Tidying up ...    @ Wed Dec 04 20:37:05 CST 2019 (1575463025768)
... end of run
excute script sucess
'encoding' is an invalid keyword argument for this function
task fail,please check jmeter env
disconnect client sucess

调试接口的时候提示这个该怎么解决,我设置了 jmeter 的环境变量,我设置的有问题吗?

export JMETER_HOME=/data/program/jmeter
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH:$HOME/bin

requirements.txt 这个依赖文件在哪里可以获取

建议尽快增加 jenkins 的支持,可以放入持续集成中,测试环境部署后,执行相关任务,然后结果反馈

请问在那设置用户自定义的变量,和 http 请求默认值

simple [精彩盘点] TesterHome 社区 2019 年 度精华帖 中提及了此贴 12月24日 23:00

你好,感兴趣的装了试试,到了调度接口日志总有 “"GET /socket.io/?EIO=3&transport=polling&t=N5yjYXN&sid=63178b349d5e41b0861327f7ad3e3817 HTTP/1.1" 400 -” 错误,是为什么啊?

楼主还在吗,加群进不去啊

楼主还在么?最近在做公司的安全监测项目,要做一个自动化测试平台,看到楼主的项目基本满足我的所有设想,想问一下,如果想把楼主的项目作为一个子项目嵌入在我的项目中,应该怎样对接呢?我这边用的时 django


楼主帮忙分析一下这是个啥错误

您好 楼主,我是拿 docker 安装的,现在访问报如下错误,有其他人也遇到这样的情况吗?

81—1 #100 · 2020年11月23日 Author
geekbing 回复

抱歉 docker 版本的没有更新,新版本目前只有手动部署。详见:https://github.com/t880216t/iat

81—1 回复

楼主我找到原因了,mysql 我刚开始安装在宿主机(因为 init.py 配置的 root:root@localhost:3306,导致 docker 一直访问本地 mysql),后来在 docker 容器里面安装 mysql,再导入库就没问题了。话说楼主啥时候更新 docker 哈,菜鸟一枚还想学习下~

我是在 mac 上使用 docker 部署的,能正常登录注册,但是导入 jmx 文件就报错,有同学遇到过相关问题吗?

接口有签名怎么实现呢

88楼 已删除
101楼 已删除
jiguanghao 回复

报错信息贴出来吧,我遇到过解决了

迷龙 回复

搞定了,我的问题,我导入的 jmx 文件是中文,所以报错!谢谢你!

柳锐神 回复

啥玩意,你在 win 系统上用 docker 部署?

1.使用 git clone 将代码下载到本地
2.进入 Server 路径,python run.py 启动后端
3.进入 UI 路径,npm run start 启动前端,此时浏览器打开 localhost:8000 进入项目页面
这时后,localhost:8000 的页面提示 403,楼主这个怎么解决呢,谢谢

81—1 react+unittest+flask 接口自动化测试平台 中提及了此贴 01月29日 09:12
测试新人 「功能人的 2023」 中提及了此贴 12月22日 16:28

很炫酷啊,学习学习👍

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册