一、初识命令行
前面已经完成了接口的大部分功能了,录制,回放,监控
那如果我们把我们的程序给了一个不会代码的人,我们还要告诉他录制你要运行哪个文件,回放你要运行哪个文件,你文件里要传什么参数,这是一个很麻烦的事情
于是乎命令行这种人性化的操作诞生了
命令行长什么样,其实你是遇到过呢,这个熟悉吗
λ java
用法:java [options] <主类> [args...]
(执行类)
或 java [options] -jar <jar 文件> [args...]
(执行 jar 文件)
或 java [options] -m <模块>[/<主类>] [args...]
java [options] --module <模块>[/<主类>] [args...]
(执行模块中的主类)
或 java [options] <源文件> [args]
(执行单个源文件程序)
将主类、源文件、-jar <jar 文件>、-m 或
--module <模块>/<主类> 后的参数作为参数
传递到主类。
其中,选项包括:
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
--class-path <目录和 zip/jar 文件的类搜索路径>
使用 ; 分隔的, 用于搜索类文件的目录, JAR 档案
和 ZIP 档案列表。
-p <模块路径>
--module-path <模块路径>...
用 ; 分隔的目录列表, 每个目录
都是一个包含模块的目录。
--upgrade-module-path <模块路径>...
用 ; 分隔的目录列表, 每个目录
都是一个包含模块的目录, 这些模块
用于替换运行时映像中的可升级模块
--add-modules <模块名称>[,<模块名称>...]
除了初始模块之外要解析的根模块。
<模块名称> 还可以为 ALL-DEFAULT, ALL-SYSTEM,
ALL-MODULE-PATH.
--list-modules
列出可观察模块并退出
当我们输入java的时候,下面会展示出这么多的命令行提示
还不熟?那再来一下
λ java -version
java version "16.0.2" 2021-07-20
Java(TM) SE Runtime Environment (build 16.0.2+7-67)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.2+7-67, mixed mode, sharing)
当我们输入 java -version的时候,下面会显示版本,这是因为java里面一定有一套代码,来定义命令行的参数和输出结果。
二、python里面怎么实现呢,引入正题 "argparse"
他的运行结果是这样的
λ python client.py
usage: client.py [-h] [-r PORT] [-p PLAYBACK_FILE_PATH] [-m MONITOR_FILE_PATH]
[-s INTERVAL_SECONDS]
api测试工具
optional arguments:
-h, --help show this help message and exit
-r PORT, --record PORT
录制api接口,-r后面接代理的端口号
-p PLAYBACK_FILE_PATH, --playback PLAYBACK_FILE_PATH
回放接口,-p后面跟要回放的接口csv文件
-m MONITOR_FILE_PATH, -monitor MONITOR_FILE_PATH
监控接口,-m后面跟要监控的接口csv文件,必须与-s连用
-s INTERVAL_SECONDS, -seconds INTERVAL_SECONDS
表示监控跑的间隔时间,单位是s
三、用到的几个关键点
1、首先使用之前要引入包
import argparse
2、创建一个解析器
parser = argparse.ArgumentParser(description='api测试工具')
description可以写关于这个工具的说明,他会出现在这个地方
3、增加你想要的参数
parse.add_argument("-r", "--record", type=int, dest="port", action="store", help="录制api接口,-r后面接代理的端口号")
(1)"-r", "--record" 是变量名,想写几个写几个,不过我们一般就写两个,一个短参数,一个长参数
(2)type=int 是 "-r", "--record" 两个变量后面要跟的参数类型
(3)dest="port 是输入参数存储的变量名,在这里
(4)action="store":store 保存参数值
(5)help="录制api接口,-r后面接代理的端口号":对这个参数的操作说明,像这个
如果你的命令行只需要变量,不需要传参数,则如下写法
parse.add_argument('-c', '--check', action="store_true",
help='查看所有录制完成的接口文件') # 用与只输入参数 不输入后面的值
运行结果如下
所以上面的设置参数的代码我是这样写的,给大家一个参考
parse = argparse.ArgumentParser(description="api测试工具")
parse.add_argument("-r", "--record", type=int, dest="port", action="store", help="录制api接口,-r后面接代理的端口号")
parse.add_argument("-p", "--playback", type=str, dest="playback_file_path", action="store",
help="回放接口,-p后面跟要回放的接口csv文件")
parse.add_argument("-m", "-monitor", type=str, dest="monitor_file_path",
action="store", help="监控接口,-m后面跟要监控的接口csv文件,必须与-s连用")
parse.add_argument("-s", "-seconds", type=int, dest="interval_seconds",
action="store", help="表示监控跑的间隔时间,单位是s")
parse.add_argument('-c', '--check', action="store_true",
help='查看所有录制完成的接口文件') # 用与只输入参数 不输入后面的值
4、参数传进来的,那就可以执行变量对应的操作了
这里值得提的是,获取cmd里输入命令行参数的方式
import sys
sys.argv 获取的是个数组
拿 python client.py -m D:\code\python\ApiTools\record\record_20211111_181951.csv -s 30 举列
sys.argv[0] 是 “client.py”
sys.argv[1] 是 “-m”
sys.argv[2] 是 “D:\code\python\ApiTools\record\record_20211111_181951.csv”
依次类推
5、打印帮助信息,这个帮助信息argparse会自动帮你整理,你只要调这个函数就行
print_help()
所以下面的代码就是这样的
if len(sys.argv) == 1:
parse.print_help() #打印help文件
if len(sys.argv) > 1:
if sys.argv[1] in ["-h", "--help"]:
parse.print_help() #打印help文件
if sys.argv[1] in ["-r", "--record"]: #开始录制api
try:
print("现在开始录制")
cmd = "mitmdump -s record_helper.py -p %s" % str(sys.argv[2])
os.system(cmd)
print(cmd)
except:
path = os.path.abspath("record")
print("录制的结果文件在 %s 中" % (path))
if sys.argv[1] in ["-p", "--playback"]: #开始回放api
ReplayHelper().replay(sys.argv[2], "r")
path = os.path.abspath("templates")
html_path = path + "\\replay_report.html"
print("请打开地址 %s 查看运行结果" % html_path)
if sys.argv[1] in ["-m", "--monitor"]: #开始监控api
try:
if sys.argv[3] not in ["-s","-seconds"]:
print("后面必须输入-s参数,")
else:
print("在线监控地址是:" + " http://127.0.0.1:5555/monitor/index")
run_monitor(int(sys.argv[4]),sys.argv[2]) #注意控制台的输入的整型需要在这里转化一下,否则会是字符串
except:
print("监控结束")
if sys.argv[1] in ["-c", "--check"]: #查看录制好的api文件
for files in os.walk(os.path.abspath("record")):
for file in files[2]:
if file.endswith(".csv"):
print(os.path.abspath("record")+"\\"+file) # 当前路径下所有非目录子文件