Pytest测试框架系列 - pytest.main()运行测试用例详解

前言

我们在看见每个项目都有个入口文件,用来启动项目,但是在我们的自动化项目里面,特别是前面使用过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`文件,如下图

pytest.main()
我们右键执行 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() 的使用,重点掌握运行指定用例

以上为内容纯属个人理解,如有不足,欢迎各位大神指正,转载请注明出处!

如果觉得文章不错,欢迎关注微信公众号,微信公众号每天推送相关测试技术文章
个人微信号

  • 10
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试之路king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值