• pytest合集(2)— pytest运行方式


    一、命令行模式运行

    1、命令行模式运行pytest

    电脑桌面创建一个名为test_sample.py的新文件,包含函数和测试用例。

    # content of test_sample.py
    def func(x):
        return x + 1
    
    
    def test_answer():
        assert func(3) == 5

    打开test_sample.py所在的文件夹,cmd窗口输入命令:pytest。pytest会查找当前目录及其子目录下所有以test_*.py或*_test.py文件,然后执行文件中以test开头函数。详见pytest测试用例收集规则。

     

    Microsoft Windows [版本 10.0.19044.1766]
    (c) Microsoft Corporation。保留所有权利。

    C:\Users\057776\Desktop>pytest
    ==================================== test session starts ====================================
    platform win32 -- Python 3.8.8, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
    rootdir: C:\Users\057776\Desktop
    plugins: html-3.1.1, metadata-1.11.0, rerunfailures-9.1.1, assume-2.2.0, requests-mock-1.7.0
    collected 1 item

    test_sample.py F                                                                                                 [100%]

    ====================================== FAILURES ======================================
    _______________________________________ test_answer _______________________________________

        def test_answer():
    >       assert func(3) == 5
    E       assert 4 == 5
    E        +  where 4 = func(3)

    test_sample.py:18: AssertionError
    ================================= short test summary info =================================
    FAILED test_sample.py::test_answer - assert 4 == 5
    ==================================== 1 failed in 0.70s ====================================

    C:\Users\057776\Desktop>
     

    说明: 

    • collected 1 item:pytest运行的时候一共收集到了1条测试用例。
    • test_sample.py F:标记为F是指测试结果是失败的。
    • [100%] :指运行所有测试用例的总体进度。
    • FAILURES:输出了详细的错误信息,帮助我们分析测试原因,我们可以看到"assert func(3) == 5"这条语句出错了,错误的原因是func(3)=4,然后我们断言func(3) 等于 5。

    2、pytest运行结果标记符

    • . 点号,表示用例通过
    • F 表示失败 Failure
    • E 表示用例中存在异常 Error
    • S 表示用例被跳过 Skip
    • x 小写的 x 表示预期失败 xfail
    • X 大写的 X 表示预期失败,但是通过了

    二、Pycharm中运行

    1、Terminal终端中运行

    pycharm项目目录如下,选中test_sample.py文件,鼠标右键Open in | Open in Terminal,在命令行模式下输入pytest

     

    Microsoft Windows [版本 10.0.19044.1766]
    (c) Microsoft Corporation。保留所有权利。

    (venv) C:\Users\057776\PycharmProjects\pytest-demo\testcases>pytest
    ================================== test session starts ===================================
    platform win32 -- Python 3.8.8, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
    rootdir: C:\Users\057776\PycharmProjects\pytest-demo\testcases
    plugins: html-3.1.1, metadata-1.11.0, rerunfailures-9.1.1, assume-2.2.0, requests-mock-1.7.0
    collected 1 item                                                                                                                                                    

    test_sample.py F                                                                                                                                              [100%]

    ===================================== FAILURES =====================================
    ______________________________________ test_answer ______________________________________

        def test_answer():
    >       assert func(3) == 5
    E       assert 4 == 5
    E        +  where 4 = func(3)

    test_sample.py:18: AssertionError
    ================================ short test summary info ================================
    FAILED test_sample.py::test_answer - assert 4 == 5
    =================================== 1 failed in 0.60s ===================================

    (venv) C:\Users\057776\PycharmProjects\pytest-demo\testcases>
     

     2、配置测试运行器

    我们也可以通过配置来选择默认pytest的方式来运行py文件。

    File | Settings | Tools | Python Integrated Tools

     

    3、pytest.main()方法

    pytest.main()方法可以作为我们自动化测试项目的测试用例执行入口,下面我们对pytest.main()进行讲解。

    修改上面的test_sample.py文件如下:

    import pytest
    
    
    # content of test_sample.py
    def func(x):
        return x + 1
    
    
    def test_answer():
        assert func(3) == 5
    
    
    if __name__ == '__main__':
        pytest.main()
        # pytest.main(['test_sample.py'])
        # pytest.main(['-q','test_sample.py'])

    说明:

    • pytest.main() :无任何参数,会收集当前目录下所有的测试用例,相当于命令行模式下输入命令pytest。
    • pytest.main(['test_sample.py']) :一个参数,执行指定文件test_sample.py的所有测试用例。
    • pytest.main(['-q','test_sample.py']) :二个参数,参数-q表示安静模式, 不输出环境信息。

    (1)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

    可以看到, main() 函数接受两个参数:

    •  args :命令行参数列表,和命令行模式运行时的参数相同,在列表 List 里以字符串 str 的形式,多参数以 “,” 隔开,也可以传入测试case的路径。
    •  plugins :为插件参数,初始化期间要自动注册的插件对象列表。

    (2).pytest_cache文件夹

    pytest测试框架中执行完所有的测试用例后会在当前目录下生成 .pytest_cache ,里面就保存了上一次用例执行的信息。

     

     


    reference:

    Get Started — pytest documentation

  • 相关阅读:
    多比特杯武汉工程大学第六届ACM新生赛 A,L
    前端HTML5 +CSS3 5.CSS布局 5 定位
    Python中学习调试requests模块时出现的大坑(1)
    VMware 桥接模式下本机 PING 不通虚拟机的解决方法
    7.5 - 防火墙 7.6 - 安全协议
    Vue组件的渲染更新原理知识大连串
    【kali-密码攻击】(5.1.2)密码在线破解:Medusa
    Transformer
    区,段,碎片区与表空间结构
    校园二手物品交易系统微信小程序设计
  • 原文地址:https://blog.csdn.net/panc_guizaijianchi/article/details/125560183