美文网首页
pytest多线程或多进程执行测试用例

pytest多线程或多进程执行测试用例

作者: Chaweys | 来源:发表于2021-03-14 01:14 被阅读0次

    如果想分布式执行用例,用例设计必须遵循以下原则:
    (1)、用例之间都是独立的,
    (2)、用例a不要去依赖用例b,
    (3)、用例执行没先后顺序,
    (4)、随机都能执行每个用例都能独立运行成功每个用例都能重复运行,不影响其它用例。
    这跟就我们平常多个人工测试一样,用例都是独立的,可以随机分配不同人员执行,互相不依赖,用例之间也不存在先后顺序。
    
    1、pytest-parallel开启多线程执行测试用例
    import pytest
    def test_03(start,open_web1):
        print('测试用例3操作')
    def test_04(start,open_web1):
        print('测试用例4操作')
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_1.py",'--workers=1', '--tests-per-worker=3'])
    
    参数值配置:
    --workers=n           多进程运行需要加此参数,n是进程数。默认为1  【注:在windows系统中只能为1】
    --tests-per-worker=n  多线程运行需要加此参数,n是线程数。
    如果两个参数都配置了,就是进程并行,每个进程最多n个线程,总线程数:进程数*线程数
    pytest-parallel的workers参数在windows系统下永远是1,在linux和mac下可以取不同值。
    
    
    
    2、pytest-xdist开启多进程执行测试用例
    import pytest
    def test_03(start,open_web1):
        print('测试用例3操作')
    def test_04(start,open_web1):
        print('测试用例4操作')
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_1.py",'-n=2'])
        
    参数值配置:
    -n=2   表示开启2个CPU进程执行测试用例
    

    #coding=utf-8
    import pytest
    import time
    
    def testcase01():
        time.sleep(2)
        print('这里是testcase01')
    
    def testcase02():
        time.sleep(3)
        print('这里是testcase02')
    
    def testcase03():
        time.sleep(4)
        print('这里是testcase03')
    
    def testcase04():
        time.sleep(5)
        print('这里是testcase04')
    
    
    if __name__=="__main__":
        pytest.main([__file__,'--workers=1','--tests-per-worker=4'])
        #pytest.main(['-s',__file__,'-n=2'])
        #pytest.main(['-s',__file__])
    
    
    
    if __name__=="__main__":
        pytest.main(['-s',__file__])
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
    rootdir: E:\ProjectStudy\HDCZU_Study\pytest框架测试
    plugins: forked-1.3.0, parallel-0.1.0, xdist-2.2.1
    collected 4 items
    
    test_func2.py 这里是testcase01
    .这里是testcase02
    .这里是testcase03
    .这里是testcase04
    .
    ============================= 4 passed in 14.25s ==============================
    结果得知:不开启进程,执行时间为14.25s
    
    
    
    if __name__=="__main__":
        pytest.main(['-s',__file__,'-n=2'])
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
    rootdir: E:\ProjectStudy\HDCZU_Study\pytest框架测试
    plugins: forked-1.3.0, parallel-0.1.0, xdist-2.2.1
    gw0 I / gw1 I
    gw0 [4] / gw1 [4]
    
    ....
    ============================== 4 passed in 8.63s ==============================
    结果得知:开启2个进程,执行时间为8.63s
    
    
    
    if __name__=="__main__":
        pytest.main([__file__,'--workers=1','--tests-per-worker=4'])
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
    rootdir: E:\ProjectStudy\HDCZU_Study\pytest框架测试
    plugins: forked-1.3.0, parallel-0.0.10, xdist-2.2.1
    collected 4 items
    pytest-parallel: 1 worker (process), 4 tests per worker (threads)
    .这里是testcase02
    .这里是testcase03
    .这里是testcase04
    .
    ============================== 4 passed in 5.05s ==============================
    结果得知:开启1个进程4个线程,执行时间为5.05s
    
    
    
    问题:
    pytest-parallel多线程报错INTERNALERROR
    解决办法:
    (1)回退版本0.0.10 
    pip uninstall pytest-parallel   
    pip install "pytest-parallel==0.0.10"
    (2)在pycharm中指定项目为pytest项目
    

    如何让scope=session的fixture在test session中仅仅执行一次
    pytest-xdist是让每个worker进程执行属于自己的测试用例集下的所有测试用例
    这意味着在不同进程中,不同的测试用例可能会调用同一个scope范围级别较高(例如session)的fixture,
    该fixture则会被执行多次,这不符合scope=session的预期。
    
    可以通过使用锁定文件进行进程间通信来实现。from filelock import FileLock
    
    举例:
    import pytest
    from filelock import FileLock
    
    @pytest.fixture(scope="session")
    def login():
        print("登录,返回账号")
        with FileLock("session.lock"):
            name = "test01"
            token = "test01"
        yield name, token
        print("====退出登录!!!====")
    

    相关文章

      网友评论

          本文标题:pytest多线程或多进程执行测试用例

          本文链接:https://www.haomeiwen.com/subject/eygfcltx.html