【HttpRunnerManager】搭建接口自动化测试平台实战

目录

一、需要准备的知识点

二、我搭建的环境

三、搭建过程

四、访问链接

五、两个问题点


【整整200集】超超超详细的Python接口自动化测试进阶教程,真实模拟企业项目实战!!

一、需要准备的知识点

1. linux: 安装 python3、nginx 安装和配置、mysql 安装和配置

2. python: django 配置、uwsgi 配置

二、我搭建的环境

1. Centos7 (配置 rabbitmq、mysql 、Supervisord)

2. python 3.6.8 (配置 django、uwsgi)

3. git 1.8.3.1 (克隆代码)

三、搭建过程

1. 配置数据库(安装 mysql ,自行百度)

    新建库:httprunner (UI 工具直接新建)

2. 安装 rabbitmq(消息中间件)

3. 克隆代码

    git clone https://github.com/HttpRunner/HttpRunnerManager.git

4. 安装项目依赖库

    pip install -r requirements.txt

              # requirements.txt  (celery 需要用到 tornado,建议安装 5.1.1 版本)

[root@gitlab HttpRunnerManager]# cat requirements.txt
Django == 2.0.3
PyYAML == 3.12
requests == 2.18.4
eventlet == 0.22.1
mysqlclient == 1.3.12
django-celery == 3.2.2
flower == 0.9.2
dwebsocket == 0.4.2
paramiko == 2.4.1
HttpRunner == 1.5.8
tornado>=4.2.0,<6.0.0

5. 修改 setting.py 配置文件

"""
Django settings for HttpRunnerManager project.Generated by 'django-admin startproject' using Django 1.11.7.For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""
from __future__ import absolute_import, unicode_literalsimport os# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import djcelery
from django.conf.global_settings import SESSION_COOKIE_AGEBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '=w+1if4no=o&6!la#5j)3wsu%k@$)6bf+@3=i0h!5)h9h)$*s7'# SECURITY WARNING: don't run with debug turned on in production!DEBUG = False
# DEBUG = TrueALLOWED_HOSTS = ['*']# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','ApiManager','djcelery',
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]MIDDLEWARE_CLASSES = ['dwebsocket.middleware.WebSocketMiddleware'
]ROOT_URLCONF = 'HttpRunnerManager.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'HttpRunnerManager.wsgi.application'# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = False# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/if DEBUG:DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'HttpRunner',  # 新建数据库名'USER': 'root',  # 数据库登录名'PASSWORD': '123456',  # 数据库登录密码'HOST': '192.168.1.254',  # 数据库所在服务器ip地址'PORT': '3306',  # 监听端口 默认3306即可}}STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),  # 静态文件额外目录)
else:DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'HttpRunner',  # 新建数据库名'USER': 'root',  # 数据库登录名'PASSWORD': '123456',  # 数据库登录密码'HOST': '192.168.1.254',  # 数据库所在服务器ip地址'PORT': '3306',  # 监听端口 默认3306即可}}STATIC_ROOT = os.path.join(BASE_DIR, 'static')STATIC_URL = '/static/'STATICFILES_FINDERS = ('django.contrib.staticfiles.finders.FileSystemFinder','django.contrib.staticfiles.finders.AppDirectoriesFinder'
)SESSION_COOKIE_AGE = 300 * 60djcelery.setup_loader()
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = 'Asia/Shanghai'
BROKER_URL = 'amqp://guest:guest3@192.168.91.45:5672//' if DEBUG else 'amqp://guest:guest@192.168.1.254:5672//'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'CELERY_TASK_RESULT_EXPIRES = 7200  # celery任务执行结果的超时时间,
CELERYD_CONCURRENCY = 1 if DEBUG else 10 # celery worker的并发数 也是命令行-c指定的数目 根据服务器配置实际更改 一般25即可
CELERYD_MAX_TASKS_PER_CHILD = 100  # 每个worker执行了多少任务就会死掉,我建议数量可以大一些,比如200# 发送邮件
EMAIL_HOST = 'smtp.exmail.qq.com'
EMAIL_PORT = 465
EMAIL_USR_SSL = True
EMAIL_SUBJECT_PREFIX = '测试部'
EMAIL_HOST_USER = 'notic@test.com'  # 自己的邮箱
EMAIL_HOST_PASSWORD = "fadfadfdn8hf7AXc"  # 我的邮箱密码EMAIL_SEND_USERNAME = 'notic@test.com'  # 定时任务报告发送邮箱,支持163,qq,sina,企业qq邮箱等,注意需要开通smtp服务
EMAIL_SEND_PASSWORD = 'Frfadfadfhf7AXc'     # 邮箱密码LOGGING = {'version': 1,'disable_existing_loggers': True,'formatters': {'standard': {'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'}# 日志格式},'filters': {},'handlers': {'mail_admins': {'level': 'ERROR','class': 'django.utils.log.AdminEmailHandler','include_html': True,},'default': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler','filename': os.path.join(BASE_DIR, 'logs/all.log'),'maxBytes': 1024 * 1024 * 100,'backupCount': 5,'formatter': 'standard',},'console': {'level': 'DEBUG','class': 'logging.StreamHandler','formatter': 'standard'},'request_handler': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler','filename': os.path.join(BASE_DIR, 'logs/script.log'),'maxBytes': 1024 * 1024 * 100,'backupCount': 5,'formatter': 'standard',},'scprits_handler': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler','filename': os.path.join(BASE_DIR, 'logs/script.log'),'maxBytes': 1024 * 1024 * 100,'backupCount': 5,'formatter': 'standard',},},'loggers': {'django': {'handlers': ['default', 'console'],'level': 'INFO','propagate': True},'HttpRunnerManager.app': {'handlers': ['default', 'console'],'level': 'DEBUG','propagate': True},'django.request': {'handlers': ['request_handler'],'level': 'DEBUG','propagate': True},'HttpRunnerManager': {'handlers': ['scprits_handler', 'console'],'level': 'DEBUG','propagate': True},'scripts': {'handlers': ['scprits_handler', 'console'],'level': 'DEBUG','propagate': True},}
}

6. django 生成数据库表和字段(在项目路径下执行)

#生成数据迁移脚本
python manage.py makemigrations ApiManager
#应用到db生成数据表
python manage.py migrate  

7. 创建 django 管理后台的超级账户

python manage.py createsuperuser

8. 安装 和 配置 uwsgi 

    安装:pip install uwsgi

    配置:ini_hrm.ini

[uwsgi]
socket = 127.0.0.1:9092
#socket = 127.0.0.1:3031
stats = 127.0.0.1:9193
chdir = /root/TestProject/HttpRunnerManager
wsgi-file = /root/TestProject/HttpRunnerManager/HttpRunnerManager/wsgi.py
# module = Joyo.settings
virtualenv = /root/.envs/hrm
pidfile = /root/TestProject/running/uwsgi_hrm.pid
touch-reload = /root/TestProject/running/uwsgi_hrm.pid
# py-auto-reload = 1
buffer-size = 32768
processes = 1
workers=2
# threads = 2
daemonize = /root/TestProject/logs/uwsgi_hrm.log

9. 配置 Nginx

10. 启动 Nginx

    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

11. 启动 uwsgi

    /root/.envs/hrm/bin/uwsgi --ini /root/TestProject/configs/ini_hrm.ini

12. Supervisor 守护 Celery worker、beat、flower

四、访问链接

1. django 后台

url: http://192.168.1.254/admin/login/?next=/admin/

id: root

pw: abc123456

2. rabbitmq

url: http://192.168.1.254:15672/#/     id: guest     pw: guest

3. HttpRunnerManager

注册:http://192.168.1.254:8000/api/register/     登录:http://192.168.1.254:8000/api/login/

4. Celery 任务监控后台

    url: http://192.168.1.254:5555/dashboard

五、两个问题点

  1.  启动 django 项目时,ImportError: No module named 'MySQLdb':

    安装 pymysql: pip install pymysql

    在 Django 项目中的 HttpRunnerManager/__init__.py 中引用:

import pymysql
pymysql.install_as_MySQLdb()

2. 打开 HttpRunnerManager 后台时:百度未授权使用地图API 

### 来几张图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

emWin - BMP图片显示

BmpCvt.exe 用途 利用BMP图片&#xff0c;进行GUI显示&#xff1b;ICON等图标都是小BMP图片&#xff0c;核心是将BMP图片&#xff0c;转成emWin支持的方式&#xff0c;最终显示到TFT屏上 使用BmpCvt.exe工具&#xff0c;将各个图片转成相应的C文件. emWin有关的工具&#xff…

Redis的数据淘汰策略

目录 一、概念 二、redis有哪些数据淘汰策略 三、注意事项 四、怎么选择数据淘汰策略 五、总结 一、概念 Redis的数据淘汰策略指的是在内存不足的情况下&#xff0c;如何决定哪些数据需要被淘汰以释放内存空间&#xff0c;当Redis中的内存不够用时&#xff0c;此时在向Red…

测试|Selenium介绍及环境搭建

测试|Selenium介绍及环境搭建 1.Selenium是什么 Selenium是用来做web网站 UI自动化的测试工具/测试框架。 我们这里说的Selenium是Selenium2.0&#xff0c;它由Selenium IDE&#xff0c;Webdriver, Selenium Grid组成。 Selenium IDE是用于Selenium测试的完成集成开发环境&…

云计算——云计算关键技术

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.云计算关键技术 1.虚拟化技术 2.分布式数据存储技术 &#xff08;1&…

ubuntu 相关命令记录

检查ssh 是否可用 ssh 安装curl apt install curl 进入root 进入root 账号 sudo -i 修改密码 sodo passwd 开启root 可远程连接 修改SSH配置文件 可以通过SSH配置文件更改包括端口、是否允许root登录等设置&#xff0c;配置文件位置&#xff1a; /etc/ssh/sshd_config…

天下风云出我辈,AI准独角兽实在智能获评“十大数字经济风云企业

时值盛夏&#xff0c;各地全力拼经济的氛围同样热火朝天。在浙江省经济强区余杭区这片创业热土上&#xff0c;人工智能助力数字经济建设正焕发出蓬勃生机。 7月28日&#xff0c;经专家评审、公开投票&#xff0c;由中共杭州市余杭区委组织部&#xff08;区委两新工委&#xff…

如何解决制造业数字化改造的障碍?

制造业的数字化转型可能是一个复杂且具有挑战性的过程&#xff0c;但解决以下障碍有助于为成功实施铺平道路&#xff1a; 抵制变革&#xff1a;数字化转型中最常见的挑战之一是员工的抵制&#xff0c;尤其是那些习惯传统方法的员工。为了克服这一问题&#xff0c;组织需要培养一…

JDBC-笔记

JDBC 1. JDBC介绍 JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于连接和操作数据库的 Java API。 通过Java操作数据库的流程 第一步&#xff1a;编写Java代码 第二步&#xff1a;Java代码将SQL发送到MySQL服务端 第三步&#xff1a;MySQL服务端接收到SQ…

Spring中IOC容器常用的接口和具体的实现类

在Spring框架没有出现之前&#xff0c;在Java语言中&#xff0c;程序员们创建对象一般都是通过关键字new来完成&#xff0c;那时流行一句话“万物即可new&#xff0c;包括女朋友”。但是这种创建对象的方式维护成本很高&#xff0c;而且对于类之间的相互关联关系很不友好。鉴于…

获取安卓模拟器截图

最简单的方法当然是使用adb adb shell screencap -p >screenshot.png 不过有些app会限制adb进行截图&#xff0c;这个时候adb截屏为黑屏 此时有两种方法获取截图 第一使用模拟器自带截图快捷键,获取安卓自带截图键&#xff0c;逍遥模拟器为altF3 可模拟键盘输入按键&#…

OnTrigger的几种情况

在Unity中&#xff0c;OnTrigger是一种用于处理碰撞事件的函数。它通常用于监测对象之间的触发器&#xff08;Collider&#xff09;交互&#xff0c;并在特定的情况下触发相应的逻辑。在Unity中&#xff0c;有以下几种类型的OnTrigger事件&#xff1a;OnTriggerEnter、OnTrigge…

【Web】web

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层——传输层——网络层——数据链路层——物理层 每一定的台主机都有一个唯一且固定的地址标识——IP地址 IP地址的做用&#xff1a;1.区分用户和计算机&#xff1b;2.进行通信 IP地址由32位二进制数组成&#xff0c;…

chatGPT——如何和一个很可爱,思维比较跳跃 ,活泼的女孩聊天

和一个可爱、思维跳跃、活泼的女孩聊天可以是一种很有趣的体验。以下是一些建议&#xff0c;帮助你在对话中保持积极、轻松和有趣的氛围&#xff1a; 用幽默感&#xff1a;幽默是促进轻松气氛的有效方式。适时地开玩笑&#xff0c;但要确保不会伤害对方感情或触及敏感话题。笑话…

读取application-dev.properties的中文乱码【bug】

读取application-dev.properties的中文编码【bug】 2023-7-30 22:37:46 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://blog.csdn.net/qq_51625007 禁止其他平台发布时删除以上此话 bug 读取application-dev.propert…

ATFX汇市月报:7月美联储坚定加息,8月成利率决议空档期

7月汇市行情回顾—— 7月份&#xff0c;美元指数下跌1.01%&#xff0c;收盘在101.88点&#xff0c; 欧元升值0.76%&#xff0c;收盘价1.0997点&#xff1b; 日元升值1.41%&#xff0c;收盘价142.27点&#xff1b; 英镑升值1.08%&#xff0c;收盘价1.2835点&#xff1b; 瑞…

TSINGSEE青犀视频AI算法引擎中台在渣土车智慧管控场景中的应用

一、行业背景 随着社会的发展和人们生活水平的不断进步&#xff0c;大家对环境卫生和空气质量的要求越来越重视。渣土车是建筑垃圾的运输主力&#xff0c;也存在行驶频繁、不合规、不合法的操作&#xff0c;可能对交通安全、环境卫生和城市形象造成影响。比如在施工工地&#x…

基于MATLAB实现图像处理常用应用案例(附上100个仿真源码+数据)

MATLAB是一款功能强大的图像处理软件&#xff0c;可以用于实现各种常见的图像处理应用。下面将介绍几个常见的图像处理应用案例。 文章目录 1. 图像去噪2. 图像增强3. 图像分割4. 特征提取5. 图像拼接6. 完整源码数据下载 1. 图像去噪 图像去噪是图像处理中的一项重要任务&am…

STM32 中断优先级管理(二)

NVIC中断管理相关函数主要在HAL库关键文件stm32f1xx_hal_cortex.c中定义。 中断优先级分组函数 void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);这个函数的作用是对中断的优先级进行分组&#xff0c;这个函数在系统中只需要被调用一次。 void HAL_NVIC_SetPrio…

【C++】C/C++内存管理

1、C/C内存分布 【1】栈又叫堆栈 – 非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 【2】内存映射段 – 是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存&#xff0c;做进程间通信 【3】堆 – 用于程序运…

Java面向对象的三大特征

Java面向对象的三大特征 java面向对象的三大特征&#xff1a;“封装、继承、多态”。更多Java技术知识&#xff0c;请登陆疯狂软件教育官网。微信搜索微信号&#xff1a;疯狂软件&#xff0c;参加2015年优惠活动&#xff0c;有机会获得优惠劵和代金劵。 以本文为例&#xff0c…