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有什麼不一樣。

 

Tags: