前言
测试固件也叫测试夹具,用于指定初始化代码或清理代码/扫尾工作
1、setup和teardown
pytest可以使用这2个函数实现测试固件的功能 代码如下
#coding=utf-8
import time
import pytest
class Test_Pytest():
def setup(self):
print('\n测试前置动作\n')
def teardown(self):
print('\n测试后置动作\n')
def test_one(self):
print("test_one方法执行\n" )
def test_two(self):
print("test_two方法执行\n" )
def test_three(self):
print("test_three方法执行\n" )
def test_four(self):
print("test_four方法执行\n")
运行结果如下图
每个函数都会去执行我们这个前后置的函数,作用域是函数级的
2、setup_class和teardown_class
代码如下
#coding=utf-8
import time
import pytest
class Test_Pytest():
def setup_class(self):
print('\n测试前置动作\n')
def teardown_class(self):
print('\n测试后置动作\n')
def test_one(self):
print("test_one方法执行\n" )
def test_two(self):
print("test_two方法执行\n" )
def test_three(self):
print("test_three方法执行\n" )
def test_four(self):
print("test_four方法执行\n")
运行结果如下 可以看到前后置在这个类被调用一次,作用域是类级别的
3、 pytest中的fixture
上面介绍了(setup/teardown)的用法,但pytest还有一种更便捷的,fixture提供了区别于传统单元测试(setup/teardown)风格的令人惊喜的功能,而且pytest做得更炫更灵活。
4、fixture之scope的用法
- function 功能: 在函数或方法运行时执行fixture函数的功能 默认作用域
- class 功能:在类运行时调用一次。
- module 功能:在一个模块(一个py文件为一个模块)被运行时,执行一次fixture
- package 功能:当前被使用fixture的文件所在的包,执行一次fixture
- session 功能:当前被使用fixture的文件所在的整个项目目录,执行一次fixture
代码如下
import pytest
@pytest.fixture(scope="class", autouse=True)
def login():
print("\n登录\n")
yield
print("\n登出\n")
class TestCase:
def test_1(self):
print("\ntest 1\n")
def test_2(self):
print("\ntest 2\n")
执行结果如下 可以看到这个类只执行一次测试固件
5、fixture之params用法
params 参数:一个可选的参数列表,它将导致多次调用fixture函数和使用它的所有测试,获取当前参数可以使用request.param,request 是pytest的内置 fixture ,主要用于传递参数 代码如下
import pytest
data = [("test1", "test1"), ("test2", "test2")]
@pytest.fixture(scope="function", params=data)
def get_data(request):
print(request.param)
return request.param
def test_login(get_data):
print("账号:%s" % get_data[0], "密码:%s" % get_data[1])
运行结果如下
6、fixture之autouse用法
fixture 里面有个参数 autouse,默认是 Fasle 没开启的,可以设置为True 开启,就可以自动使用了,也就是说不用再手动传参就可以自动运行该用例了。代码如下
代码中演示了2种引入fixture的方式
- 第一种:直接将fixture的函数名作为参数传递给测试用例
- 第二种:使用pytest.usefixtures()进行调用
import pytest
class TestCase:
@pytest.fixture()
def login(self):
print("\n登录\n")
yield
print("\n登出\n")
def test_1(self,login):
print("\ntest 1\n")
@pytest.mark.usefixtures('login')
def test_2(self):
print("\ntest 2\n")
运行结果如下
7、fixture之ids用法
ids需要配合params一起使用 代码如下所示
import pytest
@pytest.fixture( params=[1,2,3,4],ids=['one','two','three','four'])
def demo(request):
return request.param
def test_f(demo):
print("{}".format(demo))
运行结果如下所示
8、fixture之name用法
相当于给函数起别名,当取了别名之后,原来函数名就调用不了 代码如下
import pytest
@pytest.fixture( params=[1,2,3,4],ids=['one','two','three','four'],name='bieming')
def demo(request):
return request.param
def test_f(bieming):
print("{}".format(bieming))
运行结果如下