HttpRunner3.x 源码解析(2)-main_run执行用例

命令入口

当在终端运行输入httprunner run 目录或者文件名,则会调用main_run函数,并传入目录/文件名来执行测试用例。

main_run(extra_args)

HttpRunner3.x 源码解析(2)-main_run执行用例_第1张图片

 main_run

对于extra_args中的值,如果在os.path.exists不存在,则将其加入extra_args_new中。

如果存在,则将其加入用例列表  tests_path_list

def main_run(extra_args) -> enum.IntEnum:
    ga_client.track_event("RunAPITests", "hrun")
    # keep compatibility with v2
    extra_args = ensure_cli_args(extra_args)

    tests_path_list = []
    extra_args_new = []
    for item in extra_args:
        if not os.path.exists(item):
            # item is not file/folder path
            extra_args_new.append(item)
        else:
            # item is file/folder path
            tests_path_list.append(item)#用例文件列表

    if len(tests_path_list) == 0:
        # has not specified any testcase path
        logger.error(f"No valid testcase path in cli arguments: {extra_args}")
        sys.exit(1)

    testcase_path_list = main_make(tests_path_list)#转换测试用例文件格式
    if not testcase_path_list: #未转换成功则打印未找到有效用例
        logger.error("No valid testcases found, exit 1.")
        sys.exit(1)

    if "--tb=short" not in extra_args_new:#什么意思
        extra_args_new.append("--tb=short")

    extra_args_new.extend(testcase_path_list) #列表插入列表
    logger.info(f"start to run tests with pytest. HttpRunner version: {__version__}")
    # print("extra_args_new")
    # print(extra_args_new) ['--tb=short', 'D:\\Project\\demo\\testcases\\demo_testcase_ref_test.py']
    return pytest.main(extra_args_new) #调用pytest执行用例

1)如果列表  tests_path_list长度为0,说明用例文件不存在,则输出没有有效用例。

如文件名给错或者目录错误 

HttpRunner3.x 源码解析(2)-main_run执行用例_第2张图片

 2) 如果tests_path_list长度大于0(可能是文件列表/目录名),则调用main_make转换用例为py文件,并返testcase_path_list

如果testcase_path_list不存在,则异常退出sys.exit(1)

如果存在,则将其加入extra_args_new。可以看到还给extra_args_new加了一个参数--tb=short

这个是pytest的参数,用来输出详细报错信息。

在return中调用了pytest.main执行测试用例。

由此可见,httprunner最终是调用了pytest执行的用例。

小技巧

看源码时,学习到的一些知识可以化为自己的知识。

os.path.exists 校验目录/文件是否存在

sys.exit(1) 程序异常退出

extra_args_new.extend(testcase_path_list)#列表插入列表
 
  

你可能感兴趣的:(#,接口自动化,python)