Tcloud 云测平台-使用介绍
Tcloud使用介绍
前端github地址:https://github.com/bigbaser/Tcloud
后端github地址:https://github.com/bigbaser/TcloudServer
体验地址:http://tcloud-demo.innotechx.com/#/login (账号:admin 密码:123456)
功能介绍:https://testerhome.com/topics/20491
一、目录介绍
TcloudServer目录
目录名称 | 说明 |
---|---|
TcloudServer | 项目根目录 |
apps | 多服务目录,该目录下的每个文件夹代表一个服务 |
deploy | 部署文件存放目录 |
library | 通用库 |
apidoc.json | 用于生产 apidoc 文档 |
docker-compose.yml | docker compose 配置文件 |
local_config.py | 配置文件(本地),存放一些敏感配置 |
Pipfile | pipenv 使用的 包管理 配置 |
public_config.py | 通用配置文件 |
requirement.txt | pip install -r 使用的文件 |
apps目录
要添加新的模块或者服务,需要放置在本目录下。
目录名称 | 说明 |
---|---|
auth | 用户以及鉴权相关 |
autotest | 自动化测试 |
extention | CI,小工具 |
flow | 流程管理 |
interface | 接口自动化 |
jobs | 定时任务 |
message | 站内信 |
project | 项目 |
public | 公共库 |
tcdevices | 云真机 |
ws | web socket |
library目录
通用的方法提取出来分类放到对应文件中。
目录名称 | 说明 |
---|---|
api | 接口使用相关 |
notification.py | 用来发送信息(站内信和企业微信通知) |
oss.py | oss 相关 |
tlogger.py | 日志相关 |
trpc.py | rpc 用于服务间调用,目前使用 http 协议 |
api
目录名称 | 说明 |
---|---|
db.py | 数据库相关,包括 db 和 model 定义 |
exceptions.py | 异常定义 |
parse.py | request 请求参数处理 |
render.py | response 数据格式化 |
security.py | request 请求参数格式校验 |
tBlueprint.py | 定义 blueprint,并对 get 和 delete 进行权限校验 |
tFlask.py | 实现 TFlask 继承自 Flask,重写了 run 用于使用 gunicorn 启动,重写了 make_response 用于处理 response 格式化 |
tMiddleware.py | 定义了用于处理 before_request 和 error_request 的中间函数 |
transfer.py | 用于 格式化 数据库获取的结果 |
单个服务的项目结构,以 auth 为例子
- 目前整个项目后端是 多服务 结构,每个服务负责的内容相对独立。
- 由于项目是 前后端分离的,所以后端只提供接口供前端进行调用。
- 整体架构是基于 flask、flask-sqlalchemy 进行构建的 非典型的 mvc 架构(model-view-controller)
目录结构
目录名称 | 说明 |
---|---|
auth | 服务名称/服务根目录 |
business | controller 所在目录,用于具体的逻辑构建 |
models | 存放所有的 model,用于定义数据模型和数据库进行对应 |
settings | 每个 服务独有 的配置信息 |
validatons | 用于前面的 parse 和 security 的数据获取和数据校验 配置文件 |
views | 存放所有 views |
auth_require.py | 鉴权相关 |
extentins.py | 用于定义服务中使用的其他扩展 |
run.py | 服务启动 |
二、新建服务示例
创建一个新的服务,以 auth 中的 user 为例子,创建一个 /v1/user/add
接口
创建目录结构
配置 config
apps/user/settings/config.py
try:
from public_config import *
except ImportError:
pass
# 端口号是自定义的,需要规划好扩展及其他的服务端口
PORT = 9999
# 服务名称与 目录名称 相同:user
SERVICE_NAME = 'user'
添加 extentions
apps/user/extentions.py
这个文件大部分是通用的库初始化的过程,主要有 初始化 validation,parse 等工具
import os
from os.path import join, abspath, dirname, splitext
import yaml
from library.api.parse import TParse
from library.api.security import Validation
current_path = dirname(abspath(__file__))
yml_json = {}
try:
validate_yml_path = join(current_path, 'validations')
for fi in os.listdir(validate_yml_path):
if splitext(fi)[-1] != '.yml':
continue
with open(join(validate_yml_path, fi), 'rb') as f:
yml_json.update(yaml.safe_load(f.read()))
except yaml.YAMLError as e:
print(e)
v = Validation(yml_json)
validation = v.validation
p = TParse(yml_json)
parse_list_args = p.parse_list_args
parse_list_args2 = p.parse_list_args2
parse_json_form = p.parse_json_form
parse_pwd = p.parse_pwd
定义接口
/user/add
属性 | 值 |
---|---|
路径 | /user/add |
方法 | POST |
参数 | {"name":"hello", "nickname":"world", "password":"helloworld"} |
首先定义 user 的 model
apps/user/models/users.py
from library.api.db import db, EntityWithNameModel
# 使用 含有 name 的模型进行继承,这样默认便会含有 name,creation_time, modified_time 。
# 数据库表名 与定义的模型名称的小写全拼相同,但驼峰式命名会转化为 _ 的格式。
# User == user, UserDetail == user_detail
# 定义 User 模型
class User(EntityWithNameModel):
ACTIVE = 0
DISABLE = 1
nickname = db.Column(db.String(100), nullable=True) # 昵称
password = db.Column(db.String(100), nullable=False) # 密码
status = db.Column(db.Integer, default=ACTIVE) # 状态,0:存在,1:删除
然后编写 用户添加数据库逻辑
apps/user/business/users.py
from flask import current_app
from apps.user.extentions import parse_pwd
from apps.user.models.users import User
from library.api.db import db
# 创建 UserBusiness
class UserBusiness(object):
@classmethod
def create_new_user_and_bind_roles(cls, username, nickname, password):
# 传入 需要的参数
try:
# 查询是否已经存在当前用户名的用户
ret = User.query.filter(User.name == username, User.status == User.ACTIVE).first()
if ret:
return 103, None
# 构建 User,使用 parse_pwd 加密 password 为密文
n = User(
name=username,
nickname=nickname,
password=parse_pwd(password)
)
# 使用 db 添加到数据库
db.session.add(n)
db.session.commit()
return 0, None
except Exception as e:
current_app.logger.error(str(e))
return 102, str(e)
添加 需要校验数据的 配置文件
apps/user/validations/users.yml
required: True代表字段必填adduser:
username:
required: True
type: basestring
nickname:
required: True
type: basestring
password:
required: True
type: basestring
returnvalue:
- username
- nickname
- password
然后编写 用户添加接口 逻辑
apps/user/views/users.py
from apps.user.business.users import UserBusiness
from apps.user.extentions import validation, parse_json_form
from library.api.tBlueprint import tblueprint
# 创建 blueprint
user = tblueprint("user", __name__, bpname="user", has_view=False)
# 定义 /add 路径 和 请求方法 POST
@user.route('/add', methods=['POST'])
@validation('POST:adduser') # 用于数据校验,主要从 validations/users.yml 中读取
def user_index_handler():
# 从 validations/users.yml 中读取
username, nickname, password = parse_json_form('adduser')
ret, msg = UserBusiness.create_new_user_and_bind_roles(username, nickname, password)
return {
"code": ret,
"data": [],
"message": msg
}
定义 app
apps/user/run.py
from apps.user.settings import config
if config.SERVER_ENV != 'dev':
# 猴子补丁,用于 gunicorn 启动。
from gevent import monkey
monkey.patch_all()
else:
pass
from apps.user.views.users import user
from library.api.tFlask import tflask
# 使用 create_app 创建 app
def create_app():
app = tflask(config)
register_blueprints(app)
return app
# 注册 blueprint 到 app
def register_blueprints(app):
app.register_blueprint(user, url_prefix="/v1/user")
# 启动应用
if __name__ == '__main__':
create_app().run(port=config.PORT)
启动 app
python3 -m apps.user.run
访问 POST
登录一下,将返回的 token 填入 header 的 Authorization 中
填写 请求的 Body (缺少参数)
类型为 json 格式
{
"username": "test"
}
可以看到 返回为 缺少参数
后台报错信息
填写 完整的 body
{
"username": "hello",
"password": "helloworld",
"nickname": "world"
}
平台目前在持续更新维护,如有疑问或帮助可联系QQ群:839084842
如果项目对你有所帮助或启发,希望能在GitHub点个Star,感谢阅读!
Tcloud 云测平台-使用介绍的更多相关文章
- Tcloud 云测平台-多服务框架开源
技术栈 Python3.7 + Vue前端github地址:https://github.com/bigbaser/Tcloud后端github地址:https://github.com/bigbas ...
- APP 兼容性测试之云测平台体验
前言 兼容性测试主要通过人工或自动化的方式,在需要覆盖的终端设备上进行功能用例执行,查看软件性能.稳定性等是否正常. 对于需要覆盖的终端设备,大型互联网公司,像BAT,基本都有自己的测试实验室,拥有大 ...
- 华为云测平台服务再升级!华为M5系列平板调测能力正式上线!
6月1日,华为M5系列平板设备兼容性测试和远程真机调试功能在华为终端开放实验室正式上线!助力您的产品在大屏适配上快人一步! 华为终端开放实验室DevEco平台现已提供基于华为M5系列平板设备的兼 ...
- 【openstf】自己的云测平台——mac安装openstf
openstf的github地址:https://github.com/openstf/stf 上图可以清晰看出openstf的使用场景和效果 openstf是一个web应用程序,用于远程调试智能 ...
- O365 Manager Plus帮助台委派介绍
O365 Manager Plus帮助台委派介绍 虽然Office 365允许您在全球任何地方工作,但它提供的管理功能十分不足.当一个组织分布在多个国家/地区时,一个管理员很难单独管理所有用户和邮箱. ...
- Docker推出了Docker云,给大家介绍下哈!
Docker推出了Docker云,给大家介绍下哈. 收到了Docker官网的邮件邀请,他们推出了Docker云:https://cloud.docker.com 账号信息栏目下有: 云提供商:眼下支持 ...
- 性能利器 Takin 来了!首个生产环境全链路压测平台正式开源
6 月 25 日,国内知名的系统高可用专家数列科技宣布开源旗下核心产品能力,对外开放生产全链路压测平台产品的源代码,并正式命名为 Takin. 目前中国人寿.顺丰科技.希音.中通快递.中国移动.永辉超 ...
- 点云NDT配准方法介绍
三维配准中经常被提及的配准算法是ICP迭代的方法,这种方法一般般需要提供一个较好的初值,也就是需要粗配准,同时由于算法本身缺陷,最终迭代结果可能会陷入局部最优,导致配准失败,往往达不到我们想要的效果. ...
- 阿里云3台机器组成集群配置ssh免密码登陆
1 查询阿里云局网ip 注意:需要配置同一地区同一可用区的机器 才是一个局网 2 配置好hosts文件 3 hostname确认也是正确的 4 生成公钥私钥 三台机器同样操作 ssh-keygen - ...
随机推荐
- React预备知识点
1.react中的状态提升 react的状态提升就是用户对子组件操作,子组件不改变自己的状态,而是通过自己的props把操作改变的数据传递给父组件,改变父组件的状态,从而改变受父组件控制的所有子组件的 ...
- C#自动计算字符串公式的四种方法
原地址:https://blog.csdn.net/ifu25/article/details/53292134 四种方式 简单粗暴:利用SQL数据库计算 功能强大:利用JavaScript计算 看不 ...
- 纯数据结构Java实现(2/11)(栈与队列)
栈和队列的应用非常多,但是起实现嘛,其实很少人关心. 但问题是,虽然苹果一直宣传什么最小年龄的编程者,它试图把编程大众化,弱智化,但真正的复杂问题,需要抽丝剥茧的时候,还是要 PRO 人士出场,所以知 ...
- [Spring cloud 一步步实现广告系统] 22. 广告系统回顾总结
到目前为止,我们整个初级广告检索系统就初步开发完成了,我们来整体回顾一下我们的广告系统. 整个广告系统编码结构如下: mscx-ad 父模块 主要是为了方便我们项目的统一管理 mscx-ad-db 这 ...
- maven学习(2)仓库和配置
1:本地资源库.中央存储库.远程存储库 1.1 本地资源库 当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖需要下载.首先,Maven 将从本地资源库 ...
- cmd指令集
CMD指令集 win+R打开运行 输入命令 可以快速执行一些程序或者功能 cmd的指令通常在system中使用 在电脑的环境变量中path中添加环境变量 环境变量可以在cmd的黑窗口进行执行进行快速打 ...
- win10下配置chromedrive。
0x01:查看自己chrome的版本号 点击chrome右上角菜单栏,帮助,关于Google chrome,在这里,你可以看到自己chrome的版本号. 0x02:下载对应的chrome drive ...
- odoo模板中的t-标签用法
在OpenERP中,通过QWeb来对模板进行渲染后加载到浏览器中,而模板中有许多的标签来定制各种需求变化,在这里记录学习过程中碰到的标签定义,以方便查询. 模板中的标签统一都是以"t-&qu ...
- unity之初级必备知识
C#中有两种常见类型:值类型,引用类型.值类型存放在内存中栈里,引用类型在内存中栈里存放引用,实际存放在内存中的堆里.值类型继承自System.ValueType.System.ValueType继承 ...
- ConcurrentLinkedQueue 源码解读
一.介绍 ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部:当我们获取一个元素时,它 ...