pytest中实用但不常用方法列举

hello,大家好,今天和大家一起学习下pytest中实用但不常用的一些方法,作为一名测试,可能不像开发那样天天写代码,所以有时我们会逐渐遗忘一些方法或这语法,所以以免后期我也遗忘,今天做下记录

一:pytest中的testcase执行顺序,废话不多,直接上代码

import os,sys


def setup_module():
    print('--setup module--')



class TestTmp(object):

    @classmethod
    def setup_class(cls):
        print('--setup class--')

    def setup(self):
        print('--set up--')

    def test_01(self):
        print('--test 01--')

    def test_02(self):
        print('--test 02--')

    def teardown(self):
        print('--teardown--')

    @classmethod
    def teardown_class(cls):
        print('--teardown class--')
执行结果,如下:
tmp.py::TestTmp::test_01 --setup module--
--setup class--
--set up--
--test 01--
PASSED--teardown--

tmp.py::TestTmp::test_02 --set up--
--test 02--
PASSED--teardown--
--teardown class--
--teardown module--

从上面的直接结果,我们可以直接看出,在pytest中,不管是setup的module还是teardown的module,都是最先执行的,也就是优先级最高,其次是class,而后是set up,其中set up是针对测试用例而言的,有几个测试用例,就运行几次

二:pytest中常用的装饰器

import pytest


@pytest.fixture()
def func(fjh_module,fjh_class,fjh_session):
    print('。。。fun执行之前。。。')
    yield
    print('...fun执行之后...')

@pytest.fixture(scope='class')
def fjh_class():
    print('。。。fjh_class执行之前。。。')
    yield
    print('。。。fjh_class执行之后。。。')

@pytest.fixture(scope='module')
def fjh_module():
    print('。。。fjh_module执行之前。。。')
    yield
    print('。。。fjh_module执行之后。。。')

@pytest.fixture(scope='session')
def fjh_session():
    print('。。。fjh_session执行之前。。。')
    yield
    print('。。。fjh_session执行之后。。。')

class Test_demo(object):
    def test1(self,func):
        print('。。。这是test1。。。')

    def test2(self,func):
        print('。。。这是test2。。。')


class Test_demo1(object):
    def test3(self,func):
        print('。。。这是test3。。。')

    def test4(self,func):
        print('。。。这是test4。。。')
执行结果,如下:
tmp2.py::Test_demo::test1 。。。fjh_session执行之前。。。
。。。fjh_module执行之前。。。
。。。fjh_class执行之前。。。
。。。fun执行之前。。。
。。。这是test1。。。
PASSED...fun执行之后...

tmp2.py::Test_demo::test2 。。。fun执行之前。。。
。。。这是test2。。。
PASSED...fun执行之后...
。。。fjh_class执行之后。。。

tmp2.py::Test_demo1::test3 。。。fjh_class执行之前。。。
。。。fun执行之前。。。
。。。这是test3。。。
PASSED...fun执行之后...

tmp2.py::Test_demo1::test4 。。。fun执行之前。。。
。。。这是test4。。。
PASSED...fun执行之后...
。。。fjh_class执行之后。。。
。。。fjh_module执行之后。。。
。。。fjh_session执行之后。。。

关于scope的参数说明
scope是fixture函数里的一个参数,默认为function。
当scope=“function” 时,它的作用范围是每个测试用例来之前运行一次,而销毁代码(yield)在测试用例之后运行。

当scope=“class” 时,如果一个class里面有多个用例都调用了一次fixture,那么此fixture只在此class里所有用例开始前执行一次。

当scope=“module” 时,在当前.py脚本里面所有用例开始前只执行一次。

当scope=“session” 时,可以跨.py模块调用的,也就是当我们有多个.py文件的用例的时候,如果多个用例只需调用一次fixture,那就可以设置为scope=“session”,并且写到conftest.py文件里。(下面会提到这个文件)

所以说fixture可以通过scope参数控制setup级别。

如果不想在test方法调用时传入func,那么需要自动识别相应的fixture函数,因此,需要借助autouser=true,在每个fixture装饰的方法中添加这个,运行测试用例会自动识别

三:pytest中的xfail方法

当我们在跑接口自动化或ui自动化时,经常会遇到fail的情况,这个时候,程序就会自动报错,无法运行下去,为了规避这种情况,我们来介绍一下xfail的使用

直接上代码

import pytet



@pytest.fixture()
def func():
    print('。。。fun执行之前。。。')
    yield
    print('...fun执行之后...')


class Test_demo(object):
    @pytest.mark.xfail
    def test1(self,func):
        print('。。。这是test1。。。')
    @pytest.mark.xfail
    def test2(self,func):
        print('。。。这是test2。。。')
    @pytest.mark.xfail
    def test3(self):
        print('。。。这是test3。。。')
        assert 1==2


class Test_demo1(object):
    @pytest.mark.xfail
    def test3(self,func):
        print('。。。这是test3。。。')
    @pytest.mark.xfail
    def test4(self,func):
        print('。。。这是test4。。。')

上面的输入结果

1 xfailed ,4 xpassed in 0.02s

在实例中test3明显是错误的,在正常情况下是会终止代码运行,所以这是后添加xfail装饰器,可以有效的避免程序中断的行为,同时,程序也会友好的提出有几个失败的案例

四:pytest中的parametrize方法

先上代码

import pytest
data=[('张三','男'),('李四','女')]
data1=['case1','case2','case3']
exe_value='name,sex'



@pytest.mark.parametrize(exe_value,data)
def test_name(name,sex):
    print('--->',data)
    print(name,sex)

1、第一个参数是字符串,多个参数中间用逗号隔开

2、第二个参数是list,多组数据用元祖类型;传三个或更多参数也是这样传。list的每个元素都是一个元组,元组里的每个元素和按参数顺序一一对应
3、传一个参数 @pytest.mark.parametrize('参数名',list) 进行参数化
4、传两个参数@pytest.mark.parametrize('参数名1,参数名2',[(参数1_data[0], 参数2_data[0]),(参数1_data[1], 参数2_data[1])]) 进行参数化

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值