httprunner源码学习(一)从命令行参数入手
首先给出项目源码:https://github.com/httprunner/httprunner
我的版本是 3.1.6
在项目根目录pyproject.toml文件,可以看到命令的指向的路径。

通过文档可知,httprunner run = hrun,httprunner make = hmake,httprunner har2case = har2case。所以我们先来研究httprunner命令。
先进到httprunner目录下cli.py看一看。
if __name__ == "__main__":
main()
这里跟明显,我们执行 httprunner 的时候,实际执行的就是这个main()方法。
再去main方法看一看:
这里引用了python的argparse模块:https://docs.python.org/zh-cn/3/library/argparse.html#argumentparser-objects
这个模块不太熟,之前没用过,现在来逐行解析:
- 第70-84行是 argparse 的子命令,源码实际写了4个,我这里只列出两个,用来学习argparse的使用;
- 第60-67行是 run、startproject、har2case、make 参数的跳转,先看run;
- 第61行执行了main_run()方法,下一篇具体研究一下这个方法;
# httprunner/cli.py :: main
def main():
""" API test: parse command line options and run commands.
"""
parser = argparse.ArgumentParser(description=__description__) # 创建解析器对象
parser.add_argument(
"-V", "--version", dest="version", action="store_true", help="show version"
) # 添加参数 -V --version
subparsers = parser.add_subparsers(help="sub-command help") # 实例化Action对象
# 运行自定义方法,将Action对象传入
sub_parser_run = init_parser_run(subparsers) # 添加子命令 "run"
sub_parser_scaffold = init_parser_scaffold(subparsers) # 添加子命令 "startproject"
sub_parser_har2case = init_har2case_parser(subparsers) # 添加子命令 "har2case"
sub_parser_make = init_make_parser(subparsers) # 添加子命令 "make"
if len(sys.argv) == 1:
# 执行httprunner命令,后面没有跟参数
parser.print_help() # 打印帮助信息
sys.exit(0) # 终止程序
elif len(sys.argv) == 2: # 执行httprunner命令,后面有1个参数
if sys.argv[1] in ["-V", "--version"]:
# httprunner -V
print(f"{__version__}")
elif sys.argv[1] in ["-h", "--help"]:
# httprunner -h
parser.print_help()
elif sys.argv[1] == "startproject":
# httprunner startproject
sub_parser_scaffold.print_help()
elif sys.argv[1] == "har2case":
# httprunner har2case
sub_parser_har2case.print_help()
elif sys.argv[1] == "run":
# httprunner run
pytest.main(["-h"])
elif sys.argv[1] == "make":
# httprunner make
sub_parser_make.print_help()
sys.exit(0) # 终止程序
elif ( # 执行httprunner命令,后面有2个参数 & 第1个参数是"run" & 第二个参数是 -h 、--help
len(sys.argv) == 3 and sys.argv[1] == "run" and sys.argv[2] in ["-h", "--help"]
):
# httprunner run -h
pytest.main(["-h"]) # 输出pytest自带帮助信息
sys.exit(0)
extra_args = []
if len(sys.argv) >= 2 and sys.argv[1] in ["run", "locusts"]:
args, extra_args = parser.parse_known_args() # args: Namespace; extra_args: run/locusts 后面跟的所有参数,list
else:
args = parser.parse_args()
if args.version:
print(f"{__version__}")
sys.exit(0)
# 下面4个if语句,就是httprunner的实际调用了
if sys.argv[1] == "run":
sys.exit(main_run(extra_args))
elif sys.argv[1] == "startproject":
main_scaffold(args)
elif sys.argv[1] == "har2case":
main_har2case(args)
elif sys.argv[1] == "make":
main_make(args.testcase_path)
# httprunner/cli.py :: init_parser_run
def init_parser_run(subparsers): # 接收Action对象类型的参数
sub_parser_run = subparsers.add_parser( # 添加子命令“run”
"run", help="Make HttpRunner testcases and run with pytest."
)
return sub_parser_run
# httprunner/scaffold.py :: init_parser_scaffold
def init_parser_scaffold(subparsers):
sub_parser_scaffold = subparsers.add_parser( # 添加子命令 “startproject”
"startproject", help="Create a new project with template structure."
)
sub_parser_scaffold.add_argument( # 添加参数子命令所需参数 "project_name"
"project_name", type=str, nargs="?", help="Specify new project name."
)
return sub_parser_scaffold

浙公网安备 33010602011771号