pytest進階使用【fixture(一)fixture與setup/teardown區別】
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有什麼不一樣。