pytest用例間參數(shù)傳遞的兩種實現(xiàn)方式示例
前言
我們在做接口自動化測試的時候,會經(jīng)常遇到這種場景:接口A的返回結果中的某個字段,是接口B的某個字段的入?yún)?。如果是使用postman,那我們可以通過設置后置變量,然后在需要使用的地方通過{{}}
的方式來進行調用。但是如果是使用自己寫的測試框架中要如何實現(xiàn)呢?我想到的是如下三種方法。
首先說明一下,以下三種方式均是通過python + pytest來實現(xiàn)的
一、通過conftest創(chuàng)建全局變量
conftest.py文件是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函數(shù)來實現(xiàn)我們想要的效果了,具體代碼如下:
# conftest.py # 定義一個全局變量,用于存儲內(nèi)容 global_data = {} @pytest.fixture def set_global_data(): """ 設置全局變量,用于關聯(lián)參數(shù) :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
簡單說一下實現(xiàn)邏輯:
- 首先定義一個變量global_data用于接收存儲用例返回的結果
- set_global_data和get_global_data兩個fixture方法顧名思義,set方法是往global_data中存數(shù)據(jù),get方法是從global_data中取數(shù)據(jù)
方法實現(xiàn)了,具體應該怎么使用呢?如下:
# 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"請求返回狀態(tài)碼:{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 - 請求返回狀態(tài)碼: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 ===============================
通過這種方式,便實現(xiàn)了用例間的參數(shù)傳遞問題。
在實際工作中,因為涉及到的接口、用例會很多,所以可以根據(jù)需要使用不同的conftest進行管理。并且存儲的數(shù)據(jù)結構也需要進行規(guī)范區(qū)分,如使用方法名作為字典的key。
二、使用tmpdir_factory方法
第二種方法,是使用pytest的tmpdir和tmpdir_factory兩個夾具函數(shù),同樣是通過conftest文件來實現(xiàn)。仍然是先來看下官方文檔針對這兩個方法的說明:
簡單來說,這兩個方法的作用就是為每個測試方法創(chuàng)建一個臨時目錄用于存儲自定義的文件,這個臨時目錄會默認保存3個sessions,之后就會按照創(chuàng)建的順序刪除舊的目錄??聪鹿俜降睦樱?/p>
# 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文件中自定義一個夾具函數(shù),返回結果是一個元組,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"返回狀態(tài)碼:{status_code}") logger.debug(tmp_factory) # 創(chuàng)建test_set.txt文件 a = tmp_factory[0].join("test_set.txt") # 將需要的內(nèi)容寫入到文件中 a.write({"status_code": status_code}) # 使用read()方法獲取文件中的內(nèi)容 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 - 返回狀態(tài)碼: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 ===============================
創(chuàng)建的文件:
可以看到,tmpdir_factory會自動為我們創(chuàng)建一個目錄,名字是`tmp_factory`方法中自定義的名稱后面加0,同時它的上級目錄會自動從pytest-0遞增
說下這個辦法的優(yōu)缺點:
- 先說優(yōu)點,這種數(shù)據(jù)存儲是直接寫入到文件,因此即使運行結束后也可以訪問,而不像第一種方法存儲的內(nèi)容會隨著用例運行的結束而消失
- 再說缺點,因為這個臨時目錄最多只能保存3個,因此如果用例很多時,那么就可能存在文件被自動刪除的風險。不過這個貌似可以通過修改默認配置來解決,可以繼續(xù)研究下。
- 缺點二,上面的例子中,直接通過a.read()就訪問到了文件中的內(nèi)容,這是因為內(nèi)容的存儲與讀取全是在一個方法內(nèi),因此可以直接調用。如果是A方法存結果,在B中需要讀取,那么便不能直接使用read()方法了(因為每個方法都會創(chuàng)建一個目錄,并且默認的讀取地址都是這個方法自己創(chuàng)建的目錄)。就需要我們自己去單獨封裝一個讀取文件的方法了,實現(xiàn)起來也不難而且tmpdir本身的這些方法也是對os.path一些方法的二次封裝。
話說回來,都需要我自己去封裝一個讀取文件的方法了,為啥不干脆把讀、寫都自己來做呢?這樣是否刪除文件、刪除幾個、什么時候刪除就完全由自己定義了啊,貌似會更方便。。。。。三、總結
綜上所述,大家應該對這兩種方法都有了一些了解,核心都是通過pytest的conftes.py文件來實現(xiàn)的。
總結
到此這篇關于pytest用例間參數(shù)傳遞的兩種實現(xiàn)的文章就介紹到這了,更多相關pytest例間參數(shù)傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python利用Selenium實現(xiàn)自動觀看學習通視頻
Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。本文主要介紹了利用Selenium實現(xiàn)自動觀看學習通視頻,需要的同學可以參考一下2021-12-12python實現(xiàn)Android與windows局域網(wǎng)文件夾同步
這篇文章主要給大家詳細介紹了python實現(xiàn)Android與windows局域網(wǎng)文件夾同步,文中有詳細的代碼示例和圖文介紹,具有一定的參考價值,需要的朋友可以參考下2023-09-09聊聊python在linux下與windows下導入模塊的區(qū)別說明
這篇文章主要介紹了聊聊python在linux下與windows下導入模塊的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03python?Pandas之DataFrame索引及選取數(shù)據(jù)
這篇文章主要介紹了python?Pandas之DataFrame索引及選取數(shù)據(jù),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07Pytorch中torch.unsqueeze()與torch.squeeze()函數(shù)詳細解析
torch.squeeze()這個函數(shù)主要對數(shù)據(jù)的維度進行壓縮,去掉維數(shù)為1的的維度,下面這篇文章主要給大家介紹了關于Pytorch中torch.unsqueeze()與torch.squeeze()函數(shù)詳細的相關資料,需要的朋友可以參考下2023-02-02Python3 循環(huán)語句(for、while、break、range等)
這篇文章主要介紹了Python3 循環(huán)語句(for、while、break、range等),大家把下面的文章看完就基本上就可以了解了python的循環(huán)實現(xiàn)方式了2017-11-11