一甫何、初識(shí)命令行
前面已經(jīng)完成了接口的大部分功能了出吹,錄制,回放辙喂,監(jiān)控
那如果我們把我們的程序給了一個(gè)不會(huì)代碼的人捶牢,我們還要告訴他錄制你要運(yùn)行哪個(gè)文件鸠珠,回放你要運(yùn)行哪個(gè)文件,你文件里要傳什么參數(shù),這是一個(gè)很麻煩的事情
于是乎命令行這種人性化的操作誕生了
命令行長(zhǎng)什么樣,其實(shí)你是遇到過(guò)呢岸霹,這個(gè)熟悉嗎
λ java
用法:java [options] <主類(lèi)> [args...]
(執(zhí)行類(lèi))
或 java [options] -jar <jar 文件> [args...]
(執(zhí)行 jar 文件)
或 java [options] -m <模塊>[/<主類(lèi)>] [args...]
java [options] --module <模塊>[/<主類(lèi)>] [args...]
(執(zhí)行模塊中的主類(lèi))
或 java [options] <源文件> [args]
(執(zhí)行單個(gè)源文件程序)
將主類(lèi)坚芜、源文件暂论、-jar <jar 文件>、-m 或
--module <模塊>/<主類(lèi)> 后的參數(shù)作為參數(shù)
傳遞到主類(lèi)。
其中,選項(xiàng)包括:
-cp <目錄和 zip/jar 文件的類(lèi)搜索路徑>
-classpath <目錄和 zip/jar 文件的類(lèi)搜索路徑>
--class-path <目錄和 zip/jar 文件的類(lèi)搜索路徑>
使用 ; 分隔的, 用于搜索類(lèi)文件的目錄, JAR 檔案
和 ZIP 檔案列表可缚。
-p <模塊路徑>
--module-path <模塊路徑>...
用 ; 分隔的目錄列表, 每個(gè)目錄
都是一個(gè)包含模塊的目錄。
--upgrade-module-path <模塊路徑>...
用 ; 分隔的目錄列表, 每個(gè)目錄
都是一個(gè)包含模塊的目錄, 這些模塊
用于替換運(yùn)行時(shí)映像中的可升級(jí)模塊
--add-modules <模塊名稱(chēng)>[,<模塊名稱(chēng)>...]
除了初始模塊之外要解析的根模塊斋枢。
<模塊名稱(chēng)> 還可以為 ALL-DEFAULT, ALL-SYSTEM,
ALL-MODULE-PATH.
--list-modules
列出可觀察模塊并退出
當(dāng)我們輸入java的時(shí)候帘靡,下面會(huì)展示出這么多的命令行提示
還不熟?那再來(lái)一下
λ 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)
當(dāng)我們輸入 java -version的時(shí)候瓤帚,下面會(huì)顯示版本描姚,這是因?yàn)閖ava里面一定有一套代碼,來(lái)定義命令行的參數(shù)和輸出結(jié)果戈次。
二轩勘、python里面怎么實(shí)現(xiàn)呢,引入正題 "argparse"
他的運(yùn)行結(jié)果是這樣的
λ python client.py
usage: client.py [-h] [-r PORT] [-p PLAYBACK_FILE_PATH] [-m MONITOR_FILE_PATH]
[-s INTERVAL_SECONDS]
api測(cè)試工具
optional arguments:
-h, --help show this help message and exit
-r PORT, --record PORT
錄制api接口朝扼,-r后面接代理的端口號(hào)
-p PLAYBACK_FILE_PATH, --playback PLAYBACK_FILE_PATH
回放接口赃阀,-p后面跟要回放的接口csv文件
-m MONITOR_FILE_PATH, -monitor MONITOR_FILE_PATH
監(jiān)控接口霎肯,-m后面跟要監(jiān)控的接口csv文件,必須與-s連用
-s INTERVAL_SECONDS, -seconds INTERVAL_SECONDS
表示監(jiān)控跑的間隔時(shí)間擎颖,單位是s
三、用到的幾個(gè)關(guān)鍵點(diǎn)
1观游、首先使用之前要引入包
import argparse
2搂捧、創(chuàng)建一個(gè)解析器
parser = argparse.ArgumentParser(description='api測(cè)試工具')
description可以寫(xiě)關(guān)于這個(gè)工具的說(shuō)明,他會(huì)出現(xiàn)在這個(gè)地方
3懂缕、增加你想要的參數(shù)
parse.add_argument("-r", "--record", type=int, dest="port", action="store", help="錄制api接口允跑,-r后面接代理的端口號(hào)")
(1)"-r", "--record" 是變量名,想寫(xiě)幾個(gè)寫(xiě)幾個(gè)搪柑,不過(guò)我們一般就寫(xiě)兩個(gè)聋丝,一個(gè)短參數(shù),一個(gè)長(zhǎng)參數(shù)
(2)type=int 是 "-r", "--record" 兩個(gè)變量后面要跟的參數(shù)類(lèi)型
(3)dest="port 是輸入?yún)?shù)存儲(chǔ)的變量名工碾,在這里
(4)action="store":store 保存參數(shù)值
(5)help="錄制api接口弱睦,-r后面接代理的端口號(hào)":對(duì)這個(gè)參數(shù)的操作說(shuō)明,像這個(gè)
如果你的命令行只需要變量渊额,不需要傳參數(shù)况木,則如下寫(xiě)法
parse.add_argument('-c', '--check', action="store_true",
help='查看所有錄制完成的接口文件') # 用與只輸入?yún)?shù) 不輸入后面的值
運(yùn)行結(jié)果如下
所以上面的設(shè)置參數(shù)的代碼我是這樣寫(xiě)的垒拢,給大家一個(gè)參考
parse = argparse.ArgumentParser(description="api測(cè)試工具")
parse.add_argument("-r", "--record", type=int, dest="port", action="store", help="錄制api接口,-r后面接代理的端口號(hào)")
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="監(jiān)控接口求类,-m后面跟要監(jiān)控的接口csv文件,必須與-s連用")
parse.add_argument("-s", "-seconds", type=int, dest="interval_seconds",
action="store", help="表示監(jiān)控跑的間隔時(shí)間,單位是s")
parse.add_argument('-c', '--check', action="store_true",
help='查看所有錄制完成的接口文件') # 用與只輸入?yún)?shù) 不輸入后面的值
4屹耐、參數(shù)傳進(jìn)來(lái)的尸疆,那就可以執(zhí)行變量對(duì)應(yīng)的操作了
這里值得提的是,獲取cmd里輸入命令行參數(shù)的方式
import sys
sys.argv 獲取的是個(gè)數(shù)組
拿 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”
依次類(lèi)推
5惶岭、打印幫助信息仓技,這個(gè)幫助信息argparse會(huì)自動(dòng)幫你整理,你只要調(diào)這個(gè)函數(shù)就行
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"]: #開(kāi)始錄制api
try:
print("現(xiàn)在開(kāi)始錄制")
cmd = "mitmdump -s record_helper.py -p %s" % str(sys.argv[2])
os.system(cmd)
print(cmd)
except:
path = os.path.abspath("record")
print("錄制的結(jié)果文件在 %s 中" % (path))
if sys.argv[1] in ["-p", "--playback"]: #開(kāi)始回放api
ReplayHelper().replay(sys.argv[2], "r")
path = os.path.abspath("templates")
html_path = path + "\\replay_report.html"
print("請(qǐng)打開(kāi)地址 %s 查看運(yùn)行結(jié)果" % html_path)
if sys.argv[1] in ["-m", "--monitor"]: #開(kāi)始監(jiān)控api
try:
if sys.argv[3] not in ["-s","-seconds"]:
print("后面必須輸入-s參數(shù)俗他,")
else:
print("在線監(jiān)控地址是:" + " http://127.0.0.1:5555/monitor/index")
run_monitor(int(sys.argv[4]),sys.argv[2]) #注意控制臺(tái)的輸入的整型需要在這里轉(zhuǎn)化一下脖捻,否則會(huì)是字符串
except:
print("監(jiān)控結(jié)束")
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) # 當(dāng)前路徑下所有非目錄子文件