pytest插件的7种用法

目录
  • 1.pytest-repeat 重复跑
    • 第一种用法: 装饰器 @pytest.mark.repeat(次数)
    • 第二种用法: 命令行参数
    • 第三种用法: 结合repeat-scope运行
  • 2.pytest-assume 断言后继续跑
  • 3.pytest-ordering 用例顺序
  • 4.pytest-dependency 用例依赖
  • 5.pytest-rerunfailures 用例失败重跑
  • 6.pytest-xdist 分布式执行
  • 7.pytest-xfail 预期失败

1.pytest-repeat 重复跑

安装包

pip install pytest-repeat

第一种用法: 装饰器 @pytest.mark.repeat(次数)

示例代码

import pytest
@pytest.mark.repeat(5)
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv',__file__])

第二种用法: 命令行参数

语法

pytest --count=5 test.py

示例代码

import pytest
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--count=5',__file__])

第三种用法: 结合repeat-scope运行

如果我们要对多个测试函数进行重复运行,要么加多个装饰器,要么用命令行参数

但是上述两种方法都是A重复,B重复这样,无法做到AB-AB-AB的模式

如果要实现组合重复运行,那就要用到–repeat-scope

–repeat-scope类似于pytest fifixture的scope参数,–repeat-scope也可以设置参数:session, module , class 或者 function (默认值)

function (默认)范围针对每个用例重复执行,再执行下一个用例

class 以class为用例集合单位,重复执行class里面的用例,再执行下一个

module 以模块为单位,重复执行模块里面的用例,再执行下一个

session 重复整个测试会话,即所有收集的测试执行一次,然后所有这些测试再次执行等等

示例代码1:A运行2次,B运行2次

import pytest
def test_002():
assert 1==2
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--count=2',__file__])
#运行结果
FAILED test_demo1.py::test_002[1-2] - assert 1 == 2
FAILED test_demo1.py::test_002[2-2] - assert 1 == 2
FAILED test_demo1.py::test_001[1-2] - assert 1 == 2
FAILED test_demo1.py::test_001[2-2] - assert 1 == 2

示例代码:A-B运行2次

import pytest
def test_002():
assert 1==2
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--count=2','--repeat-scope=session',__file__])
#AB运行1次后再运行1次AB
FAILED test_demo1.py::test_002[1-2] - assert 1 == 2
FAILED test_demo1.py::test_001[1-2] - assert 1 == 2
FAILED test_demo1.py::test_002[2-2] - assert 1 == 2
FAILED test_demo1.py::test_001[2-2] - assert 1 == 2

2.pytest-assume 断言后继续跑

安装

 pip install pytest-assume

实际测试的过程中,有可能遇到一种情况,就是你某个断言执行失败也想要做下去(比如登录的测试,测试失败后,还是要返回主页继续下一轮的测试)。而默认情况下,如果断言失败,assert后面的语句是不会执行的了。

可以应用在多重断言的场景!(可以同时做多个断言)

没有assume的示例

import pytest
def test_001():
assert 1==2 #如果改为1==1,下面是不会执行的
print('\n对了会做,错了不会做')
if __name__ == '__main__':
pytest.main(['-s','test_order_001.py'])

有assume的示例

import pytest
def test_001():
pytest.assume(1==2)
print('\n对了会做,错了也会做')
if __name__ == '__main__':
pytest.main(['-sv','test_order_001.py'])

assume的另外一种写法:上下文管理器

def test_assume2():
with pytest.assume:
 assert 1==2
 assert 1==3

下面图1直接用pytest.assume不会显式testid的内容,而图2中assert就能显示变量的值,要解决这个问题就可以用with的写法

3.pytest-ordering 用例顺序

安装

pip install pytest-ordering

pytest默认按字母顺序去执行的(小写英文—>大写英文—>0-9数字)

用例之间的顺序是文件之间按照ASCLL码排序,文件内的用例按照从上往下执行。

改变测试用例的执行顺序,用法是加上装饰器

@pytest.mark.run(order=[number])

示例

import pytest
@pytest.mark.run(order=2) #
def test_001():
assert 1==1
@pytest.mark.run(order=1) #如果没有这两句话,那么运行顺序就是001再002
def test_002():
assert 2==2
if __name__ == '__main__':
pytest.main(['-v','test_order_001.py'])

其他的运行方式

方式一
第一个执行:@ pytest.mark.first
第二个执行:@ pytest.mark.second
倒数第二个执行:@ pytest.mark.second_to_last
最后一个执行:@pytest.mark.last
方式二
第一个执行:@ pytest.mark.run('first')
第二个执行:@ pytest.mark.run('second')
倒数第二个执行:@ pytest.mark.run('second_to_last')
最后一个执行:@ pytest.mark.run('last')

4.pytest-dependency 用例依赖

主要解决用例之间的依赖关系。如果依赖的上下文失败后续的用例会被标识为跳过执行,相当于执

行了 pytest.mark.skip

安装

pip install pytest-dependency

函数示例:

import pytest
@pytest.mark.dependency() #打上标记
def test_001():
assert 1==2
@pytest.mark.dependency(depends=['test_001']) #依赖于test_001,test_001断言
成功了才会继续这个。
def test_002():
assert 1==1
if __name__ == '__main__':
pytest.main(['-sv','test_order_001.py'])

name示例:

import pytest
@pytest.mark.dependency(name='a')
def test_001():
assert 1==2
@pytest.mark.dependency(depends=['a'])
def test_002():
assert 1==1
if __name__ == '__main__':
pytest.main(['-sv','test_order_001.py'])

类示例

import pytest
class Test_001():
@pytest.mark.dependency()
def test_001(self):
assert 1==2
@pytest.mark.dependency(depends=['Test_001::test_001'])
def test_002():
assert 1==1
if __name__ == '__main__':
pytest.main(['-sv','test_order_001.py'])

5.pytest-rerunfailures 用例失败重跑

安装

pip install pytest-rerunfailures

使用方法一: 装饰器

import pytest
import random
from arrow import now
@pytest.mark.flaky(reruns=50,reruns_delay=2) #重跑50次,每次间隔2s
def test_001():
print(now().format('YYYY-MM-DD HH:mm:ss'))
assert 1==random.randint(1,5) #只要在多次RERUN中遇到一次成功,即可停止,并最终结果
为PASSED
if __name__ == '__main__':
pytest.main(['-sv',__file__])

使用方法二: 命令行

import pytest
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--reruns=2','--reruns-delay=2',__file__])
#参数前千万不要有空格,会报错

6.pytest-xdist 分布式执行

pytest-xdist,让自动化测试用例可以分布式执行,从而大大节省测试时间。pytest-xdist 是属于进程级别的并发。

分布式测试用例的设计原则:

(1)独立运行:用例之间是独立的,并且没有依赖关系,还可以完全独立运行。

(2)随机执行:用例执行不强制按顺序执行,支持顺序执行或随机执行。

(3)不影响其他用例:每个用例都能重复运行,运行结果不会影响其他用例

pytest-xdist 通过一些独特的测试执行模式扩展了 pytest:

(1)测试运行并行化:如果有多个CPU或主机,则可以将它们用于组合的测试运行。这样可以加快开发速度或使用远程计算机的特殊资源。

(2)–looponfail:在子进程中重复运行测试。每次运行之后,pytest 都会等到项目中的文件更改后再

运行之前失败的测试。重复此过程,直到所有测试通过,然后再次执行完整运行。

(3)跨平台覆盖:可以指定不同的 Python 解释器或不同的平台,并在所有这些平台上并行运行测试。

用法:

其实就是参数

-n numprocesses #如 -n 2 就是用2个
-n auto #自动检测物理CPU个数
-n logical #检测逻辑CPU个数
逻辑CPU个数=物理cpu数量x cpu核数 x 1(不支持ht超线程技术,如果开启就是2)
超线程:一个CPU核就是一个物理线程,由英特尔开发超线程技术可以把一个物理线程模拟出两个线程来
使用,使得单个核心用起来像两个核一样,以充分发挥CPU的性能.

参数

distributed and subprocess testing:
-n numprocesses, --numprocesses=numprocesses
Shortcut for '--dist=load --tx=NUM*popen'. With
'auto',
attempt to detect physical CPU count. With
'logical',
detect logical CPU count. If physical CPU count
cannot
be found, falls back to logical count. This will be
0
when used with --pdb.
--maxprocesses=maxprocesses
limit the maximum number of workers to process the
tests
when using --numprocesses=auto
--max-worker-restart=MAXWORKERRESTART
maximum number of workers that can be restarted when
crashed (set to zero to disable this feature)
--dist=distmode set mode for distributing tests to exec
environments.
each: send each test to all available environments.
load: load balance by sending any pending test to
any
available environment.
loadscope: load balance by sending pending groups of
tests in the same scope to any available
environment.
loadfile: load balance by sending test grouped by
file
to any available environment.
(default) no: run tests inprocess, don't distribute.
--tx=xspec add a test execution environment. some examples: --
tx
popen//python=python2.5 --tx
socket=192.168.1.102:8888
--tx ssh=user@codespeak.net//chdir=testcache
-d load-balance tests. shortcut for '--dist=load'
--rsyncdir=DIR add directory for rsyncing to remote tx nodes.
--rsyncignore=GLOB add expression for ignores when rsyncing to remote
tx
nodes.
--boxed backward compatibility alias for pytest-forked --
forked
--testrunuid=TESTRUNUID
provide an identifier shared amongst all workers as
the
value of the 'testrun_uid' fixture,
,if not provided, 'testrun_uid' is filled with a new
unique string on every test run.
-f, --looponfail run tests in subprocess, wait for modified files and
re•run failing test set until all pass.

7.pytest-xfail 预期失败

第一种用法:

import pytest
@pytest.mark.xfail(True,reason='预期失败,结果成功')
def test_xfail1():
assert True
@pytest.mark.xfail(True,reason='预期失败,结果失败')
def test_xfail2():
assert False
@pytest.mark.xfail(False,reason='预期成功,结果失败')
def test_xfail3():
assert False
@pytest.mark.xfail(False,reason='预期成功,结果成功')
def test_xfail4():
assert True
if __name__ == '__main__':
pytest.main(['-sv',__file__])

输出:

test_xfail.py::test_xfail1 XPASS (预期失败,结果成功)
test_xfail.py::test_xfail2 XFAIL (预期失败,结果失败)
test_xfail.py::test_xfail3 FAILED
test_xfail.py::test_xfail4 PASSED

第二种用法:

import pytest
@pytest.mark.xfail(raises=AssertionError)
def test_xfail2():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv',__file__])

输出:

test_xfail2.py::test_xfail2 XFAIL

如果这个时候带上–runxfail参数,就会忽略所有的xfail

import pytest
@pytest.mark.xfail(raises=AssertionError)
def test_xfail2():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--runxfail',__file__])
###输出就相当于没有那个装饰器
test_xfail2.py::test_xfail2 FAILED
================================== FAILURES
===================================
_________________________________ test_xfail2
_________________________________
@pytest.mark.xfail(raises=AssertionError)
def test_xfail2():
> assert 1==2
E assert 1 == 2
E +1
E -2
test_xfail2.py:6: AssertionError
=========================== short test summary info
===========================
FAILED test_xfail2.py::test_xfail2 - assert 1 == 2
============================== 1 failed in 0.06s
==============================

第三种用法:

def test_xfail3():
pytest.xfail()
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv',__file__])

同上输出

到此这篇关于pytest插件的7种用法的文章就介绍到这了,更多相关pytest 插件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pytest实现多进程与多线程运行超好用的插件

    目录 前言 一.pytest-parallel 二.pytest-xdist 三.对比说明 四.特别注意 前言 如果想分布式执行用例,用例设计必须遵循以下原则: 1.用例之间都是独立的,2.用例a不要去依赖用例b3.用例执行没先后顺序,4.随机都能执行每个用例都能独立运行成功每个用例都能重复运行,不影响其它用例这跟就我们平常多个人工测试一样,用例都是独立的,可以随机分配不同人员执行,互相不依赖,用例之间也不存在先后顺序 一.pytest-parallel 安装:pip install pytes

  • pytest官方文档解读之安装和使用插件的方法

    目录 一.pip 安装 二.查找可用插件 三.在测试模块或者conftest文件中加载指定插件 四.查看被激活的插件 五.注销插件 本节讨论安装和使用第三方插件.关于编写自己的插件,我们下一章继续. 一.pip 安装 就像安装一些其他第三方库一样,使用pip也可以很容易地安装第三方插件,pytest-NAME这是你要安装的插件名称: # 安装 pip install pytest-NAME #卸载 pip uninstall pytest-NAME 比如我这里安装一个pytest-xdist的插

  • python中Pytest常用的插件

    目录 前言 1. 用例依赖 2. 失败重跑 3. 指定用例执行顺序 4. 分布式运行 5. 多重断言 6. 小结 前言 除了框架本身提供的功能外,Pytest还支持上百种第三方插件,良好的扩展性可以更好的满足大家在用例设计时的不同需求.本文将为大家详细介绍下面5项常用的插件. 1. 用例依赖 编写用例的时候,我们会注意用例之间的独立性,但部分用例之间确实存在关联,无法做到彻底独立,那么我们就可以通过使用插件pytest-dependency设置用例之间的依赖关系.当用例A依赖于用例B时,若用例B

  • vue使用codemirror的两种用法

    这是我自己做的一个左边点击对应的标题,右边显示相应代码的一个功能.代码显示这里用的是vue-codemirror插件. 第一种用法: 1.安装:npm install vue-codemirror --save 2.在main.js中引入 import VueCodeMirror from 'vue-codemirror' import 'codemirror/lib/codemirror.css' Vue.use(VueCodeMirror) 3.在组件中使用 import { codemir

  • 详解pytest分布式执行插件 pytest-xdist 的高级用法

    想要使用多个CPU核心来进行测试,可以使用 -n 参数( 或者 --numprocesses)(使用8个核心来跑测试用例) pytest -n 8 使用 -n auto 参数可以利用电脑的所有核心来跑测试用例测试时使用的算法可以根据--dist命令参数定制: --dist load(默认选项):给每个CPU核心随机分配用例,不保证执行顺序. --dist loadscope:对于测试函数,测试按模块分组,对于测试方法,测试按类分组.每组作为一个整体分配给可用的worker.这保证了组中的所有测试

  • jquery弹出框插件jquery.ui.dialog用法分析

    本文实例讲述了jquery弹出框插件jquery.ui.dialog用法.分享给大家供大家参考,具体如下: 1. jquery.ui.dialog 官方地址 http://jqueryui.net/dialog/ jquery.ui.dialog是一个非常灵活的模式框,它的官方地址为: http://docs.jquery.com/UI/Dialog 2. 文件引用 要使用jquery.ui.dialog,需要引用两个文件,1个是js,另外1个是css 在contentpage中添加: <scr

  • pytest中的fixture基本用法

    目录 简介: fixture的功能 特点及优势 基本用法 fixture在自动化中的应用--作用域 fixture在自动化中的应用-yield关键字 fixture在自动化中的应用--数据共享 fixture在自动化中的应用-自动应用 fixture在自动化中的应用-参数化 简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方式实现,每个fixtur

  • flex复选框和下拉列表的几种用法整理

    这几天接触了flex的很多控件,让我印象最深刻的就是控件的数据绑定几乎所有控件都可以这样做,基本上来说原理和html一样,我自己闲暇时间就整理了有关复选框可下拉的几种用法,下面就给大家分享一下. 1.复选框 这里我主要研究的该控件的全选,全不选,反选以及选中的操作,原理也就是也能用selected这个属性,true表示选中,只需遍历就能实现,此处我使用的是动态的复选框,页面代码如下 复制代码 代码如下: <mx:VBox top="50"> <mx:VBox>

  • 详解vue 模版组件的三种用法

    本文介绍了详解vue 模版组件的三种用法,分享给大家,具体如下: 第一种 //首先,别忘了引入vue.js <div id="user_name_01"></div> <script src="../node_modules/vue/dist/vue.js"></script> <script> var User_01 = Vue.extend({// 创建可复用的构造器 template: '<p&

  • jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】

    本文实例讲述了jQuery悬停文字提示框插件jquery.tooltipster.js用法.分享给大家供大家参考,具体如下: 运行效果截图如下: index.html页面: <!DOCTYPE html> <html lang="en"> <head> <title>jQuery Tooltips悬停文字提示框效果</title> <meta charset="utf-8" /> <lin

  • jQuery树形插件jquery.simpleTree.js用法分析

    本文实例讲述了jQuery树形插件jquery.simpleTree.js用法.分享给大家供大家参考,具体如下: 最近写项目的cms系统,客户要求后台管理可以通过一棵树来展现整个帮助文档的结构,并通过拖拽操作来实现文章和栏目的位置排列变化,我在网上找来半天,决定使用jQuery.simpleTree.js来实现. 这个树控件支持拖动节点到新的位置,通过其提供aftermove函数的覆写,我们可以在其拖动完成后在aftermove函数中调用ajax来后台更改数据库来保存拖动的结果 同时这个树的节点

  • ThinkPHP中RBAC类的四种用法分析

    本文实例讲述了ThinkPHP中RBAC类的四种用法.分享给大家供大家参考.具体方法如下: 第一类:放在登陆控制器的登陆操作中 1.RBAC::authenticate(); 用于在用户表中查找表单提交的用户名的数据,实质上就是一条用户表查寻语句: 复制代码 代码如下: return M(modle)->where(array)->find(); 这个操作有两个参数 a.array()数组的写法及作用和表查寻数组一样: 复制代码 代码如下: array('字段'=>'值','字段'=&g

  • 详解PHP字符串替换str_replace()函数四种用法

    下面通过本文给大家分享PHP字符串替换str_replace()函数4种用法,具体内容如下所示: mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) 该函数返回一个字符串或者数组.该字符串或数组是将subject中全部的search都被replace替换之后的结果. 1.$search,要替换的字符串,或数组 2.$replace,被用来替换的字符串或数组 3.$subjec

随机推荐