pytest进阶使用【fixture(一)fixture与setup/teardown区别】

2022-10-18,,,,

fixture翻译为装置。

我觉得名字是很贴合功能的,可以自由给函数装置上自己想要的功能。

当在说pytest比unitest灵活时,fixture肯定是其中的一个理由。

测试数据的准备和执行以后的数据清理。

很多人可能会第一时间想到的是setup/teardown,但是fixture也能实现同样的效果,并且在某些场景下能做到setup做不到的事情。

比如setup虽然说是支持函数级,但是你是没办法指定某个用例执行的时候才去执行setup或者teardown。

只能说,要么都要、要么都不要。

但是fixture可以。

比如有三个用例,但是我想在用例1执行后轮到用例2的时候再去获取测试数据,你会发现setup/teardown使用。

要么用函数级,每个用例执行前都获取一遍数据。

要么用类级,在用例1执行前就去获取数据。

fixture则是装饰到用例2上即可。

具体代码区别如下。

unitest 函数级

class TestApi(unittest.TestCase):

def setUp(self):

print("开始执行")

def test_01(self):

print(1)

def test_02(self):

print(2)

def test_03(self):

print(3)
执行结果

开始执行
1
结束执行
开始执行
2
结束执行
开始执行
3
结束执行

unitest 类级

class TestApi(unittest.TestCase):

@classmethod
def setUpClass(cls):

print("开始执行")

@classmethod
def tearDownClass(cls):

print("结束执行")

def test_01(self):

print(1)

def test_02(self):

print(2)

def test_03(self):

print(3)
执行结果

开始执行
1
2
3
结束执行

pytest fixture

class TestApi():

@pytest.fixture(scope='function')
def setup_function(self):

print("开始执行")
yield
print("结束执行")

def test_01(self):

print(1)

def test_02(self,setup_function):

print(2)

def test_03(self):

print(3)
执行结果

1
.开始执行
2
.结束执行
3

可以看到,开始执行和结束执行,是只单独在用例2前后执行。

至于为什么一个函数能在分两次执行,原因就是yield了,如果是函数级的,那么在用例执行完成后,就会去执行yield后面的代码,这就完成了setup/teardown的作用。

那这样看,fixture确实要比setup来的好用多。

但是,fixture最终是要装饰到用例上才会生效,也就是说如果你十个用例都要执行一次,那每个用例都得装饰上。。。

又或者你并不是想给某个用例执行,而是全模块、整个类。

灵活是灵活了,但是也有自身的局限性。

所以pytest也并没有舍去setup/teardown,两者都能共用。

下篇文章谈谈fixture的函数级、类级、模块级又和setup/teardown有什么不一样。

pytest进阶使用【fixture(一)fixture与setup/teardown区别】的相关教程结束。

《pytest进阶使用【fixture(一)fixture与setup/teardown区别】.doc》

下载本文的Word格式文档,以方便收藏与打印。