• pytest-xdist 分布式执行用例


    pytest-xdist是属于进程级的并发运行


    一般写用例尽量要遵循的规则:
    用例之间没有依赖关系,用例可以独立运行的
    用例可随机运行
    每个用例都能重复运行,运行结果不影响其他用例


    分布式执行用例:
    直接执行:pytest -s
    自动检测到系统的CPU核数来分布式执行:pytest -s -n auto
    指定本机cpu数量来运行:pytest -s -n 2

    报告:
    分布式执行用例 pytest-xdist,结合使用pytest-html
    pytest -s -n auto --html=report.html --self-contained-html

    另:-------------------------------------------------------

    管理用例执行顺序:    pytest-xdist默认是无序执行的,可以通过 --dist 参数来控制顺序 :

    --dist=loadscope
    将按照同一个module下的函数、同一个测试类class下的方法来分组,
    然后将每个组发给可以执行的进程里去,同一组的测试用例在同一个进程中执行
    注意:目前无法自定义分组,因此按类class分组 优先于 按模块module分组 执行


    --dist=loadfile
    按照同一个文件名来分组,然后将每个测试组发给可以执行的进程,确保同一组的测试用例在同一个进程中执行


    存在有一个问题:
    如以下目录:

    conftest.py   #写了预置 login 在内
    test_1.py
    __init__.py
        #二级目录
        conftest.py
        test_2.py
         __init__.py

    使用pytest-xdist分布式运行测试用例,每个进程里面都是互相独立运行被分到同一组的用例
    那么就会存在一种情况:
    假设现在每条case都需要登录之后才能执行,但是因为进程是独立运行被分到同一组的用例,
    但是登录login这个预置条件又会有很多个进程都会调用
    -->>这里就会涉及到被fixture装饰的login方法会被请求调用多次
    -->>(但是fixture的用处就是避免重复请求运行,这里就有点冲突了)

    实现只调用一次方法:
    (就算用例分组到不同进程内,分布式运行用例时也只调用一次被fixture的login)
    当第一次请求这个fixture时,则使用with方法,利用FileLock仅产生一次fixture数据
    当其他进程再次请求这个fixture时,则会从文件中读取数据

    import pytest
    from filelock import FileLock
    
    @pytest.fixture(scope="session")
    def login():
        print("登录成功后返回user 和token")
        with FileLock("session_lock"):
            user = "admin"
            token = "TYUW12ewesdfsdfdsf3123dese"
        yield name, token
        print("退出登录")        
  • 相关阅读:
    敏感性分析与风险分析
    深入理解PHP之foreach
    PHP上传文件到七牛(Qiniu)
    Swoft 新手向教程
    HP下kafka的实践
    关于BOOTSTRAP的整理和理解
    win10 ubuntu 子系统安装php
    CentOS7 安装 PHP7.2
    PHP 锁机制
    深入理解PHP之strpos
  • 原文地址:https://www.cnblogs.com/QiKa/p/13269429.html
Copyright © 2020-2023  润新知