![adb4b988cf70d682b2712f6a9f48afb5.png](https://i-blog.csdnimg.cn/blog_migrate/beceaadb3d53a947ead3abd3f398a413.jpeg)
关注BeTester,学习更多知识
让碎片成体系,让测试更专业
![024208fc42f576ef099b1d90ea105341.png](https://i-blog.csdnimg.cn/blog_migrate/b2a6a46e1ddcc8bcc2b7a6147701198d.jpeg)
1、概述
很多电影中的黑客都有一个特点:买不起鼠标!抱歉,瞧不起鼠标!
究其原因,主要有以下几个:
- 鼠标点击速率远比键盘操作低。
- Linux主宰着黑客世界,Linux更多以命令行为主。
- 键盘的敲击感能给人激情澎湃的感觉(也是机械键盘盛行的原因)。
试想一下,在人群围观之下,我们键盘操作猛如虎,屏幕刷刷刷,围观群众直瞪眼,拍手称快。
![e7b9c84cf339c3e8e400d1290fd256b3.gif](https://i-blog.csdnimg.cn/blog_migrate/e94b46960a9cac3650ddb1dfad4fd83a.gif)
今天我们就籍此基于Python开发一个命令行工具。
笔者所使用的Python版本为 3.5。
2、开发过程
2.1 安装 docopt 类库
执行命令:pip install docopt
2.2 docopt 简要说明
docopt是Python的一个类库,使得通过指定格式的文本说明,即可自动处理命令行启动参数。
docopt约定在脚本代码开头使用 “”” “”” 文档注释符的形式,按照指定格式(如Usage、Options)编写文档说明,docopt自动生成对应的命令行参数,并进行处理(含错误处理机制)。
在使用docopt之前,Python提供默认的命令行参数类库 configparser,后续文章会讲解二者之间的区别。
2.3 本地创建文件夹 cli-demo 作为工程的根目录
![0a7a9a0d766c4a3ff9e38c3bce2063ac.png](https://i-blog.csdnimg.cn/blog_migrate/4f146677196675402fd3e6d511502d0d.jpeg)
文件夹中不要存在中文字符或特殊字符,否则可能会导致解析失败
2.4 cli-demo目录下创建文件夹 pkg
![3df8ca9d26d36097836c34d637801576.png](https://i-blog.csdnimg.cn/blog_migrate/694e4dc5aa723c5f7d603730ed21b910.jpeg)
2.5 pkg文件夹内创建 init.py 文件
其中,init.py 记录版本信息
#encoding:utf-8__version__ = "v0.1.0"
2.6 pkg文件夹内创建 hello.py 文件
![7ff27041a91241c6bc199c61f2cf370a.png](https://i-blog.csdnimg.cn/blog_migrate/6aa8d9b2dbabbffcf6859b25e7d75280.jpeg)
2.7 编写 docopt 文档注释
#encoding:utf-8""" CLI Demo Tool
Usage:
clidemo cmdA <valueA>
clidemo cmdB paramB <valueB>
Options:
-h --help Show Help doc.
-v --version Show Version.
"""
docopt会校验Usage内的命令格式,如 clidemo cmdA <valueA>
中,cmdA如果在命令行中出现 ,则为 True,否则为False,对应数值或字符串,否则为None。
docopt校验输入的命令格式中,不存在Usage定义的格式,则会提示错误,并显示使用方法。
2.8 hello.py编写核心代码
![3c897cb898a4a3e427c3ebd31e6a9ed7.png](https://i-blog.csdnimg.cn/blog_migrate/1e997ae44b77222a5bedd7a7c0894616.jpeg)
核心代码在 cmd
函数,实现内容为 符合命令行操作规则后输出指定命令内容,最终显示参数值。
最终的文件结构如下:
![d7bbe8f19fde2fda20c73662ab80a17d.png](https://i-blog.csdnimg.cn/blog_migrate/fed4bcc9357dac4511abc47c92fe3715.jpeg)
2.9 测试命令
python pkg/hello.py
![c57b7285c1174c7d401e30c82fe02911.png](https://i-blog.csdnimg.cn/blog_migrate/ee1cd5d01c2686a437a0210c90fdbbc2.jpeg)
python pkg/hello.py cmdA
![ad14fda05f188f23b63a16818efb97d0.png](https://i-blog.csdnimg.cn/blog_migrate/b272cf5aea074593be306dde23746dd8.jpeg)
python pkg/hello.py cmdA BeTester
![339931e89adf738492a4593a39e227fb.png](https://i-blog.csdnimg.cn/blog_migrate/6180553ac1e817a9305131b5ca77ffaf.jpeg)
python pkg/hello.py cmdB paramB
![b4ee8026b49ea9e49e29c37fb20b90b7.png](https://i-blog.csdnimg.cn/blog_migrate/830934add8dc0e28d43499852c150f45.jpeg)
python pkg/hello.py cmdB paramB BeTester
![9996d2a3b3ba108bc28d2f3685b261d9.png](https://i-blog.csdnimg.cn/blog_migrate/54648377bee077563d8837f413fefab2.jpeg)
python pkg/hello.py cmdC
![c9b436dcb443554f403d08b94d405df3.png](https://i-blog.csdnimg.cn/blog_migrate/5bc69b37365531a3d332faf90d0b4dd1.jpeg)
3、生成安装包
要编写第三方库或工具,最终需要 setup.py
来完成。 setup.py
核心是使用 distutils.core 类库的 setup 方法,解析该类库对应的依赖与输出约束,进而完成该类库的部署。
3.1 编写 setup.py
#encoding:utf-8from pkg import __version__from setuptools import setupfrom setuptools import find_packages
setup(
name = "CliDemo",
version = __version__,
description = "Command line Demo",
author = "betester",
packages = find_packages(),
platforms = "any",
install_requires = [ "requests",
"docopt>=0.6.2"
],
entry_points = { "console_scripts": ['clidemo = pkg.hello:cmd']
}
)
name
名称,用于所生成的egg文件的命名格式,egg的命名格式为: [name]-[version].[python3.5|python3.6].egg
egg 是 setuptools 引入的一种文件格式,用于Python模块的安装。setuptools可以识别egg文件并解析安装。
Eggs are the Pythons Jars are to Java。Egg之于Python 好比 Jar 之于 Java。
version
版本号信息,用于所生成egg文件的命名格式。
description
描述信息
author
作者名称
packages
需要处理的包目录,可以通过以下两种方式表示:
- 列表:如本工具中的pkg模块,可输入多个模块。
- find_packages:通过setuptools的find_packages获取源目录下所有的包。
platforms
适用的软件平台列表,any表示适配所有平台。
install_requires
对指定类库的依赖(及版本号依赖关系),如本工具对 docopt 有依赖。
entry_points
生成的工具,分为 console_scripts 和 gui_scripts 两种类型。console_scripts为命令行启动工具,gui_scripts为GUI启动工具。
当使用 console_scripts 时,clidemo 即为待生成的可执行文件的名称, pkg.hello:cmd为该可执行程序对应的执行方法。
pkg.hello:cmd 中,模块与方法之间使用 : 隔开。
3.2 安装命令行工具
在cli-demo目录下执行 python setup.py install
![6b8b5c9585664754f38772d6a2c8f7ed.png](https://i-blog.csdnimg.cn/blog_migrate/6e9ee46dd212a6642017cd165ffdd298.jpeg)
3.3 测试命令行工具
clidemo
![format,png](https://i-blog.csdnimg.cn/blog_migrate/d3b87a39c7aef52943d9aa7f1f0a85f9.png)
clidemo cmdA
![65aef528329226ca46e49ff4606f3949.png](https://i-blog.csdnimg.cn/blog_migrate/2e303c2be9bd3d25ef39a8c216a89700.jpeg)
clidemo cmdA BeTester
![68393e0d52f4a617468f49d41fb8f496.png](https://i-blog.csdnimg.cn/blog_migrate/2c06971284cd1068518848e6232b272e.jpeg)
clidemo cmdB paramB
![a59d8e000bacdea8f3230e25fa5e7877.png](https://i-blog.csdnimg.cn/blog_migrate/9823eb92975b30f771b1ae90561daf20.jpeg)
clidemo cmdB paramB BeTester
![00a41dbbff45cc9287fbf8e7b6f58376.png](https://i-blog.csdnimg.cn/blog_migrate/91dcbbb527958eab75e7abcf386b9550.jpeg)
clidemo cmdC
![ceddb43361b69a45708f8267e00c1332.png](https://i-blog.csdnimg.cn/blog_migrate/fd1b0a69dabdaba36a406227cd045989.jpeg)
4、小结
命令行工具在软件开发过程中始终占据着重要的地位,编译构建用到大家听过的 gradle命令或 xcodebuild 命令,更新代码时使用 git pull,触发自动化测试时使用robot命令(RobotFramework)。
同时,我们也可以根据工作需要,编写相应的测试工具完成重复、低效的工作,让我们的测试更加有趣,让我们的思维更加开阔。
![153200f4506328e64d875fe7cb6e5e96.png](https://i-blog.csdnimg.cn/blog_migrate/1003594e1d093e38a0bf634d0973cd70.jpeg)