前言
我们在看见每个项目都有个入口文件,用来启动项目,但是在我们的自动化项目里面,特别是前面使用过unittest框架的人来说特别熟悉,在项目新建一个 main.py
或者 run_all.py
文件,使用python main.py
或者python run_all.py
执行测试。
在pytest框架也有一个入口,那就是 pytest.main()
,可以作为用例执行入口,下面我们对pytest.main()
进行讲解。
pytest.main()
pytest.main()
源码
def main(
args: Optional[Union[List[str], py.path.local]] = None,
plugins: Optional[Sequence[Union[str, _PluggyPlugin]]] = None,
) -> Union[int, ExitCode]:
"""Perform an in-process test run.
:param args: List of command line arguments.
:param plugins: List of plugin objects to be auto-registered during initialization.
:returns: An exit code.
"""
try:
try:
config = _prepareconfig(args, plugins)
except ConftestImportFailure as e:
exc_info = ExceptionInfo(e.excinfo)
tw = TerminalWriter(sys.stderr)
tw.line(f"ImportError while loading conftest '{e.path}'.", red=True)
exc_info.traceback = exc_info.traceback.filter(
filter_traceback_for_conftest_import_failure
)
exc_repr = (
exc_info.getrepr(style="short", chain=False)
if exc_info.traceback
else exc_info.exconly()
)
formatted_tb = str(exc_repr)
for line in formatted_tb.splitlines():
tw.line(line.rstrip(), red=True)
return ExitCode.USAGE_ERROR
else:
try:
ret: Union[ExitCode, int] = config.hook.pytest_cmdline_main(
config=config
)
try:
return ExitCode(ret)
except ValueError:
return ret
finally:
config._ensure_unconfigure()
except UsageError as e:
tw = TerminalWriter(sys.stderr)
for msg in e.args:
tw.line(f"ERROR: {msg}\n", red=True)
return ExitCode.USAGE_ERROR
- 重点参数说明 args
:param args: List of command line arguments.
翻译 :参数 args:就是参数传入已列表的方式
main() 命令行参数详情
-s: 显示程序中的print/logging输出
-v: 丰富信息模式, 输出更详细的用例执行信息
-q: 安静模式, 不输出环境信息
-x: 出现一条测试用例失败就退出测试。调试阶段非常有用
-k:可以使用and、not、or等逻辑运算符,区分:匹配范围(文件名、类名、函数名)
当不传入参数时,相当于命令行输入 pytest
我们只需要在目录新建一个 `run_all.py`文件,如下图
我们右键执行 run_all.py
文件,查看结果:
查看结果,运行了当前目录下的所有的测试用例
当传入参数 -s -v -x 时,相当于命令行输入 pytest -s -v -x
if __name__ == '__main__':
pytest.main(["-s", "-v", "-x"])
我们右键执行 run_all.py
文件,查看结果:
- 用例里面 print/logging 输出都打印, -s 参数
- 用例遇见失败就停止执行, -x 参数
- 用例执行详情展示,-v 参数
当传入参数 -q 时,相当于命令行输入 pytest -q
if __name__ == '__main__':
pytest.main(["-q"])
我们右键执行 run_all.py
文件,查看结果:
指定运行某个用例
我们调整一下目录结构,如下:
下面只写出核心代码部分:
- 运行当前目录和子目录下所有(test_*.py 和 *_test.py)的用例
if __name__ == '__main__':
pytest.main(["./"])
# pytest.main() 默认也可以
- 运行指定目录下用例,例如:运行eclass目录下的case
pytest.main(["./eclass", '-v'])
- 运行指定模块,例如:运行test_summary.py
pytest.main(["./test_summary.py", '-v'])
- 运行模块中的指定用例,例如:运行test_summary.py里面的TestSummary
pytest.main(["./test_summary.py::TestSummary", '-v'])
- 运行类中的指定用例,例如:运行test_summary.py里面的TestSummary类的test_01
pytest.main(["./test_summary.py::TestSummary::test_01", '-v'])
- 匹配包含king的用例(匹配目录名、模块名、类名、用例名)
pytest.main(['-k','king', '-v'])
- 匹配test_summary.py模块下包含king的用例
pytest.main(['-k','king',"./test_summary.py", '-v'])
总结
- 本次主要讲解了
pytest.main()
的使用,重点掌握运行指定用例
以上为内容纯属个人理解,如有不足,欢迎各位大神指正,转载请注明出处!
如果觉得文章不错,欢迎关注微信公众号,微信公众号每天推送相关测试技术文章