httprunner源码学习(一)从命令行参数入手

首先给出项目源码:https://github.com/httprunner/httprunner
我的版本是 3.1.6
在项目根目录pyproject.toml文件,可以看到命令的指向的路径。

image-20220117143802867

通过文档可知,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

下一篇 httprunner源码学习(二)main_run()、main_make()

posted @ 2022-01-18 17:11  寡淡的白开水  阅读(539)  评论(0)    收藏  举报