zoukankan      html  css  js  c++  java
  • 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("退出登录")        
  • 相关阅读:
    ReportMachine打印条形码的问题
    性能测试基础知识
    jmeter请求参数中文乱码及无法读取CSV文件解决办法
    soapui学习
    java环境变量和查看安装路径
    python字典中显示中文
    Jmeter做webservices接口测试
    windows 上robot framework 读取sqlite3提示:OperationalError: unable to open database file错误
    c++ 复习练习
    笔记草稿。
  • 原文地址:https://www.cnblogs.com/QiKa/p/13269429.html
Copyright © 2011-2022 走看看