91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

pytest用例間參數傳遞的兩種實現方式是怎樣的

發布時間:2021-12-27 08:45:21 來源:億速云 閱讀:1988 作者:柒染 欄目:開發技術

pytest用例間參數傳遞的兩種實現方式是怎樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

前言

我們在做接口自動化測試的時候,會經常遇到這種場景:接口A的返回結果中的某個字段,是接口B的某個字段的入參。如果是使用postman,那我們可以通過設置后置變量,然后在需要使用的地方通過{{}}的方式來進行調用。但是如果是使用自己寫的測試框架中要如何實現呢?我想到的是如下三種方法。

首先說明一下,以下三種方式均是通過python + pytest來實現的

一、通過conftest創建全局變量

conftest.py文件是pytest框架中很有用的一個東西,首先看下官方文檔中的解釋:

pytest用例間參數傳遞的兩種實現方式是怎樣的

大概意思就是說,conftest.py文件供整個用例目錄(conftest.py文件可以有多個,并且只在當前package下生效)使用而無需導入,也就是說在用例目錄是conftest中的信息是公用的,例如:

a/conftest.py:
    def pytest_runtest_setup(item):
        # called for running each test in 'a' directory
        print("setting up", item)
 
a/test_sub.py:
    def test_sub():
        pass
 
test_flat.py:
    def test_flat():
        pass

運行后的結果:

pytest test_flat.py --capture=no  # will not show "setting up"

pytest a/test_sub.py --capture=no  # will show "setting up"

而我們就可以通過conftest + fixture函數來實現我們想要的效果了,具體代碼如下:

# conftest.py
 
# 定義一個全局變量,用于存儲內容
global_data = {}
 
@pytest.fixture
def set_global_data():
    """
    設置全局變量,用于關聯參數
    :return:
    """
 
    def _set_global_data(key, value):
        global_data[key] = value
 
    return _set_global_data
 
@pytest.fixture
def get_global_data():
    """
    從全局變量global_data中取值
    :return:
    """
 
    def _get_global_data(key):
        return global_data.get(key)
 
    return _get_global_data

簡單說一下實現邏輯:

  1. 首先定義一個變量global_data用于接收存儲用例返回的結果

  2. set_global_data和get_global_data兩個fixture方法顧名思義,set方法是往global_data中存數據,get方法是從global_data中取數據

方法實現了,具體應該怎么使用呢?如下:

 # test_get_set.py
 
import requests
import pytest
 
 
 
def test_set(set_global_data):
    res = requests.get("http://www.baidu.com")
    status_code = res.status_code
    logger.info(f"請求返回狀態碼:{status_code}")
    set_global_data("status_code", status_code)
 
 
def test_get(get_global_data):
    data = get_global_data("status_code")
    logger.info(f'通過get_global_data方法獲取的值:{data}')
 
 
if __name__ == '__main__':
    pytest.main(['-sv', 'test_get_set.py'])

返回結果:

test_get_set.py::test_set PASSED

2021-12-24 17:58:37.642 | INFO     | cases.test_get_set:test_set:19 - 請求返回狀態碼:200

2021-12-24 17:58:37.643 | INFO     | cases.test_get_set:test_get:25 - 通過get_global_data方法獲取的值:200

test_get_set.py::test_get PASSED

============================== 2 passed in 0.06s ===============================

通過這種方式,便實現了用例間的參數傳遞問題。

在實際工作中,因為涉及到的接口、用例會很多,所以可以根據需要使用不同的conftest進行管理。并且存儲的數據結構也需要進行規范區分,如使用方法名作為字典的key。

二、使用tmpdir_factory方法

第二種方法,是使用pytest的tmpdir和tmpdir_factory兩個夾具函數,同樣是通過conftest文件來實現。仍然是先來看下官方文檔針對這兩個方法的說明:

pytest用例間參數傳遞的兩種實現方式是怎樣的

簡單來說,這兩個方法的作用就是為每個測試方法創建一個臨時目錄用于存儲自定義的文件,這個臨時目錄會默認保存3個sessions,之后就會按照創建的順序刪除舊的目錄。看下官方的例子:

# content of test_tmpdir.py
def test_create_file(tmpdir):
    p = tmpdir.mkdir("sub").join("hello.txt")
    p.write("content")
    assert p.read() == "content"
    assert len(tmpdir.listdir()) == 1
    assert 0
# contents of conftest.py
import pytest
 
 
@pytest.fixture(scope="session")
def image_file(tmpdir_factory):
    img = compute_expensive_image()
    fn = tmpdir_factory.mktemp("data").join("img.png")
    img.save(str(fn))
    return fn
 
 
# contents of test_image.py
def test_histogram(image_file):
    img = load_image(image_file)
    # compute and test histogram

我在實際項目中的使用:

仍是在conftest.py文件中自定義一個夾具函數,返回結果是一個元組,p是tmpdir_factory方法返回的對象,轉為字符串之后就是文件存儲的路徑。

自定義一個名為“apitest-tmp-dir”的文件夾用于存儲文件

# conftest.py
 
@pytest.fixture
def tmp_factory(tmpdir_factory):
    """
    生成臨時目錄
    """
    p = tmpdir_factory.mktemp('apitest-tmp-dir')
    logger.info("當前臨時文件的目錄為:" + str(p))
    return p, str(p)

在測試方法中的使用

 # test_get_set.py
 
import requests
import pytest
import json
 
 
def test_set(tmp_factory):
    res = requests.get("http://www.baidu.com")
    status_code = res.status_code
    logger.info(f"返回狀態碼:{status_code}")
 
    logger.debug(tmp_factory)
    # 創建test_set.txt文件
    a = tmp_factory[0].join("test_set.txt")
    # 將需要的內容寫入到文件中
    a.write({"status_code": status_code})
    
    # 使用read()方法獲取文件中的內容
    logger.debug(a.read())
 
 
 
if __name__ == '__main__':
    pytest.main(['-sv', 'test_get_set.py'])

返回結果: 

test_get_set.py::test_set 2021-12-24 18:24:39.292 | INFO     | cases.conftest:tmp_factory:150 - 當前臨時文件的目錄為:/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0

2021-12-24 18:24:39.347 | INFO     | cases.test_get_set:test_set:32 - 返回狀態碼:200

2021-12-24 18:24:39.347 | DEBUG    | cases.test_get_set:test_set:34 - (local('/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0'), '/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0')

2021-12-24 18:24:39.348 | DEBUG    | cases.test_get_set:test_set:38 - {'status_code': 200}

PASSED


============================== 1 passed in 0.07s ===============================

創建的文件:

pytest用例間參數傳遞的兩種實現方式是怎樣的

可以看到,tmpdir_factory會自動為我們創建一個目錄,名字是`tmp_factory`方法中自定義的名稱后面加0,同時它的上級目錄會自動從pytest-0遞增

說下這個辦法的優缺點:

  • 先說優點,這種數據存儲是直接寫入到文件,因此即使運行結束后也可以訪問,而不像第一種方法存儲的內容會隨著用例運行的結束而消失

  • 再說缺點,因為這個臨時目錄最多只能保存3個,因此如果用例很多時,那么就可能存在文件被自動刪除的風險。不過這個貌似可以通過修改默認配置來解決,可以繼續研究下。

  • 缺點二,上面的例子中,直接通過a.read()就訪問到了文件中的內容,這是因為內容的存儲與讀取全是在一個方法內,因此可以直接調用。如果是A方法存結果,在B中需要讀取,那么便不能直接使用read()方法了(因為每個方法都會創建一個目錄,并且默認的讀取地址都是這個方法自己創建的目錄)。就需要我們自己去單獨封裝一個讀取文件的方法了,實現起來也不難而且tmpdir本身的這些方法也是對os.path一些方法的二次封裝。

話說回來,都需要我自己去封裝一個讀取文件的方法了,為啥不干脆把讀、寫都自己來做呢?這樣是否刪除文件、刪除幾個、什么時候刪除就完全由自己定義了啊,貌似會更方便。大家應該對這兩種方法都有了一些了解,核心都是通過pytest的conftes.py文件來實現的。

看完上述內容,你們掌握pytest用例間參數傳遞的兩種實現方式是怎樣的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

醴陵市| 四会市| 临颍县| 汤原县| 吴旗县| 马边| 仁布县| 贵州省| 湄潭县| 老河口市| 含山县| 淮安市| 堆龙德庆县| 长沙县| 武强县| 仁化县| 洮南市| 班戈县| 黎城县| 郯城县| 民勤县| 平阳县| 临武县| 蓝田县| 尼玛县| 兰州市| 青龙| 长海县| 宁城县| 凉城县| 广宗县| 扬中市| 江源县| 区。| 叙永县| 拉孜县| 咸丰县| 涟水县| 旬邑县| 仙游县| 长子县|