pytest分布式执行(pytest-xdist)

前言

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

pytest 3.6.3
pytest-xdist 1.23.2

同样道理,当我们测试用例非常多的时候,一条条执行,很显然会比较慢,那么如何让测试用例并行执行呢,这就是我们接下来要讲的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:\python36\lib\site-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("\n打开首页")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 timedef 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 timedef 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.pyimport 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:\YOYO\web_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:\YOYO\web_conf_py, inifile:
plugins: xdist-1.23.2, metadata-1.7.0, html-1.19.0, forked-0.2
collected 7 itemsbaidu\test_1_baidu.py ..                                                 [ 28%]
baidu\test_2.py ..                                                       [ 57%]
blog\test_2_blog.py ...                                                  [100%]========================== 7 passed in 7.12 seconds ===========================

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

E:\YOYO\web_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:\YOYO\web_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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL根据binlog恢复数据

简介 本文介绍了使用mysqlbinlog导出数据,根据binlog恢复数据,和导出数据时报需要super权限的解决方法。 环境 MySQL: 5.7.40 说明 MySQL的binlog是数据库服务器在运行过程中产生的日志文件,记录了数据库增删改的操作,可用于恢复和…

重排链表,剑指offerII 26,力扣 120

目录 力扣题目地址: 题目: 那我们直接看题解吧: 解题方法: 难度分析: 审题目事例提示: 解题分析: 解题思路: 解题补充: 力扣题目地址: 143. 重排链表 - 力扣&…

基于Django+Tensorflow卷积神经网络鸟类识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介系统概述系统功能核心技术系统架构系统优势 二、功能三、系统四. 总结  总结 一项目简介 介绍一个基于DjangoTensorflow卷积神经网络鸟类识别系统是一个非…

[ABC261E] Many Operations(dp,位运算,打表)

[ABC261E] Many Operations - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Problem Statement We have a variable X and N kinds of operations that change the value of X. Operation i is represented as a pair of integers (Ti​,Ai​), and is the following operati…

多目标水母搜索算法(MOJS)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标水母搜索算法MOJS 多目标水母搜索算法(Multi-Objective Jellyfish Search algorithm,MOJS)由Jui-Sheng Chou等…

Verilog 入门(一)(Verilog 简介)

文章目录 什么是 Verilog HDL?Verilog 主要能力模块时延数据流描述方式 什么是 Verilog HDL? Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和…

景联文科技加入中国人工智能产业联盟(AIIA)数据委员会

近日,景联文科技加入中国人工智能产业联盟(AIIA)数据委员会,成为委员会成员单位。 中国人工智能产业发展联盟(简称AIIA)是在国家发改委、科技部、工信部、网信办指导下,由中国信息通信研究院等单…

docker stop停止一个容器

学习停止一个正在运行的容器,要求学习者参照示例将正在运行的名为firstContainer的容器停止。 相关知识 使用docker stop停止一个容器 docker stop可以用来终止一个正在运行的容器。它的命令格式如下: docker stop [OPTIONS] Container [Container .…

基于springboot家具商城系统

基于springboot家具商城系统 摘要 这个Spring Boot家具商城系统旨在通过现代化的Web应用程序技术提供一个全功能的电子商务平台。系统的核心实体是家具商品,通过RESTful API控制器提供对商品的增删改查等操作。这个系统使用了Spring Boot框架,借助其简便…

nn.TransformerEncoder的输出为NaN值的原因及解决方法

问题描述: 当使用nn.TransformerEncoder时,即如下情况: 实例化一个TransformerEncoder self.encoder_layer nn.TransformerEncoderLayer(d_modelencoder_in_dim, nheadencoder_head,dim_feedforwardencoder_ffnn_dim,batch_firstbatch_fir…

关于团队管理的一些思考

1、团队:为什么需要团队,一个人或者一群人不行吗,当一个项目需要的能力仅靠个人无法满足时,这时候就需要团队来完成,一群人和一个团队的主要区别就是团队有一个共同的目标,团队成员可以发挥自己的优势一起完…

06 C++中变量的作用域

系列文章目录 06 C中变量的作用域 目录 系列文章目录 文章目录 前言 一、局部变量 二、全局变量 三、块作用域变量 总结 前言 C中变量的作用域指的是变量可以被访问的范围,即变量在程序中存在的有效范围。不同作用域的变量具有不同的可见性和生命周期。 在…

Mac单独修改应用语言

方法1: 方法2: defaults write com.microsoft.Excel AppleLanguages ("zh-cn") defaults write com.microsoft.Word AppleLanguages ("zh-cn")参考:https://www.zhihu.com/question/24976020

红队攻防实战系列一之Cobalt Strike

他日若遂凌云志,敢笑黄巢不丈夫 本文首发于先知社区,原创作者即是本人 前言 在红队攻防中,需要我们拥有综合能力,不仅仅是web渗透的漏洞挖掘与利用,边界突破的方式有很多种,当然这需要我们拥有很强的意识…

【LeetCode】101. 对称二叉树

101. 对称二叉树 难度:简单 题目 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出&#…

图书管理系统源码,图书管理系统开发,图书借阅系统源码配置和运行图解源码已附加

目录 配置简介和软件条件 数据库附件配置 vs应用程序web.config配置数据库链接字符串 数据库文件脚本代码 配置简介和软件条件 所需要的软件是Vs2017以上数据库是Sqlserver2012以上,如果数据库附件不了可以使用数据库脚本附件数据库脚本会在文章末尾写出来。可以…

CG 运算符 流程控制

运算符 算数运算符 注意:取余运算只能作用于整数 加 减- 乘* 除/ 取余% 自增 自减--三目运算符 条件 ?条件真:条件假 例如:fixed a 4>5? 4:5; 逻辑运算符 && 逻辑与 || 逻辑或 注意:CG中的逻辑运算符…

ArkTS-页面转场动画

页面转场动画 在全局pageTransition方法内配置页面入场和页面退场时的自定义转场动效 两个页面间发生跳转,一个页面消失,另一个页面出现,这时可以配置各自页面的页面转场参数实现自定义的页面转场效果。页面转场效果写在pageTransition函数中…

【Python】获取ip

要使用Python获取IP地址,可以使用socket库中的gethostname()函数和gethostbyname()函数。 import socketdef get_ip_address():hostname socket.gethostname()ip_address socket.gethostbyname(hostname)return ip_addressip get_ip_address() print("IP地…

【BUG合集】(一)①数据库存1/0,请求结果返回true和false;②sql查数据库能查,但mybatis查为空;③data64图片存储为异常;

前言 最近,在工作上接手的任务中,各种 bug 问题出现,在解决的同时也可以记录一下。因此,觉得可以出个记录 bug 合集。方便后来者碰到类似情况,可以作为一个参考进行解决。 文章题目就包含当前文章内容中所遇到的三个 b…