pytes中fixture的scope: 決定可以在什麼範圍內共享fixture

工作手記發表於2023-05-05

1fixture的scope

在@pytest.fixture(scope='xxx')中,scope的可選值有5個,以下是官網的描述
image

2 function級別的scope

新增如下程式碼到pytest.ini,便於輸出日誌
image
新建conftest.py檔案,把fixture函式寫入其中,便於後面fixture可以在多個py檔案中的test函式中引用
conftest.py
image
pytest的fixture預設級別就是 funtion,因此可以不寫scope引數
test_fixture.py
image

執行結果
image

注意,兩個test函式中,list物件的id是不同的,雖然他們的內容都是相同的,這說明在這兩個test函式中,他們各自獨立地執行了一次fixture,拿到了各自的list物件

the default scope, the fixture is destroyed at the end of the test

3 class級別的scope

image

image

執行
image
注意,每個class裡面都有2個test函式,同一個class裡面的test函式,輸出的list物件是相同的,
說明他們拿到的都是同一個list物件,生產list物件的fixture只執行了一次
不同的class的test函式,輸出的list物件的id是不同的,說明在執行第2個class時,fixture又執行了一次,生成一個新的list物件


class: the fixture is destroyed during teardown of the last test in the class.

4 module級別的scope

image

test_fixture.py
image

test_fixture_2.py
image
執行
image
可以看到,同一個py檔案裡面,所有的test輸出的list物件id是相同的,說明這些test共享了一個list物件
不同的py檔案,test輸出的id物件是不同的,說明不同的py檔案各自獨立執行了fixture,拿到了各自獨立的list物件

5 session級別的scope

image
test_fixture.py test_fixture_2.py內容不變
執行
image
可以看到,不同py檔案的test函式,都輸出相同id的list物件,說明不同py檔案的test,都共享了同一個list物件,fixture在整個測試繪畫期間只執行了一次

the fixture is destroyed at the end of the test session

6 package級別的scope

首先我的目錄結構如下
image
兩個conftest檔案的內容都是相同的
image
注意,每個目錄下新增檔案__init__.py,內容不用寫。所謂package,就是包含__init__.py檔案的目錄
test_fixture_2.py test_fixyure.py內容與之前相同
test02目錄下test_fixture_03.py
image
在test01 test02 同級目錄下執行 pytest -k "fixture" -s -v
執行結果
image
可以看到 test01目錄下所有的test輸出id是相同的,test02目錄下的test輸出的id是不同的

這事,其他內容不變,把test02目錄下的conftest.py刪除,把test01下的conftest.py移動到test01 test02的同級目錄中
再來執行
image
這時,你會看到所有的輸出id都是相同的
這就有意思了,這裡牽涉到一個conftest.py的範圍的問題,conftest.py放在不同的目錄下,它能影響的範圍也是不同的

相關文章