【pytest官方文件】解讀fixtures - 1.什麼是fixtures
阿新 • • 發佈:2021-03-03
在深入瞭解fixture之前,讓我們先看看什麼是`測試`。
### 一、測試的構成
其實說白了,測試就是在特定的環境、特定的場景下、執行特定的行為,然後確認結果與期望的是否一致。
就拿最常見的登入來說,完成一次正常的登入場景,需要可用的測試環境,可以正常登入的賬號和密碼。
然後,用這個賬號密碼進行登入操作,結果登入成功,符合這次正常登入場景的預期結果,測試完成。
這樣看來,通常就可以把測試分為4個步驟:
1. Arrange
2. Act
3. Assert
4. Cleanup
**Arrange**,可以理解為 除了執行測試之外的任何事情。比如上面例子中,我得有個可用的測試環境跟可用的賬號密碼,這些都要事先準備好。
此外,還有可能是:啟動/終止服務、將記錄輸入資料庫、定義要查詢的URL、為還不存在的使用者生成一些憑據等等。
總之,就是為了能夠進行測試要準備好的事情。
**Act**,相比準備前置環境,`Act`做的事情就相對單一些,其實就是開始測試動作。比如,介面測試裡,呼叫被測試的api介面。
**Assert**,`Assert`是我們檢視結果的地方,看看是否像我們預期的那樣。比如介面請求成功後,資料的介面會返回`“success”`,`assert status == "success"`。
**Cleanup**,在測試結束後,做清理工作,為了其他的測試不會意外的受到本次測試的影響。比如,測試之前我插入了一條測試資料,測試完後,我把它刪掉。
總得來說,測試就是`Act+Assert`,而其他要安排的事情,放在`Arrange`裡。
### 二、回到fixtures本身
而在pytest中,fixtures就是來做`Arrange`的事情。當然了,fixture也不侷限於此,如果測試足夠複雜的話,不妨也可以在裡面進行`act`的事情。
把一個普通的函式變成fixtures非常簡單,只要加上`@pytest.fixture`這個裝飾就成:
```
import pytest
class Fruit:
def __init__(self, name):
self.name = name
def __eq__(self, other):
return self.name == other.name
@pytest.fixture
def my_fruit():
# 這裡是一個fixture,返回了一個Fruit物件,名字叫蘋果
return Fruit("蘋果")
@pytest.fixture
def fruit_basket(my_fruit):
# 這裡是另一個fixture,同樣宣告一個Fruit物件,名字叫香蕉。
# 然後在這個fixture中又傳入了上一個fixture:my_fruit
# 最後把最終的返回裝到一個列表[]裡,返回
return [Fruit("香蕉"), my_fruit]
def test_my_fruit_in_basket(my_fruit, fruit_basket):
# 這是一個測試函式,可以使用多個fixture
assert my_fruit in fruit_basket
```
上面的程式碼體現了fixtures的2個重要特性:
* 測試函式可以使用多個fixture
* fixture本身還可以使用其他的fixture
接下來,我將繼續跟著官方文件解讀fixture的特點。