当在终端运行输入httprunner run 目录或者文件名,则会调用main_run函数,并传入目录/文件名来执行测试用例。
main_run(extra_args)
对于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,说明用例文件不存在,则输出没有有效用例。
如文件名给错或者目录错误
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)#列表插入列表