pytest框架前后置设置,以及pytest默认规则

一、pytest框架的默认规则

1、模块名默认必须以test开头或者以test结尾

2、测试类必须以Test开头,并且不能有__init__方法

3、测试方法默认必须以test开头

当然以后的一些默认规则除测试类不能使用__init__方法外其余的都是可配置的,当然一般情况下我们也不会去修改这些默认配置。

二、使用setup 与teardown等方式实现用例的前后置

1.1、setup与teardown

此为函数级别实现前后置的方法,在每个测试用例运行前后都会调用前后置的方法。

python 复制代码
class TestLogin:
    def setup(self):
        print('用例开始时执行')

    def teardown(self):
        print('用例结束时执行------>\n')

    def test_01_hujian(self):
        print('运行用例1')

    def test_02_hujian(self):
        print('运行用例2')


if __name__ == '__main__':
    pytest.main(['-vs', 'test_login.py'])

运行结果:可以看到在运行每条用例的前后都会调用前后方法

1.2、setup_class与 teardown_class

此为类级别的前后置方法,意思就是每个类运行前后才会运行一次该方法。

python 复制代码
class TestLogin:
    def setup_class(self):
        print('用例开始时执行')

    def teardown_class(self):
        print('用例结束时执行------>\n')

    def test_01_hujian(self):
        print('运行用例1')

    def test_02_hujian(self):
        print('运行用例2')

运行结果:可以看到结果,在该类运行前后才会执行前后置方法。

2.3、setup_module、teardown_module

模块级别前后置方法,意思就是在一个python文件中可以存在多个类,各个类中存在各个测试用例,使用该前后置方法只会在类前后调用一次。值得注意的是该方法只能单独存在,不能写个某个类中哦。

python 复制代码
def setup_module():
    print('用例开始时执行')


def teardown_module():
    print('用例结束时执行------>\n')


class TestLogin_01:

    def test_01_hujian(self):
        print('运行用例1')

    def test_02_hujian(self):
        print('运行用例2')


class TestLogin_02:
    def test_03_hujian(self):
        print('运行用例3')

    def test_04_hujian(self):
        print('运行用例4')

运行结果:

掌握上面三种基本方法基本就够了,不过今天的重点不是讲setup 与teardown,在pytest中一般使用fixture来实现前后置,这也是pytest框架的核心所在。

三、使用fixture来实现前后置功能

3.1、使用fixture的默认规则以及使用方法

1、fixture要放在conftest.py文件中,文件名是不可更改的。

2、在不同的用例py文件中可以使用同一个fixture文件,但是最后跟对应py文件在同一层级目录中。

3、在使用fixture时不需要任何import操作。

3.2、基本参数说明

我们在学会fixture参数使用后可以说基本就会使用fuxture啦。

python 复制代码
@pytest.fixture(scope='', params='', autouse='', ids='', name='')
def myfuxture():   
    print('用例前后置的方式')

**1、scope:**表示是被pytest.fuxture标记的方式的作用域,function(函数)(默认)、class、module、package、session

params:参数化

**2、autouse:**autouse=True:自动执行,默认为FALSE

**3、ids:**当使用params参数化时,给每个值设置一个变量名,意义不大

**4、name:**给表示的是@pytest.fixture标记的方法取一个别名

3.3、参数的运用

在讲参数如何运行前我们先看一下如何调用fuxture吧。

python 复制代码
# 我们在测试用例目录创建conftest.py文件,内容如下。
import pytest

@pytest.fixture()
def myfuxture():
    print('用例前后置的方式')

在用例文件调用它

python 复制代码
# 我们直接在测试用例方法里调用myfuxture即可,因为我们没有加任何参数,所以上面提到过scope默认等于function,它是函数级别的,我们看下打印结果,只会在test_01_hujian用例前运行前置。
class TestLogin_01:

    def test_01_hujian(self,myfuxture):
        print('运行用例1')

    def test_02_hujian(self):
        print('运行用例2')

3.3.1、autouse:自动执行

刚看到这个参数注释的时候肯定很多小伙伴都一脸懵逼,什么是自动执行。上面我们看到在调用fuxture时需要在函数里引用,当我们加上参数autouse='Ture'时则不需要引用fuxture方法名,直接所有用例都会调用fuxture是不是很好用。

python 复制代码
import pytest


@pytest.fixture(autouse=True)
def myfuxture():
    print('用例前后置的方式')
python 复制代码
class TestLogin_01:

    def test_01_hujian(self):
        print('运行用例1')

    def test_02_hujian(self):
        print('运行用例2')

查看结果:因为没有加scope参数所以它是函数级别的,在两个用例执行前都会调用fuxture方法。

3.3.2、scope标记作用域

当不加这个参数时默认scope=function,上面以及演示。

当scop=class

python 复制代码
@pytest.fixture(autouse=True, scope='class')
def myfuxture():
    print('用例前后置的方式')

打印结果:只会在所有方法开始前后执行class方法。

scop=module,当一个py文件中存在多个类时,会在第一个类执行前置,最后一个类执行后置。

python 复制代码
import pytest


@pytest.fixture(autouse=True, scope='module')
def myfuxture():
    print('用例前后置的方式')
python 复制代码
import pytest
import time


class TestLogin_01:

    def test_01_hujian(self):
        print('运行用例1')

    def test_02_hujian(self):
        print('运行用例2')


class TestLogin_02:
    def test_03_hujian(self):
        print('运行用例3')

    def test_04_hujian(self):
        print('运行用例4')


class TestLogin_03:
    def test_01_hujian(self):
        print('运行用例5')

    def test_02_hujian(self):
        print('运行用例6')


class TestLogin_04:
    def test_03_hujian(self):
        print('运行用例7')

    def test_04_hujian(self):
        print('运行用例8')


if __name__ == '__main__':
    pytest.main(['-vs'])

执行结果:

我们主要就使用这个三个参数即可,后面不多做介绍。

fuxture的参数化个人感觉不是很好用,这里就不多做介绍了,另外跟参数化涉及到的参数还有重命名参数这里不做介绍啦。

3.4、fuxture实现后置功能

前面演示的例子一直都只展示了前置功能,那后置如何实现呢。

我们用yield来实现。至于yield这里就不多做介绍了,博主有单独的文档专门介绍。

python 复制代码
@pytest.fixture(autouse=True)
def myfuxture():
    print('用例前置的方式')
    yield 
    print('后置方法')
相关推荐
qq_433716952 天前
Selenium+Pytest自动化测试框架 ------ 禅道实战
自动化测试·软件测试·selenium·单元测试·pytest·接口测试·压力测试
blues_C3 天前
Pytest-Bdd-Playwright 系列教程(11):场景快捷方式
自动化测试·pytest·bdd·playwright
幸运的星竹3 天前
pytest结合allure做接口自动化
自动化·pytest
blues_C3 天前
Pytest-Bdd-Playwright 系列教程(12):步骤参数 & parsers参数解析
自动化测试·pytest·bdd·playwright
胜天半月子5 天前
pytest | 框架的简单使用
运维·pytest
blues_C5 天前
Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 & 优化场景定义
自动化测试·软件测试·pytest·bdd·playwright
bigbig猩猩6 天前
pytest中的断言:深入解析与实践
pytest
CSXB997 天前
三十八、Python(pytest框架-上)
python·功能测试·测试工具·单元测试·pytest
漫漫人生路^_^7 天前
unittest和pytest
pytest
_可乐无糖8 天前
使用--log-file保存pytest的运行日志
pytest