欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pytest高阶用法一

程序员文章站 2022-03-11 16:16:49
...

1、pytest.ini (添加于项目根目录下)

  pyetst.ini配置文件内容:
        [pytest]
        # 命令行参数
        addopts = -s
        # 搜索文件名
        python_files = test_*.py
        # 搜索的类名
        python_classes = Test_*
        # 搜索的函数名
        python_functions = test_*

2、fixture
fixture修饰器来标记固定的工厂函数,在其他函数,模块,类或整个工程调用它时会被**并优先执行,
通常会被用于完成预置处理和重复操作。

方法:fixture(scope="function", params=None, autouse=False, ids=None, name=None)
常用参数:
    scope:被标记方法的作用域
        "function" (default):作用于每个测试方法,每个test都运行一次
        "class":作用于整个类,每个class的所有test只运行一次
        "module":作用于整个模块,每个module的所有test只运行一次
        "session:作用于整个session(慎用),每个session只运行一次
    params:(list类型)提供参数数据,供调用标记方法的函数使用
    autouse:是否自动运行,默认为False不运行,设置为True自动运行

fixture第一个例子(通过参数引用):

 import pytest
@pytest.fixture()
def init_func():
    print("this is init_func")

class Test_04:
def test_01(self):
    print("this is test01")

def test_02(self, init_func):
    print("this is test02")

def test_03(self):
    print("this is test03")

if __name__ == '__main__':
    pytest.main(['test_04.py'])

执行结果:

  this is test01
.this is init_func
this is test02
.this is test03

总结:
test_02方法传入了被fixture标识的函数,以变量的形式,且会优先于测试函数运行

fixture第二个例子(通过函数引用) :

import pytest

@pytest.fixture()
def init_func():
    print("this is init_func")

@pytest.mark.usefixtures("init_func")
class Test_04:

def test_01(self):
    print("this is test01")

def test_02(self):
    print("this is test02")

def test_03(self):
    print("this is test03")

if __name__ == '__main__':
    pytest.main(['test_04.py'])

执行结果:

this is init_func
this is test01
.this is init_func
this is test02
.this is init_func
this is test03

总结:
@pytest.mark.usefixtures(“init_func”)可以放在类前面,则该类中的每个test执行前都会执行一次init_func;若将该语句放在某test前面,则只在执行该test前执行一次init_func

fixture第三个例子(默认设置为运行)

import pytest   
@pytest.fixture(autouse=True)
def init_func():
    print("this is init_func")

class Test_04:

def test_01(self):
    print("this is test01")

def test_02(self):
    print("this is test02")

def test_03(self):
    print("this is test03")

if __name__ == '__main__':
    pytest.main(['test_04.py'])

执行结果:

this is init_func
this is test01
.this is init_func
this is test02
.this is init_func
this is test03
    .

结论:autouse默认为False,若改为True,则表示无需引用就会在执行每一个test前自动执行该工厂函数

fixture第四个例子(设置作用域为function):
示例:
import pytest

@pytest.fixture(scope="function", autouse=True)
def init_func():
    print("this is init_func")

class Test_04:
def test_01(self):
    print("this is test01")

def test_02(self):
    print("this is test02")

def test_03(self):
    print("this is test03")

if __name__ == '__main__':
    pytest.main(['test_04.py'])

执行结果:

this is init_func
this is test01
.this is init_func
this is test02
.this is init_func
this is test03

结论:
fixture参数scope的默认值为“function”,即作用于每个测试方法,每个test都运行一次

fixture第五个例子(设置作用域为class)

import pytest

@pytest.fixture(scope="class", autouse=True)
def init_func():
    print("this is init_func")

class Test_04:

def test_01(self):
    print("this is test01")

def test_02(self):
    print("this is test02")

def test_03(self):
    print("this is test03")

if __name__ == '__main__':
    pytest.main(['test_04.py'])

结果:

this is init_func
this is test01
.this is test02
.this is test03

结论:
“class”:作用于整个类,每个class的所有test只运行一次

fixture第六个例子(返回值)

import pytest

@pytest.fixture()
def init_func():
    return 8

class Test_04:

def test_01(self):
    print("this is test01")

def test_02(self, init_func):
    print("this is test02")
    c = init_func
    print(c)

def test_03(self):
    print("this is test03")

if __name__ == '__main__':
    pytest.main(['test_04.py'])

执行结果:

this is test01
.this is test02
8
.this is test03

示例二:

import pytest

@pytest.fixture(params=[1, 2, 3])
def init_func(request):
    return request.param

class Test_04:

def test_01(self):
    print("this is test01")

def test_02(self, init_func):
    print("this is test02")
    c = init_func
    print(c)

def test_03(self):
    print("this is test03")

if __name__ == '__main__':
    pytest.main(['test_04.py'])

执行结果:
# 可以发现结果运行了三次
this is test01
.this is test02
1
.this is test02
2
.this is test02
3
.this is test03

结论:request.param可以当循环参数使用

相关标签: pytest