目录
这里完成需求3:可以运行单条test case,也可以根据case list 来运行list里面的case
这一部分比较简单,将pytest的运行命令封装一下就可以完成需求。
pytest 运行方式
pytest有3中运行方式:
1.命令行运行
2.主函数运行
3.配置文件pytest.ini运行
命令行运行
在cmd窗口运行命令如下,分三种运行方式
#运行当前目录下的所有测试case
pytest -vs
#执行测试模块运行,运行test_sample.py下的所有case
pytest -vs test_sample.py
#执行指定case
pytest -vs test_cases/test_sample.py::TestSample::test_addition
主函数运行
python的运行一般会有一个主函数来作为整个脚本的入口函数,pytest也有这样的一个入口函数,接收一个数组作为main函数的参数,也有三种运行方式
#运行执行测试case
if __name__ == "__main__":
pytest.main(['-vs','test_cases/test_sample.py::TestSample::test_addition'])
#执行当前目录下的所有case
if __name__ == "__main__":
pytest.main(['-vs'])
#执行指定模块的case
if __name__ == "__main__":
pytest.main(['-vs','test_cases/test_sample.py'])
通过pytest.ini来运行
如果pytest.ini文件存在,那么pytest就会根据pytest.ini中的配置来运行测试
pytest.ini是pytest的核心配置文件,一般放在项目的根目录下。
addopts = -vs #测试参数
testpaths = ./test_cases #测试目录
python_files = test_*.py #执行所有以test_开头的文件
python_classes = Test* #执行所有以Test开头的类
python_functions = test* #执行所有以test开头的case
上面是pytest默认的配置规则,当然也可以修改上面的配置文件来改变pytest默认的执行规则,比如可以修改成如下:
addopts = -vs -n 2 #测试参数,多个参数需要用空格隔开
testpaths = ./test_cases #测试目录
python_files = aaa_*.py #执行所有以aaa_开头的文件
python_classes = Testbbb* #执行所有以Testbbb开头的类
python_functions = testccc* #执行所有以testccc开头的case
封装主函数运行方式
这里采用主函数的方式来运行测试脚本。
在上一篇文章中,我们把从命令行或者是配置文件中读取的测试配置都填充填ConfigTest中了,因此,现在我们要做的就是:
1. 从ConfigTest中读取到测试信息
2. 生成pytest的测试参数并传递给main()
def run_pytest(config):
"""执行测试并生成报告"""
# 默认参数
pytest_args = ["-sv"]
if config.single_test:
pytest_args.extend([config.case_list])
elif config.list_test:
case_list = functionApi.read_case_from_list_file()
pytest_args.extend(case_list)
# 设置重复次数
if int(config.repeat) > 1:
pytest_args.extend(["--count", str(config.repeat)])
# 执行测试
exit_code = pytest.main(pytest_args)
return exit_code
其中当运行测试集的时候,调用了read_case_from_list_file()来从测试集中读取到需要运行的case
def read_case_from_list_file(self):
test_list = "test_list.txt"
# get path of test_list.txt
file_path = os.path.join(os.getcwd(), test_list)
# print("os.path.abspath:", os.path.abspath(__file__)) #获取当前文件的绝对路径
# print("os.getcwd()", os.getcwd()) #获取调用该函数的项目路径
# print("file path :", file_path)
case_list = []
try:
with open(file_path) as file_handle:
lines = file_handle.readlines()
for line in lines:
case_list.append(line.strip())
except FileNotFoundError as e:
logger.error(f"file not found:{e}")
except PermissionError as e:
logger.error(f"No permission to read the file:{e}")
except Exception as e:
logger.error(f"file not found: {e}")
return case_list