【pytest】case多执行慢?pytest-xdist分布式测试,了解一下

简介: 【pytest】case多执行慢?pytest-xdist分布式测试,了解一下

随着自动化项目开展逐步深入,case也会越写越多。那么随之而来的问题,就是case的运行时长越来越久了。


此问题属于必须解决的那种,本着拿来主义思想,有现成的绝不自己造(其实我也不费造),我们自然能搜索

到解决办法,而pytest-xdist就是其中之一,先附上地址


pytest-xdist是一个pytest分布式测试插件,通过它的拓展,我们的pytest又有了新的能力:


  1. 并行运行测试:当你有多个cpu或主机,可以利用它们进行组合来运行测试。
  2. --looponfail:在子进程中重复运行测试。每次运行之后,pytest都会等待项目中的文件发生更改,然后重新运行之前失败的测试。
    重复此操作,直到所有测试通过,然后再次执行完整运行。
  3. 多平台覆盖:可以指定不同的解释器或不同的平台,并在这些平台上并行运行测试。


上述3点是官方的一个介绍,后面2点暂时可以不用去关注它,最重要的是第一点,有了它就可以进行分布式的运行测试用例。


一、安装


  1. 安装很简单,pip命令:


pip install pytest-xdist


  1. 如果你想看到可用的cpu数量,可以再装一个额外的插件psutil:


pip install pytest-xdist[psutil]


二、使用命令参数


要执行分布式运行,在运行命令后加参数即可。


  1. pytest -n NUMCPUS,这里的NUMCPUS就是使用的cpu数量。
  2. pytest -n auto,如果传auto的话,它会自动检测系统的cpu数量,并且用来运行测试。

1268169-20210415231512820-1460876468.png


这是我使用下来的对比效果,在不用分布式的执行下,运行花费了20s,而利用分布式运行后只用了6.5s,提升效果

非常显著。目前我们的项目case有300多条,运行下来的时间在70s左右。


另外,对于自动化用例的运行,我们其实还要注意持续观察运行的结果,找出那些运行时间偏长的测试用例,然后分析问题,针对性的进行优化,

进一步的提高运行效率。


三、pytest-xdist运行顺序


在默认情况下,-n指令运行测试用例是随机的,不按某种顺序来运行。


这也是我写自动化用例所提倡的,那就是任何case都可以单独运行,随机运行,互不影响。这样的话,在使用分布式的时候,就不会有其他

case之间依赖不能运行的问题。


当然了,xdist也提供了2种顺序运行的模式:


  1. --dist loadscope:可以按测试模块或测试类进行分组,可以让同组的case在同一个进程中运行。如果两者同时存在,那么类分组优先与模块分组。
  2. --dist loadfile:可以按文件分组,保证了同一个文件中的所有测试用例在同一个进程中运行。


如果觉得每次在命令行里带参数太麻烦了,也可以把参数加到到配置文件pytest.ini里:


[pytest]
addopts = -nauto --dist=loadfile


四、关于scope是session的fixture函数的处理


其实pytest-xdist的设计是能让每个运行进程执行自己集合下的所有测试用例。如果你的代码里有一个fixture函数scope='session'

那么,在不同进程中,这个fixture函数会被多次执行,这个动作就与scope='session'的作用产生了冲突。


虽然pytest-xdist没有内置的方法来使这样的fixture函数只执行一次,但可以通过使用锁文件来实现进程间通信。


这里官方提供了一段代码示例,大家可以了解一下:


import json
import pytest
from filelock import FileLock
@pytest.fixture(scope="session")
def session_data(tmp_path_factory, worker_id):
    if worker_id == "master":
        # not executing in with multiple workers, just produce the data and let
        # pytest's fixture caching do its job
        return produce_expensive_data()
    # get the temp directory shared by all workers
    root_tmp_dir = tmp_path_factory.getbasetemp().parent
    fn = root_tmp_dir / "data.json"
    with FileLock(str(fn) + ".lock"):
        if fn.is_file():
            data = json.loads(fn.read_text())
        else:
            data = produce_expensive_data()
            fn.write_text(json.dumps(data))
    return data


这里的filelock也是一个第三方库,它可以在中实现独立于平台的文件锁定,提供了一种简单的进程间通信方式。


代码想表达的意思大概是:


  1. 在第一次执行fixture函数的时候,产生的数据会存到FileLock的锁文件中
  2. 其他进程则会直接从文件中读取数据。


这个用法,暂时我还没有实践,但是给了我提示,我一直想优化一下我的数据库初始化,或许用这个方法可以试试,届时再分享。

相关文章
|
1月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
176 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
26 2
|
1月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
55 3
|
1月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
44 1
|
2月前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
70 6
基于Python访问Hive的pytest测试代码实现
|
3月前
|
资源调度 Java 调度
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
|
3月前
|
Web App开发 安全 测试技术
自动化测试中的Python魔法:使用Selenium和pytest框架
【8月更文挑战第31天】 在软件开发的海洋中,自动化测试是确保航行安全的灯塔。本文将带你探索如何利用Python语言结合Selenium和pytest框架,搭建一套高效的自动化测试体系。我们将从基础设置讲起,逐步深入到编写测试用例,最后通过一个实战案例来展示如何在实际项目中运用这些工具。文章旨在为读者提供一套清晰的自动化测试解决方案,让你的开发之旅更加顺畅。
|
3月前
|
测试技术
一款功能完善的智能匹配1V1视频聊天App应该通过的测试CASE
文章列举了一系列针对1V1视频聊天App的测试用例,包括UI样式、权限请求、登录流程、匹配逻辑、消息处理、充值功能等多个方面的测试点,并标注了每个测试用例的执行状态,如通过(PASS)、失败(FAIL)或需要进一步处理(延期修改、待定、方案再定等)。
66 0
|
3月前
|
存储 Kubernetes 测试技术
阿里云块存储问题之处理信用分低的测试用例(即不稳定Case)如何解决
阿里云块存储问题之处理信用分低的测试用例(即不稳定Case)如何解决
46 0
|
9天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
38 3