網站首頁 編程語言 正文
什么是fixture
在一個測試過程中,fixture主要提供以下功能:
為測試提供上下文,比如環境變量,數據集(dataset),提供數據,數據和測試用例分開定義測試的步驟,主要用于setup和teardown
pytest中的代碼可以定制,滿足多變的測試需求,包括定義傳入測試中的數據集、配置測試前系統的初始狀態、為批量測試提供數據源 fixture定義
使用裝飾器 @pytest.fixture就表明這個函數是一個fixture
一個完整的fixture,定義如下:
@pytest.fixture(scope, params, autouse, ids, name)
如何使用fixture
最基本的用法就是一個fixture作為一個測試用例的參數傳入,然后就可以在該測試用例中使用該fixture
當pytest執行一個測試用例時,就會檢查參數,然后搜索是否有相同名字的fixture,如果有,就先執行這個fixture,得到fixture的返回值,然后將這個返回值作為參數傳入到測試用例中
一個簡單的fixture使用
import pytest
class Fruit():
def __init__(self,name):
self.name=name
self.cubed=False
def cube(self):
self.cubed=True
class FruitSalad():
def __init__(self,*fruit_bowl):
self.fruit=fruit_bowl
self._cube_fruit()
def _cube_fruit(self):
for fruit in self.fruit:
fruit.cube()
@pytest.fixture()
def fruit_bowl():
return [Fruit("apple"),Fruit("banana")]
def test_fruit_salad(fruit_bowl):
fruit_salad=FruitSalad(*fruit_bowl)
assert all(fruit.cubed for fruit in fruit_salad.fruit)
如果不使用fixture功能,代碼需要這樣寫,這樣就無法使用pytest來執行測試用例了
class Fruit():
def __init__(self,name):
self.name=name
self.cubed=False
def cube(self):
self.cubed=True
class FruitSalad():
def __init__(self,*fruit_bowl):
self.fruit=fruit_bowl
self._cube_fruit()
def _cube_fruit(self):
for fruit in self.fruit:
fruit.cube()
def fruit_bowl():
return [Fruit("apple"),Fruit("banana")]
def test_fruit_salad(fruit_bowl):
fruit_salad=FruitSalad(*fruit_bowl)
assert all(fruit.cubed for fruit in fruit_salad.fruit)
bowl = fruit_bowl()
test_fruit_salad(fruit_bowl=bowl)
使用fixture傳遞測試數據
fixture非常適合存放測試數據,并且它可以返回任何數據
import pytest
@pytest.fixture()
def a_tuple():
return (1,'foo',None,{'bar':23})
def test_a_tuple(a_tuple):
assert a_tuple[3]["bar"]==32
a_tuple作為一個fixture,主要是提供測試數據給test_a_tuple,執行test_a_tuple時,先查看函數的參數,有a_tuple,并且找到了這個函數,先執行a_tuple,得到數據(1,‘foo’,None,{‘bar’:23}),并將這個數據傳入到測試用例test_a_tuple中,在測試用例中,就可以直接使用a_tuple來使用這個測試數據
使用fixture來執行配置和銷毀邏輯
fixture的另一個功能就是結合yield來配置測試用例的setup和teardown邏輯
import pytest
@pytest.fixture()
def task_db():
print("start to setup....")
yield "a"
print("start to teardown...")
def test_db(task_db):
print(task_db)
print("start to test")
運行結果:
start to setup....
a
start to test
start to teardown..
fixture函數會在測試函數之前運行,但如果fixture函數包含yield,那么系統會在yield處停止,轉而運行測試函數,等測試函數執行完畢后再回到fixture,繼續執行yield后面的代碼,因此,可以將yield之前的代碼視為配置過程(setup),將yield之后的代碼視為清理過程(teardown),無論測試過程中發生了什么,yield之后的代碼都會執行,yield可以返回值,也可以不返回
fixture可以使用其他的fixture
import pytest
@pytest.fixture()
def first_entry():
return "a"
@pytest.fixture()
def order(first_entry):
return [first_entry]
def test_order(order):
order.append("b")
assert order==["a","b"]
同時使用多個fixture
一個測試用例或者一個fixture可以同時使用多個fixture
import pytest
@pytest.fixture()
def first_entry():
return "a"
@pytest.fixture()
def second_entry():
return 2
@pytest.fixture()
def order(first_entry,second_entry):
return [first_entry,second_entry]
@pytest.fixture()
def expect_list():
return ["a",2,3.0]
def test_order(order,expect_list):
order.append(3.0)
assert order==expect_list
fixture的參數介紹
scope,指定fixture的作用范圍
用于控制fixture執行的配置和銷毀邏輯的頻率
scope參數有四個值:function,class,module,session
默認值為function
function:函數級別的fixture每個測試函數只需要運行一次,
class:類級別的fixture每個測試類只運行一次
module:模塊級別的fixture,每個模塊只需要運行一次
session:繪畫級別的fixture,每次會話只需要運行一次
params,fixture的參化
params是一個list,這個list是要傳入fixture的參數,會引起多次調用,request.param可以獲取每一個值
import pytest
@pytest.fixture(params=["a","b"])
def order(request):
return request.param
def test_order(order):
all_order="ab"
assert order in all_order
運行結果:
collected 2 items ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
test_usefixture7.py::test_order[a] PASSED
test_usefixture7.py::test_order[b] PASSED
request是python的一個內置的fixture,代表fixture的調用狀態,它有一個param字段,會被@pytest.fixture(params=[“a”,“b”])的params列表中的一個元素填充,如果params有多個值,就會多次調用requeat.param來多次執行測試用例
autouse,為常用的fixture添加autouse選項
對于常用的fixture,可以指定autouse=True,使作用域內的測試函數都自動運行該fixture
name,為fixture重命名
import pytest
@pytest.fixture(name="lue")
def a_b_c_d_e():
return "a"
def test_order(lue):
assert lue=="a"
import pytest
@pytest.fixture(name="lue")
def a_b_c_d_e():
return "a"
def test_order(lue):
assert lue=="a"
PS:
下面來說下pytest中的fixture參數解析以及用法
當我們在使用pytest實現前后置調用時有兩種方式
方式一:
? ? ? ? 采用setup/teardown以及setup_class/teardown_class類似這種方式去實現前后置調用
方式二:
? ? ? ? 采用pytest中強大的fixture裝飾器來實現
本期文章主要采用方式二來解決測試用例前后置調用的問題
首先我們來看下,pytest中的fixture的參數有哪些,分別是scope,params,autouse,ids,name這5個形參,哪些他們分別的作用域以及作用是什么呢??
下面來說下scope:
“”“
scope:
function(默認)
class
module
session
params:
參數化,支持list,tuple,字典列表,字典元組
autouse:
false(默認)
True
ids:
當使用params參數化時,給每一個值設置一個變量名,其實意義不大
name:
表示的是被@pytest.fixture標記的方法取一個別名,注意:當去了別名之后,原來的名稱無法使用
”“”
@pytest.fixture(scope='function')
def my_fixture():
print('這是前置內容')
yield
print('這是后置內容')
class Testdemo():
def test01(self,my_fixture):
print('這是test01')
def test02(self):
print('這是test02')
根據上面的結構,運行后輸出的內容為
這是前置內容
這是test01
這是后置內容
這是前置內容
這是test02
這是后置內容
對于上述方法中傳入my_fixture的做法,主要是對比setup/teardown之類的更方便,不需要每個方法都在運行之前執行一邊setup,而是在某個方法需要這種操作時在執行
原文鏈接:https://blog.csdn.net/ljsykf/article/details/128315139
相關推薦
- 2022-06-25 Python編程批量實現md5加密pdf文件_python
- 2022-12-13 python字典如何獲取最大和最小value對應的key_python
- 2023-02-01 C語言中聯合體與共用體和枚舉使用語法示例_C 語言
- 2022-12-23 C++類中如何使用定義的類型別名_C 語言
- 2022-09-01 C語言中static與sizeof查缺補漏篇_C 語言
- 2022-10-14 Ubuntu在GitHub中配置SSH Key
- 2022-06-09 Python字符串的轉義字符_python
- 2022-04-18 [webpack-cli] { Error: Cannot find module ‘acorn‘
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支