接口测试 Python API 自动化

王杏龙 · January 05, 2018 · Last by 李文良 replied at August 17, 2020 · 3501 hits

前言

首先感谢 Testerhome 提供一个很好的分享平台。在社区学习到不少,也经过一番折腾,发现接口测试工具或者平台的设计思路与流程颇有相似;在此也分享一个接口测试的平台,且文笔有限,望大家多多提建议或者意见。

2018.4 更新图 文章最后面有重构的页面,目前还在完善中,暂时不开放

介绍

WAPI 是基于 Django admin 框架开发的自动化接口测试管理平台,主要由 7 大模块组成:

  • API 用例管理系统(添加 删除 查看 搜索用例等)
  • API 套件管理系统(以单个系统或以单个版本为一组套件)
  • API 任务管理系统(异步 Task )
  • 环境系统配置(环境域名 Host 或者系统域名 Host)
  • Log 系统(查询记录 API 执行的结果)
  • 反馈系统(排除错误原因后并提 BUG)
  • 统计系统(统计 API / 系统健壮性等)

项目地址 https://github.com/wangxinglong007/WAPI

目前暂时是以 Django admin 作为主要框架实现,后期将会使用 Django + Bootstrap + JS + RESTful 技术实现全面改造,现已经实现前 5 大模块,接下来我们将近一步开发。

功能特性

  • 支持 HTTP,HTTPS 和 SOAP 协议的接口
  • 支持请求的参数化、以及关联接口的数据传递
  • 支持点火测试、冒烟、可业务流程测试、可单接口测试并生成测试报告
  • 支持发送邮件和支持发送微信推送消息
  • 支持队列服务执行 Task 任务
  • 支持配置多环境 host(DEV\TEST\PROD 环境)
  • 支持日志查询

依赖

使用 Python 2.7 依赖库 requirements.txt

  • Django==1.11
  • django-celery==3.2.1
  • django-kombu==0.9.4
  • mysqlclient==1.3.12
  • requests==2.18.4
  • redis==2.10.5
  • bs4==0.0.1
  • lxml==3.8.0
  • kombu==3.0.37
  • pyOpenSSL==17.0.0
  • pyv8==1.0
  • BeautifulSoup==3.2.1
  • beautifulsoup4==4.5.3
  • celery==3.1.25

计划

展示





重构后的页面

共收到 53 条回复 时间 点赞

点个赞,django 做平台感觉蛮好

支持支持,django 看起来比 flask 开发 web 页面方便多了😍

Joo 回复

Django admin 后台直接就是一个系统,可以二次开发,可以换各种皮肤等,😁 😁

谢谢!嗯我也觉得是,后面我们会更新前端页面! 欢迎提意见

王杏龙 回复

python manage.py migrate 建表的时候总是提示缺少主键😭
另外一个问题是,'djcelery.app.DjceleryConf' 这个在运行的时候提示 ImportError: No module named DjceleryConf,但是已经安装过 django-celery==3.2.1。求指点

张小川 回复

最近有点忙 回复有点慢
在你 python 安装目录下
Python27\Lib\site-packages\djcelery\app.py 文件中修改点东西就 ok 了 :

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

from celery import current_app
from django.apps import AppConfig

#: The Django-Celery app instance.
app = current_app._get_current_object()

class DjceleryConf(AppConfig):
    name = 'djcelery'
    verbose_name = u'任务系统'
张小川 回复

还有就是 我没有提供 mysql 的各种表,你在部署好项目后, 要先把 PBS_Dynamic/migrations/0001_initial.pySOAP_API/migrations/0001_initial.py 文件删除,在执行下 python manage.py makemigrations 重新生成,然后 python manage.py migrate 同步下数据库表

王杏龙 回复

好滴,我试一下,谢谢~~~

Author only
Author only
萧帅 回复

QQ: 474209564 但是 QQ 上的不多,
微信比较多,微信号:15767893039

王杏龙 回复

已加好友,请通过

王杏龙 回复

楼主,安装你说的方法执行 python manage.py makemigrations 的时候报下面这个错,能看出来是什么原因导致的吗
File "D:\TestTools\Python27\lib\site-packages\django\db\backends\mysql\base.py", line 250, in get_connection_params
kwargs['port'] = int(settings_dict['PORT'])
ValueError: invalid literal for int() with base 10: 'xxx'

卡卡西 回复

你要看下 setting.py 文件, 我在 github 里面还特意写出来了 xxx 需要配置你自己的数据库。。

王杏龙 回复

额,谢谢楼主。之前以为和这个帖子是一样的 没有好好看 github 的说明

楼主~按照您所说的两种方法,执行 python manage.py makemigrations 还是报错,请问知道是什么原因吗
按第一种 方法a. Add db_table an attribute to models.py.
在 models.py class TestCase 下 class Meta 加了 db_table='PBS_Dynamic_testcase'

(env2.7) D:\pycharmdjango\WAPI-master>python manage.py makemigrations
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "D:\envs\env2.7\lib\site-packages\django\core\management\__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "D:\envs\env2.7\lib\site-packages\django\core\management\__init__.py", line 337, in execute
    django.setup()
  File "D:\envs\env2.7\lib\site-packages\django\__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "D:\envs\env2.7\lib\site-packages\django\apps\registry.py", line 116, in populate
    app_config.ready()
  File "D:\envs\env2.7\lib\site-packages\django\contrib\admin\apps.py", line 23, in ready
    self.module.autodiscover()
  File "D:\envs\env2.7\lib\site-packages\django\contrib\admin\__init__.py", line 26, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "D:\envs\env2.7\lib\site-packages\django\utils\module_loading.py", line 50, in autodiscover_modules
    import_module('%s.%s' % (app_config.name, module_to_search))
  File "D:\Python27\Lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
  File "D:\pycharmdjango\WAPI-master\PBS_Dynamic\admin.py", line 66, in <module>
    class HostListFilter(admin.SimpleListFilter):
  File "D:\pycharmdjango\WAPI-master\PBS_Dynamic\admin.py", line 73, in HostListFilter
    for i in use_host_list:
  File "D:\envs\env2.7\lib\site-packages\django\db\models\query.py", line 250, in __iter__
    self._fetch_all()
  File "D:\envs\env2.7\lib\site-packages\django\db\models\query.py", line 1102, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "D:\envs\env2.7\lib\site-packages\django\db\models\query.py", line 122, in __iter__
    for row in compiler.results_iter():
  File "D:\envs\env2.7\lib\site-packages\django\db\models\sql\compiler.py", line 828, in results_iter
    results = self.execute_sql(MULTI)
  File "D:\envs\env2.7\lib\site-packages\django\db\models\sql\compiler.py", line 876, in execute_sql
    cursor.execute(sql, params)
  File "D:\envs\env2.7\lib\site-packages\django\db\backends\utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "D:\envs\env2.7\lib\site-packages\django\db\backends\utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "D:\envs\env2.7\lib\site-packages\django\db\utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "D:\envs\env2.7\lib\site-packages\django\db\backends\utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "D:\envs\env2.7\lib\site-packages\django\db\backends\sqlite3\base.py", line 328, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: PBS_Dynamic_testcase

按第二种方法b. Change the table name pbs_dynamic_testcase to PBS_Dynamic_testcase.
对于这个方法,没太明白是哪种方式
我试过
1)搜索整个项目中的 pbs_dynamic_testcase 改成 PBS_Dynamic_testcase,还是报 "no such table: PBS_Dynamic_testcase"
2)将 model.py 中 class TestCase 改成 class testcase,并将项目中引用的地方也改成 testcase,还是报同样的错
3)将整个项目中的 PBS_Dynamic_testcase 改成 pbs_dynamic_testcase,也将 class TestCase 改成 class testcase,这回报"no such table: pbs_dynamic_testcase"😭
4)直接手动建了个表 PBS_Dynamic_testcase,这回执行 makemigrates 不报错了,生成了 initial.py,但执行 migate 依然报上面的错,生无可恋😂

操作系统是 win7,菜鸟不太懂,还请楼主救火~

18Floor has deleted
雷芳华 回复

去 项目地址 https://github.com/wangxinglong007/WAPI 下载 mysql 语句 , 并按照这个要求去操作!

git 上说明写错了多加了一个 r

Demon 回复

👍 已改

楼主你好,我想问下按照步骤执行的时候结果在 python manage.py makemigrations 报错咯,能帮忙看下吗

Bobby 回复

那么明显的问题, 没安装 celery ,requirements.txt 里面是有的,你确定安装了吗?

请问 pyv8 是做什么的呢?安装不成功,只有 0.5 版本的,而且安装过程还出错了。。。有空的话麻烦帮忙看看,多谢!

Collecting pyv8==1.0 (from -r requirementscopy.txt (line 1))
  Could not find a version that satisfies the requirement pyv8==1.0 (from -r requirementscopy.txt (line 1)) (from versions: 0.5)
No matching distribution found for pyv8==1.0 (from -r requirementscopy.txt (line 1))
cocodeMacBook-Pro:WAPI-master coco$ pip2 install -r requirementscopy.txt 
Collecting pyv8 (from -r requirementscopy.txt (line 1))
  Downloading PyV8-0.5.zip
Installing collected packages: pyv8
  Running setup.py install for pyv8 ... error
    Complete output from command /Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python -u -c "import setuptools, tokenize;__file__='/private/var/folders/l6/q6xv121n4lgdnnrc_vl_08g00000gn/T/pip-build-ngFkP0/pyv8/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /var/folders/l6/q6xv121n4lgdnnrc_vl_08g00000gn/T/pip-dku95b-record/install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build/lib.macosx-10.6-intel-2.7
    copying PyV8.py -> build/lib.macosx-10.6-intel-2.7
    running build_ext
    building '_PyV8' extension
    creating build/temp.macosx-10.6-intel-2.7
    creating build/temp.macosx-10.6-intel-2.7/src
    /usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DBOOST_PYTHON_STATIC_LIB -Ilib/python/inc -Ilib/boost/inc -Ilib/v8/inc -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/Exception.cpp -o build/temp.macosx-10.6-intel-2.7/src/Exception.o
    In file included from src/Exception.cpp:1:
    src/Exception.h:6:10: fatal error: 'v8.h' file not found
    #include <v8.h>
             ^~~~~~
    1 error generated.
    error: command '/usr/bin/clang' failed with exit status 1

    ----------------------------------------
Command "/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python -u -c "import setuptools, tokenize;__file__='/private/var/folders/l6/q6xv121n4lgdnnrc_vl_08g00000gn/T/pip-build-ngFkP0/pyv8/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /var/folders/l6/q6xv121n4lgdnnrc_vl_08g00000gn/T/pip-dku95b-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/l6/q6xv121n4lgdnnrc_vl_08g00000gn/T/pip-build-ngFkP0/pyv8/

可以访问了,但是初始用户名和密码是什么啊?

donly 回复

你没导他的用户库,应该就是自己创建:

django-admin createsuperuser

https://docs.djangoproject.com/en/2.0/ref/django-admin/#createsuperuser

衔尾蛇 回复

谢谢!但是目前本地的 django-admin 命令并没有 createsuperuser 这个选项,你给的链接中说要先安装 django.contrib.auth。我看本地 setting.py 文件中是有相关配置的,请问是哪里还没有做对么?由于以前从未接触过 django,所以有点小白了,请多指教,谢谢啦!

衔尾蛇 回复

解决啦,用了 python manage.py createsuperuser。

但是增加 host 的时候怎么报错呢,,,还是我增加错了?

list index out of range
Request Method: POST
Request URL:    http://127.0.0.1:8000/admin/PBS_Dynamic/updatehost/add/
Django Version: 1.11
Exception Type: IndexError
Exception Value:    
list index out of range
Exception Location: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py in __getitem__, line 289
Python Executable:  /Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
Python Version: 2.7.13
Python Path:    
['/Users/coco/Documents/charm/WAPI-master',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages',
 '/Users/coco/Documents/charm/WAPI-master',
 u'..',
 '..',
 u'..']
王杏龙 #30 · March 05, 2018 Author
donly 回复

1、你选择的是 更新Host 项,这个项是配置机器的 host, 比如 系统做了均衡负载,会分流数据, 此时你想访问具体一台的服务地址时,即可绑定你想要的 IP 并不是接口的 url 地址 如

2、你需要接口的 url 配置在 环境数据 这个项中 如

3、这个是一个 用例 的例子

王杏龙 回复

感谢!后来调试通啦,就是 step 这里还没有试过。再次感谢!

好期待 django-bootstrap

请问楼主有 quickstart 文档吗

王杏龙 #34 · March 21, 2018 Author

由于比较忙还没去细写文档,等空闲下来补充上

简直要崩溃了,一会要大写的表,一会要小写的表,sql 脚本都不知道执行多少次了。楼主能说明一下代码结构吗?我自己看看呢,拜托了
这个是我的数据库表名:

搞了半天,我说说 我当前已经踩的坑:
1.将 sql 脚本中,所有的 pbs_dynamic_testcase 修改成 PBS_Dynamic_testcase,然后执行脚本 --- 最先执行
2.1146, "Table 'django_apisys.PBS_Dynamic_testcase' doesn't exist",按照楼主的办法,修改 models.py 文件,增加 db_table,属性,修改成跟数据库一致的名字
3.到了这里仍然,会报错,有些数据表不存在(都是因为脚本中存在大小写不一致的表名引起的),继续修改 models.py,增加 db_table,属性,正在实践中。实在想不通,为什么会表名不一致,一开始的时候,为什么就会用到 PBS_Dynamic_testcase 这个表

4.修改脚本以后,貌似不用重启,保存就生效

王杏龙 #37 · April 24, 2018 Author
hh 回复

😂 😂 现在我们这里新的项目统一用了小写了, 项目的 app 名字也用小写了,PBS_Dynamic 这是 app 名字,linux 区分大小写,而 Windows 不区分大小写, 用 python manage.py migratelinux 下执行生成表的时候, 他生成的表名就是PBS_Dynamic_testcase, 在 windows 执行生成表的时候,他生成的表名是 pbs_dynamic_testcase


仍会存在报错,不知道这个表是哪里来的,估计要老老实实撸代码了

我是遇到仙人跳了吗?我把表名改成了小写,结果访问的大写的表名,我把表名改成大写,结果访问的是小写的表名??????????


最终解决方案,修改 mysql 配置,不区分表大小写


又出现了新的问题,继续踩坑




你好,楼主,为什么我新部署的这个版本,少了这个 uri 输入框,没了这个,具体怎么使用啊

王杏龙 回复

嗯,linux 是要区分大小写,我已经修改了 MySQL 的设置,改成不区分大小写了

能大致说一下,怎么生成报告的吗,说一下伪代码呢

楼主,你好,我还是没看明白,是要先执行 sql 脚本,然后再运行 python manage.py makemigrations 吗?可是我执行你的 sql 脚本,好多报错,很多表都没有建成功。而直接运行 python manage.py makemigrations,也是报了 PBS_Dynamic_testcase' doesn't exist",我是 windows,不知道是哪里有问题,是不是我的 mysql 版本太低,我是 5.5.3。

我在 linux 虚拟机上安装 mysql,导入 sql 就好了,没事了😂,虽然不太明白为什么这样

这个的源码可以分享一下吗?

呀!看到了,谢谢

王杏龙 回复

搭建失败,求楼主出文档啊

49Floor has deleted
王杏龙 回复

重构后报告的这个页面前端代码可否借我参考下

666 学习了


请问这个步骤怎么写?

王杏龙 #53 · June 28, 2018 Author
gaomengsuijia 回复

有计划开源还是已经开源了?

55Floor has deleted

重构后的源码呢?

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