前情分析:
1. 当前被测系统被分为前端,调度层和数据层。每一层都有单独测试脚本进行测试。
2. 测试脚本没有进行统一管理,使用方式各异,且没有统一的文档对测试脚本进行解释。
3. 测试节点十几个,每个节点都需要进行部署,没有对测试脚本进行统一的管理。
完成封装后的效果:
1. 所有脚本都统一通过命令行进行调用 例如:test_tools scheduler smoke -h 192.168.1.1 (使用scheduler 下的smoke脚本 对h的参数传入值为192.168.1.1)
2. 所有测试工具都集成进入到test_tools中。可以通过二级参数进行区分调用 (test_tools scheduler smoke 和 test_tools manager smoke 是两个不同的脚本 分属于不同的模块中)
3. 通过对工程进行打包,实现包的分发及版本控制。新增节点安装, 使用pip3 install xxx 即可
具体实现:
主入口文件:test_tools.py
import os
import sys
sys.path.append(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))
import click
from tools.app_cmd import commands as group1
from tools.storage_cmd import commands as group2
@click.group()
def client():
"""欢迎使用工具
可以添加参数scheduler、storage、进行查看相关模块的测试工具
请使用 '--help' 查看具体传参
"""
pass
client.add_command(group1.scheduler)
client.add_command(group2.storage)
if __name__ == '__main__':
client()
该文件定义了命令行工具的主入口及二级命令的注入
二级命令菜单commands.py
import click
@click.group()
def scheduler():
"""调度层测试工具"""
pass
@scheduler.command()
@click.option('--host', '-h', help='server addr as 10.10.96.10:30100', required=True, type=str)
@click.option('--access', '-a', help='access_id default 1006/1234', required=False, default='1006/1234', type=str)
@click.option('--secret', '-s', help='secret_key default abcd', required=False, default='abcd', type=str)
@click.option('--secure', '-ssl', help='if true use HTTPS connect ', required=False, default=False, type=bool)
@click.option('--filesize', '-size', help='file size default 4k', required=False, default='4k', type=str)
def smoke(host, access, secret, secure, filesize):
"""
调度层冒烟测试
"""
hosts = host.split(',')
pool = Pool(len(hosts))
for h in hosts:
logger.info(f'host={h}, access={access}, secret={secret}, secure={secure}, fileSize={filesize}')
pool.apply_async(app_smoke, (h, access, secret, secure, filesize,))
pool.close()
pool.join()
该文件定义了二级命令scheduler ,将smoke方法注入到scheduler中同时通过@click.option将所需要的参数从外部注入到smoke方法中
setup.py(打包文件)
from setuptools import setup,find_packages
setup(
name='test-tools',
version='2.5.5',
description=' test tools',
author='Tester',
author_email='4@163.com',
url='online.net',
keywords='test_tools',
platforms='Linux',
# project_urls={
# 'Documentation': 'https://packaging.python.org/tutorials/distributing-packages/',
# 'Funding': 'https://donate.pypi.org',
# 'Source': 'https://github.com/pypa/sampleproject/',
# 'Tracker': 'https://github.com/pypa/sampleproject/issues',
# },
packages=find_packages(include=['Application','Application.*','Common','Common.*','Config','Config.*'],),
include_package_data=True,
py_modules=['Config.app_case'],
# install_requires=['numpy>=1.14', 'tensorflow>=1.7'],
python_requires='>=3',
install_requires=[
'Click',
'pyyaml',
'func-timeout',
'ddt',
'colorlog',
'openpyxl',
'prettytable',
'paramiko'
],
entry_points='''
[console_scripts]
iceberg=tools.iceberg:client
''',
exclude_package_data={
'bandwidth_reporter': ['*.pyc']
}
)
MANIFEST.in(打包文件)
recursive-include Config/ *.ini
recursive-include Driver/function/RPCplus/ *.bin
在setup.py中 主要是对打包的信息进行了说明 其核心代码为entry_points 通过该命令可以将test_tools注入到系统命令行。MANIFEST.in中的recursive-include主要说明除去py文件 还应该打包那些文件。
完成以上代码编写后 ,可以通过一下命令完成打包操作
python -m setup check #先检测下setup本身是否有语法侧面错误
python -m setup build #编译文件
python -m setup sdist #打包
打包完成后,对应的文件在当前目录下dist文件夹中生成对应的tar压缩文件
使用pip3 install xxx。tar安装即可
遇到的坑:
- 使用click 子命令最多可以添加20个子命令 再多就不展示了
- 使用click.option 进行传参时 其中--xxx 中的xxx为下方方法的入参名 一定要保持一致 否则不认
- click中如果不是必填, 建议给个非空的默认值,方便调试
- 涉及到路径参数,不要使用click内置的类型去判断 直接使用type=str 进行解析
- 工程内文件夹都使用package 否则不会被setup 打包
- MANIFEST.in 内文件一定要有扩展名 直接写文件名好像不生效
- 配置文件尽量写到固定目录 ,然后手动去修改 否则你要一遍一遍的去系统目录找配置 神烦
-
在linux 中,setup成功 但是无法使用test-tools命令 解决办法:确认当前python3版本,使用whereis python3命令 查找python3的目录 逐一查找是否包含当前版本的python3.如果包含 查看其中的bin目录是否存在iceberg可执行文件 .如果存在 则编辑/etc/profile 增加一行export PATH="/usr/local/nginx/sbin/:$PATH" source /etc/profile
打包部分参考了打包带资源文件的Python项目到pypi_piglite的专栏-CSDN博客_python 打包 资源文件