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

81—1 · 2019年01月28日 · 最后由 Chris Chen 回复于 2019年03月17日 · 8565 次阅读
本帖已被设为精华帖!

简介

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

框架

功能点

  • 批量导入har包生成接口用例
  • 接口用例分组树形展示
  • 用例编辑失焦自动保存
  • 用例编写提供快捷调试模块
  • 支持多类型参数,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,南京地区非工作时间我也可以提供场外交流🙃 ,新年快乐。

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

共收到 68 条回复 时间 点赞

很炫酷啊,学习学习👍

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

among 回复

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

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

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

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

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

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

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

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

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

仅楼主可见

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

81—1 #16 · 2019年01月29日 作者
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 · 2019年02月02日 作者
wywincl 回复

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

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

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

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

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

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

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

请问这是啥错!

81—1 #28 · 2019年02月11日 作者
chrls.chen 回复

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

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

81—1 回复

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

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

81—1 #32 · 2019年02月13日 作者
chrls.chen 回复

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

liuxiaoning 回复

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

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

😑 换py或者改下。

接口有签名怎么实现呢

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

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

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

81—1 回复

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

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

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

$ npm run start:no-mock

默认会打开8000端口

81—1 #40 · 2019年02月15日 作者
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 · 2019年02月15日 作者
liuxiaoning 回复

562746248@qq.com,欢迎反馈。

用例是如何新增管理的?

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

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

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

81—1 回复

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

81—1 #45 · 2019年02月18日 作者
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 · 2019年02月21日 作者
renfenghui 回复

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

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

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

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

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

renfenghui 回复

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

81—1 回复

没有删除过哇

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

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

81—1 回复

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

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

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

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

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

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

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

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

恩,建了个群,欢迎交流


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

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

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

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

😓 截图里这是我开发第一版额,那个要改源码里的请求地址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 · 2019年03月11日 作者
afantishui 回复

多谢,比我整理的完善。

有计划 集成 jenkins 么

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

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

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

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