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

2023-05-05 21:00:39

1fixture的scope

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

2 function級別的scope

新增如下程式碼到pytest.ini,便於輸出紀錄檔

新建conftest.py檔案,把fixture函數寫入其中,便於後面fixture可以在多個py檔案中的test函數中參照
conftest.py

pytest的fixture預設級別就是 funtion,因此可以不寫scope引數
test_fixture.py

執行結果

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

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

3 class級別的scope

執行

注意,每個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

test_fixture.py

test_fixture_2.py

執行

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

5 session級別的scope


test_fixture.py test_fixture_2.py內容不變
執行

可以看到,不同py檔案的test函數,都輸出相同id的list物件,說明不同py檔案的test,都共用了同一個list物件,fixture在整個測試繪畫期間只執行了一次

the fixture is destroyed at the end of the test session

6 package級別的scope

首先我的目錄結構如下

兩個conftest檔案的內容都是相同的

注意,每個目錄下新增檔案__init__.py,內容不用寫。所謂package,就是包含__init__.py檔案的目錄
test_fixture_2.py test_fixyure.py內容與之前相同
test02目錄下test_fixture_03.py

在test01 test02 同級目錄下執行 pytest -k "fixture" -s -v
執行結果

可以看到 test01目錄下所有的test輸出id是相同的,test02目錄下的test輸出的id是不同的

這事,其他內容不變,把test02目錄下的conftest.py刪除,把test01下的conftest.py移動到test01 test02的同級目錄中
再來執行

這時,你會看到所有的輸出id都是相同的
這就有意思了,這裡牽涉到一個conftest.py的範圍的問題,conftest.py放在不同的目錄下,它能影響的範圍也是不同的