接口测试 Python API 自动化

王杏龙 · January 05, 2018 · Last by 王杏龙 replied at June 28, 2018 · 8685 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

计划

展示





重构后的页面

共收到 51 条回复 时间 点赞

点个赞,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 been 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 作者
donly 回复

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

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

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

王杏龙 回复

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

好期待 django-bootstrap

请问楼主有quickstart 文档吗

王杏龙 #34 · March 21, 2018 作者

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

简直要崩溃了,一会要大写的表,一会要小写的表,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 作者
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 been deleted
王杏龙 回复

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

666 学习了


请问这个步骤怎么写?

王杏龙 #53 · June 28, 2018 作者
狼图腾 回复

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