zoukankan      html  css  js  c++  java
  • pytest-xdist分布式执行测试用例

    前言

    平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候,
    我们会用测试人力成本换取时间成本,这个时候多找个小伙伴把任务分成2部分,于是时间缩减一半。如果是十个人一起执行,1000个用例理论上只需100分钟就能完成,时间缩短到了1/10。大大节省的测试时间,为项目节省了时间成本。

    同样道理,当我们测试用例非常多的时候,一条条执行,很显然会比较慢,那么如何让测试用例并行执行呢,这就是我们接下来要讲的pytest分布式执行插件pytest-xdist

    pytest-xdist

    cmd里面使用pip安装,目前版本号Version: 1.23.2

    pip install pytest-xdist

    >pip show pytest-xdist
    Name: pytest-xdist
    Version: 1.23.2
    Summary: pytest xdist plugin for distributed testing and loop-on-failing modes
    Home-page: https://github.com/pytest-dev/pytest-xdist
    Author: holger krekel and contributors
    Author-email: pytest-dev@python.org,holger@merlinux.eu
    License: MIT
    Location: e:python36libsite-packages
    Requires: execnet, pytest-forked, six, pytest

    pytest-xdist官网地址:【Home-page: https://github.com/pytest-dev/pytest-xdist】

    该pytest-xdist插件扩展了一些独特的测试执行模式pytest:

    • 测试运行并行化:如果有多个CPU或主机,则可以将它们用于组合测试运行。会加快运行速度

    • --looponfail:在子进程中重复运行测试。每次运行之后,pytest会等待,直到项目中的文件发生更改,然后重新运行以前失败的测试。
      重复此过程直到所有测试通过,之后再次执行完整运行。
    • 多平台覆盖:您可以指定不同的Python解释器或不同的平台,并在所有平台上并行运行测试。
      在远程运行测试之前,pytest有效地将您的程序源代码“rsyncs”到远程位置。报告所有测试结果并显示给您的本地终端。您可以指定不同的Python版本和解释器。
      如果您想知道pytest-xdist如何在幕后工作,可以看这里【OVERVIEW】

    并行测试

    多cpu并行执行用例,直接加个-n参数即可,后面num参数就是并行数量,比如num设置为3

    pytest -n 3

    运行以下代码,项目结构如下

    web_conf_py是项目工程名称
    │  conftest.py
    │  __init__.py
    │              
    ├─baidu
    │  │  conftest.py
    │  │  test_1_baidu.py
    │  │  test_2.py
    │  │  __init__.py 
    │          
    ├─blog
    │  │  conftest.py
    │  │  test_2_blog.py
    │  │  __init__.py      

    代码参考:

    # web_conf_py/conftest.py
    import pytest
    
    @pytest.fixture(scope="session")
    def start():
        print("
    打开首页")
        return "yoyo"
    
    # web_conf_py/baidu/conftest.py
    import pytest
    
    @pytest.fixture(scope="session")
    def open_baidu():
        print("打开百度页面_session")
    
    # web_conf_py/baidu/test_1_baidu.py
    import pytest
    import time
    
    def test_01(start, open_baidu):
        print("测试用例test_01")
        time.sleep(1)
        assert start == "yoyo"
    
    def test_02(start, open_baidu):
        print("测试用例test_02")
        time.sleep(1)
        assert start == "yoyo"
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_1_baidu.py"])
    
    
    # web_conf_py/baidu/test_2.py
    import pytest
    import time
    
    def test_06(start, open_baidu):
        print("测试用例test_01")
        time.sleep(1)
        assert start == "yoyo"
    def test_07(start, open_baidu):
        print("测试用例test_02")
        time.sleep(1)
        assert start == "yoyo"
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_2.py"])
    
    
    # web_conf_py/blog/conftest.py
    import pytest
    
    @pytest.fixture(scope="function")
    def open_blog():
        print("打开blog页面_function")
    
    # web_conf_py/blog/test_2_blog.py
    
    import pytest
    import time
    def test_03(start, open_blog):
        print("测试用例test_03")
        time.sleep(1)
        assert start == "yoyo"
    
    def test_04(start, open_blog):
        print("测试用例test_04")
        time.sleep(1)
        assert start == "yoyo"
    
    def test_05(start, open_blog):
        '''跨模块调用baidu模块下的conftest'''
        print("测试用例test_05,跨模块调用baidu")
        time.sleep(1)
        assert start == "yoyo"
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_2_blog.py"])
    

    正常运行需要消耗时间:7.12 seconds

    E:YOYOweb_conf_py>pytest
    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: E:YOYOweb_conf_py, inifile:
    plugins: xdist-1.23.2, metadata-1.7.0, html-1.19.0, forked-0.2
    collected 7 items
    
    baidu	est_1_baidu.py ..                                                 [ 28%]
    baidu	est_2.py ..                                                       [ 57%]
    blog	est_2_blog.py ...                                                  [100%]
    
    ========================== 7 passed in 7.12 seconds ===========================

    设置并行运行数量为3,消耗时间:3.64 seconds,大大的缩短了用例时间

    E:YOYOweb_conf_py>pytest -n 3
    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: E:YOYOweb_conf_py, inifile:
    plugins: xdist-1.23.2, metadata-1.7.0, html-1.19.0, forked-0.2
    gw0 [7] / gw1 [7] / gw2 [7]
    scheduling tests via LoadScheduling
    .......                                                                  [100%]
    ========================== 7 passed in 3.64 seconds ===========================

    测试报告

    使用pytest-xdist插件也能生成html报告,完美支持pytest-html插件

    pytest -n 3 --html=report.html --self-contained-html

    转载自:https://www.cnblogs.com/yoyoketang/p/9775646.html

  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/yxfeng/p/10395860.html
Copyright © 2011-2022 走看看