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

81—1 · January 28, 2019 · Last by ho replied at August 06, 2019 · 18104 hits
本帖已被设为精华帖!

简介

基于之前的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,南京地区非工作时间我也可以提供场外交流🙃 ,新年快乐。

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

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

很炫酷啊,学习学习👍

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

among 回复

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

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

思寒_seveniruby 将本帖设为了精华贴 29 Jan 07:24
81—1 react+unittest+flask 接口自动化测试平台 中提及了此贴 29 Jan 09:12
81—1 react+unittest+flask 接口自动化测试平台 中提及了此贴 29 Jan 09:15

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

81—1 #10 · January 29, 2019 作者
jojotester 回复

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

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

81—1 #13 · January 29, 2019 作者
zhanglimin 回复

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

Author only

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

81—1 #16 · January 29, 2019 作者
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 #22 · February 02, 2019 作者
wywincl 回复

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

81—1 #23 · February 02, 2019 作者
xiaoshuangbei 回复

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

81—1 #24 · February 02, 2019 作者
jojotester 回复

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

81—1 #25 · February 02, 2019 作者
solode 回复

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

请问这是啥错!

81—1 #28 · February 11, 2019 作者
chrls.chen 回复

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

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

81—1 回复

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

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

81—1 #32 · February 13, 2019 作者
chrls.chen 回复

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

liuxiaoning 回复

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

81—1 #34 · February 13, 2019 作者
nowind 回复

😑 换py或者改下。

接口有签名怎么实现呢

81—1 #36 · February 14, 2019 作者
梨花菜 回复

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

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

81—1 回复

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

81—1 #39 · February 15, 2019 作者
thedreamly 回复

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

$ npm run start:no-mock

默认会打开8000端口

81—1 #40 · February 15, 2019 作者
liuxiaoning 回复

数据库连接的配置文件为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 · February 15, 2019 作者
liuxiaoning 回复

562746248@qq.com,欢迎反馈。

用例是如何新增管理的?

81—1 #43 · February 18, 2019 作者
xenos_liu 回复

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

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

81—1 回复

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

81—1 #45 · February 18, 2019 作者
liuxiaoning 回复

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

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

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

81—1 回复

收到,感谢大佬!

81—1 回复

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

solode 回复

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

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

定时任务和即时任务进去就报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 -

81—1 #51 · February 21, 2019 作者
renfenghui 回复

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

81—1 #52 · February 21, 2019 作者
jojotester 回复

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

81—1 #53 · February 21, 2019 作者
笑笑521 回复

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

renfenghui 回复

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

81—1 回复

没有删除过哇

81—1 #56 · February 21, 2019 作者
renfenghui 回复

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

81—1 回复

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

81—1 #58 · February 26, 2019 作者
笑笑521 回复

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

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

81—1 #60 · February 28, 2019 作者
jojotester 回复

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

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

81—1 #62 · February 28, 2019 作者
Jacksonluang 回复

恩,建了个群,欢迎交流


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

81—1 #64 · March 04, 2019 作者
高高 回复

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

81—1 #66 · March 04, 2019 作者
高高 回复

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

花了一个下午终于安装好了😂 ,本人遇到几个小问题发一下供后面小伙参考
环境是 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

基本就这些了😵

81—1 #68 · March 11, 2019 作者
afantishui 回复

多谢,比我整理的完善。

有计划 集成 jenkins 么

81—1 #70 · March 15, 2019 作者

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

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

81—1 · #72 · March 19, 2019 作者
Author only

demo的账户是多少?

81—1 #74 · March 20, 2019 作者
大大国 回复

随意注册个

麻烦请教个问题

  • 1.npm run build 和 start均无报错
  • 2.跳转到home页面后出现
  • 3.请问是什么原因呢?怎么解决呢?
81—1 #76 · April 16, 2019 作者
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 · May 14, 2019 作者
柳锐神 回复

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

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

81—1 #82 · May 22, 2019 作者
t-bug 回复

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

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


您好,报这个错怎么解决

81—1 #84 · June 10, 2019 作者
老曹 回复

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

URL上支持自定义参数吗

81—1 #86 · June 28, 2019 作者
yun-yun 回复

可以,写上${xxx}

请问怎么做参数传递呢

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up