最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytest-fixture簡介及其用法講解

 更新時間:2023年01月10日 09:44:54   作者:愛吃水餃的小京  
這篇文章主要介紹了pytest-fixture及其用法,最基本的用法就是一個fixture作為一個測試用例的參數(shù)傳入,然后就可以在該測試用例中使用該fixture,需要的朋友可以參考下

什么是fixture

在一個測試過程中,fixture主要提供以下功能:

為測試提供上下文,比如環(huán)境變量,數(shù)據(jù)集(dataset),提供數(shù)據(jù),數(shù)據(jù)和測試用例分開定義測試的步驟,主要用于setup和teardown
pytest中的代碼可以定制,滿足多變的測試需求,包括定義傳入測試中的數(shù)據(jù)集、配置測試前系統(tǒng)的初始狀態(tài)、為批量測試提供數(shù)據(jù)源 fixture定義

使用裝飾器 @pytest.fixture就表明這個函數(shù)是一個fixture
一個完整的fixture,定義如下:
@pytest.fixture(scope, params, autouse, ids, name)

如何使用fixture

最基本的用法就是一個fixture作為一個測試用例的參數(shù)傳入,然后就可以在該測試用例中使用該fixture
當pytest執(zhí)行一個測試用例時,就會檢查參數(shù),然后搜索是否有相同名字的fixture,如果有,就先執(zhí)行這個fixture,得到fixture的返回值,然后將這個返回值作為參數(shù)傳入到測試用例中

一個簡單的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來執(zhí)行測試用例了

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傳遞測試數(shù)據(jù)

fixture非常適合存放測試數(shù)據(jù),并且它可以返回任何數(shù)據(jù)

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,主要是提供測試數(shù)據(jù)給test_a_tuple,執(zhí)行test_a_tuple時,先查看函數(shù)的參數(shù),有a_tuple,并且找到了這個函數(shù),先執(zhí)行a_tuple,得到數(shù)據(jù)(1,‘foo’,None,{‘bar’:23}),并將這個數(shù)據(jù)傳入到測試用例test_a_tuple中,在測試用例中,就可以直接使用a_tuple來使用這個測試數(shù)據(jù)

使用fixture來執(zhí)行配置和銷毀邏輯

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函數(shù)會在測試函數(shù)之前運行,但如果fixture函數(shù)包含yield,那么系統(tǒng)會在yield處停止,轉(zhuǎn)而運行測試函數(shù),等測試函數(shù)執(zhí)行完畢后再回到fixture,繼續(xù)執(zhí)行yield后面的代碼,因此,可以將yield之前的代碼視為配置過程(setup),將yield之后的代碼視為清理過程(teardown),無論測試過程中發(fā)生了什么,yield之后的代碼都會執(zhí)行,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的參數(shù)介紹

scope,指定fixture的作用范圍

用于控制fixture執(zhí)行的配置和銷毀邏輯的頻率
scope參數(shù)有四個值:function,class,module,session
默認值為function
function:函數(shù)級別的fixture每個測試函數(shù)只需要運行一次,
class:類級別的fixture每個測試類只運行一次
module:模塊級別的fixture,每個模塊只需要運行一次
session:繪畫級別的fixture,每次會話只需要運行一次

params,fixture的參化

params是一個list,這個list是要傳入fixture的參數(shù),會引起多次調(diào)用,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的一個內(nèi)置的fixture,代表fixture的調(diào)用狀態(tài),它有一個param字段,會被@pytest.fixture(params=[“a”,“b”])的params列表中的一個元素填充,如果params有多個值,就會多次調(diào)用requeat.param來多次執(zhí)行測試用例

autouse,為常用的fixture添加autouse選項

對于常用的fixture,可以指定autouse=True,使作用域內(nèi)的測試函數(shù)都自動運行該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參數(shù)解析以及用法

當我們在使用pytest實現(xiàn)前后置調(diào)用時有兩種方式

方式一:

        采用setup/teardown以及setup_class/teardown_class類似這種方式去實現(xiàn)前后置調(diào)用

方式二:

        采用pytest中強大的fixture裝飾器來實現(xiàn)

本期文章主要采用方式二來解決測試用例前后置調(diào)用的問題

首先我們來看下,pytest中的fixture的參數(shù)有哪些,分別是scope,params,autouse,ids,name這5個形參,哪些他們分別的作用域以及作用是什么呢? 

下面來說下scope:

“”“
scope:
    function(默認)
    class
    module
    session
params:
    參數(shù)化,支持list,tuple,字典列表,字典元組
autouse:
    false(默認)
    True
ids:
    當使用params參數(shù)化時,給每一個值設置一個變量名,其實意義不大
name:
    表示的是被@pytest.fixture標記的方法取一個別名,注意:當去了別名之后,原來的名稱無法使用
”“”
@pytest.fixture(scope='function')
def my_fixture():
    print('這是前置內(nèi)容')
    yield
    print('這是后置內(nèi)容')

class Testdemo():
    
    def test01(self,my_fixture):
        print('這是test01')
 
    def test02(self):
        print('這是test02')

根據(jù)上面的結構,運行后輸出的內(nèi)容為
這是前置內(nèi)容
這是test01
這是后置內(nèi)容
這是前置內(nèi)容
這是test02
這是后置內(nèi)容

對于上述方法中傳入my_fixture的做法,主要是對比setup/teardown之類的更方便,不需要每個方法都在運行之前執(zhí)行一邊setup,而是在某個方法需要這種操作時在執(zhí)行

到此這篇關于pytest-fixture及其用法的文章就介紹到這了,更多相關pytest fixture用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一篇文章帶你了解python異?;A

    一篇文章帶你了解python異?;A

    今天小編就為大家分享一篇關于Python中的異常介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • Python的Django框架中的Context使用

    Python的Django框架中的Context使用

    這篇文章主要介紹了Python的Django框架中的Context使用,相關的渲染是Django中創(chuàng)建模版的關鍵,需要的朋友可以參考下
    2015-07-07
  • 從零學python系列之教你如何根據(jù)圖片生成字符畫

    從零學python系列之教你如何根據(jù)圖片生成字符畫

    網(wǎng)上有很多的字符畫,看起來很炫酷,下面就告訴你如何用Python做這么炫酷的事,
    2014-05-05
  • Python的語法基礎你真的了解嗎

    Python的語法基礎你真的了解嗎

    這篇文章主要為大家詳細介紹了Python的語法基礎,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Python 實現(xiàn)向word(docx)中輸出

    Python 實現(xiàn)向word(docx)中輸出

    今天小編就為大家分享一篇Python 實現(xiàn)向word(docx)中輸出,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python 初始化一個定長的數(shù)組實例

    python 初始化一個定長的數(shù)組實例

    今天小編就為大家分享一篇python 初始化一個定長的數(shù)組實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Redis持久化機制實現(xiàn)原理和流程

    Redis持久化機制實現(xiàn)原理和流程

    這篇文章主要介紹了Redis持久化機制實現(xiàn)原理和流程,持久化就是把內(nèi)存中的數(shù)據(jù)存放到磁盤中,防止宕機后內(nèi)存數(shù)據(jù)丟失,需要的朋友可以參考下
    2023-04-04
  • python多進程及通信實現(xiàn)異步任務的方法

    python多進程及通信實現(xiàn)異步任務的方法

    這篇文章主要介紹了python多進程及通信實現(xiàn)異步任務需求,本人也是很少接觸多進程的場景,對于python多進程的使用也是比較陌生的。在接觸了一些多進程的業(yè)務場景下,對python多進程的使用進行了學習,覺得很有必要進行一個梳理總結,感興趣的朋友一起看看吧
    2022-05-05
  • Python自動化辦公之Word文檔的創(chuàng)建與生成

    Python自動化辦公之Word文檔的創(chuàng)建與生成

    這篇文章主要為大家詳細介紹了如何通過python腳本來自動生成一個?word文檔,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-05-05
  • Scrapy框架使用的基本知識

    Scrapy框架使用的基本知識

    今天小編就為大家分享一篇關于Scrapy框架使用的基本知識,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評論

太和县| 辉南县| 普宁市| 南京市| 杂多县| 句容市| 牟定县| 青神县| 贺州市| 高安市| 上林县| 高密市| 许昌县| 婺源县| 白山市| 西畴县| 永安市| 武川县| 西林县| 肃北| 井研县| 宜昌市| 武宁县| 龙海市| 宁陕县| 西丰县| 弥勒县| 涞水县| 富锦市| 西峡县| 石河子市| 湖南省| 丁青县| 久治县| 桃江县| 花垣县| 奉节县| 永宁县| 格尔木市| 益阳市| 怀宁县|