1. 接口自動化的實現(xiàn)
API:Application Programming Interface
接口自動化按照自動化的工具可分為
基于接口測試工具的接口自動化
- eg1:Postman+Newman+git/Svn+Jenkins(基于Javascript語言)接口自動化
Postman:創(chuàng)建和發(fā)送 API 請求,并對響應進行斷言和驗證。
Newman: Postman 的命令行工具,它允許測試人員在沒有界面的情況下運行 Postman 集合。常用于在 CI/CD 流程中自動化運行 API 測試。
Git:版本控制工具
Jenkins:CI/CD 流程中用于自動化構(gòu)建、測試和部署應用程序。可以設置定期或事件觸發(fā)的構(gòu)建任務,將 Postman 集合和 Newman 集成到自動化測試流程中。
持續(xù)集成(Continuous Integration)和持續(xù)交付(Continuous Delivery): CI在每次代碼提交時自動觸發(fā)構(gòu)建和測試過程,CD自動將構(gòu)建通過多個環(huán)境(如開發(fā)、測試、預生產(chǎn))傳遞到生產(chǎn)環(huán)境以確保軟件隨時可以被部署到生產(chǎn)環(huán)境。
- eg2:Jmeter+Ant+Git/Svn+Jenkins(基于Java和BeanShell語言)接口自動化
JMeter:性能測試工具,可模擬多種負載和場景,以測試 API 的性能和可靠性。
Ant:用于自動構(gòu)建和部署 Java 項目的構(gòu)建工具。它可以用來執(zhí)行 JMeter 測試計劃并生成測試報告。
基于代碼的接口自動化(本質(zhì)是輕量型的框架)
- Python為主(復雜腳本比Java簡單),常用第三方庫
Requests:與 API 和網(wǎng)絡服務的交互
PyYAML :在 Python 中解析和生成 YAML 數(shù)據(jù)。YAML 是一種輕量級的數(shù)據(jù)序列化格式,常用于配置文件和數(shù)據(jù)交換。XML&Json&YAML:在作為配置文件的時候,這三種格式都很常用;在數(shù)據(jù)傳輸?shù)臅r候, XML和JSON很常見, 尤其是JSON,在API的開發(fā)中現(xiàn)在變得越來越普及;從文件大小上來說, 同樣的數(shù)據(jù)集。YAML文件最小, JSON次之,XML最大。
pytest:pytest 是 Python 中廣泛使用的測試框架,使編寫測試用例更加便捷。
Allure:allure-pytest 是 pytest 的插件,用于生成詳細且吸引人的測試報告,與 Allure 測試報告框架集成。
logging:logging 是 Python 內(nèi)置的日志模塊,用于記錄應用程序運行時的消息,方便調(diào)試和監(jiān)控。
基于平臺的接口自動化:測試開發(fā)。
平臺能夠跟進產(chǎn)品序列
本接口自動化及pytest測試實踐屬于代碼自動化
2. 知識要點及實踐
2.1 requests.post傳遞的參數(shù)本質(zhì)
body
Response對象:
2.2 pytest單元測試框架
默認測試用例規(guī)則:
- 模塊名(,py文件)以test_開頭或者_test結(jié)尾
- 類名必須Test開頭
- 用例名必須以test_開頭
??采用自動化測試(一)的Google翻譯爬蟲接口的一個小案例,比如:
??測試庫名test_Google_tran
??測試模塊名test_Tran_API.py
??測試類名TestAPI
??測試用例名test_post_message
2.2.1 pytest框架簡介
框架作用:
- 發(fā)現(xiàn)用例:根據(jù)pytest框架默認的規(guī)則去發(fā)現(xiàn)并且加載測試用例
- 執(zhí)行用例:將測試用例按照一定的順序和條件執(zhí)行并生成結(jié)果
- 判斷結(jié)果:通過斷言來判斷實際結(jié)果和預測結(jié)果是否相同
- 生成報告:統(tǒng)計測試進度、耗時、通過率,生成報告。
PS:可以和很多工具,比如selenium,appium等結(jié)合使用,可以使用很多插件,比如allure。
插件舉例 (插件本質(zhì)也是第三方庫):
- allure-pytest:生成allure報告
- pytest-cov:用于代碼覆蓋率分析。生成代碼覆蓋率報告,幫助了解測試覆蓋的情況。
- pytest-html:生成漂亮的 HTML 格式測試報告,包括測試結(jié)果、用例名稱、時間等信息,方便查看和分享。
- pytest-xdist:允許并行運行測試,多線程加速測試過程。適用于擁有多個 CPU 核心的機器。
- pytest-ordering:標記測試用例的執(zhí)行順序
- pytest-selenium:支持使用 Selenium 進行 Web UI 測試。
- pytest-returnfailers:失敗用例重跑
- pytest-base-url:管理基礎路徑
框架結(jié)構(gòu):(命名規(guī)則影響到框架檢索)
LearningAutoTesting/
? ?|- common/ --封裝庫名
? ?| ? ?|- api.py
? ?| ? ?|- …
? ?|- testcase/ --測試庫名
? ?| ? ?|- test_api.py --測試模塊名
? ?| ? ?|- …
? ?|- run.py --測試用例運行
? ?|- conftest.py --全局測試配置
? ?|- requirements.txt --依賴名
用例的執(zhí)行:
可以直接運行run.py
:pytest.main([‘–capture=sys’])
可以在LearningAutoTesting路徑下用命令行pytest -vs
??注意pytest.ini配置文件,框架會自動檢索并用于配置pytest 運行測試時的一些參數(shù)和選項。pytest.ini 文件為整個項目設置一致的默認配置,提高了可維護性和可讀性。下面是配置文件常用內(nèi)容舉例:
執(zhí)行測試用例前后的操作:
方法一:同unittest
??在 pytest 中,用于在測試用例執(zhí)行前后執(zhí)行操作的關(guān)鍵字是 setup 和 teardown,但是在 pytest 中,更推薦使用 setup 和 teardown 的變種,即 setup_method 和 teardown_method。
setup_method:在每個測試方法(測試用例)執(zhí)行前都會調(diào)用。適用于需要在每個測試之前執(zhí)行初始化操作的情況。
teardown_method:在每個測試方法執(zhí)行后都會調(diào)用。適用于需要在每個測試之后執(zhí)行清理操作的情況。
setup_class :在整個測試類的生命周期中只會執(zhí)行一次,不同于 setup_method。
方法二:采用fixture固件,靈活設置方法的前后操作。
Python 中的裝飾器是一種特殊的語法和功能,用于修改或增強函數(shù)或類的行為。裝飾器可以在不修改原始函數(shù)或類代碼的情況下,對它們進行功能性的擴展、修改或包裝。裝飾器通常是函數(shù),它接受一個函數(shù)或類作為參數(shù),并返回一個新的函數(shù)或類。
def count_calls(func):
def wrapper(*args, **kwargs):
wrapper.call_count += 1
print(f"Function {func.__name__} has been called {wrapper.call_count} times.")
return func(*args, **kwargs)
wrapper.call_count = 0
return wrapper
@count_calls
def my_function():
print("Hello, world!")
my_function()
輸出:
Function my_function has been called 1 times.
Hello, world!
Function my_function has been called 2 times.
Hello, world!
@pytest.fixture:用于定義固件或者叫夾具(fixture),固件是一種可以在測試用例中重復使用的資源或數(shù)據(jù),例如數(shù)據(jù)庫連接、臨時文件、模擬對象等。它可以用來隨心所欲的設置前后置操作。
裝飾器用法,調(diào)整這5個參數(shù)進行使用。作用域一般是函數(shù)級別或者會話級別。
fixture的手動調(diào)用:在test_case(self,固件名)
其中yeild
是一個生成器??梢杂脕韨鬟f返回值當一個函數(shù)中包含了 yield 關(guān)鍵字時,它就變成了一個生成器函數(shù)。生成器函數(shù)可以被調(diào)用,但不會立即執(zhí)行,而是返回一個生成器對象。每次調(diào)用生成器對象的 next() 方法(或使用 next() 函數(shù))時,函數(shù)會執(zhí)行直到遇到 yield,然后產(chǎn)生一個值并暫停。下次調(diào)用時,函數(shù)從上次暫停的地方繼續(xù)執(zhí)行,直到再次遇到 yield 或函數(shù)結(jié)束。
自動調(diào)用: 如果只有autouse參數(shù)為true,則同setup_作用域。
固件傳參:數(shù)據(jù)驅(qū)動,可以通過參數(shù)化來實現(xiàn)一種類似于迭代的行為。當您使用 params 參數(shù)來傳遞多個參數(shù)時,fixture 將會為每組參數(shù)運行一次測試函數(shù),并在每次測試運行時提供不同的準備工作。
2.2.2 pytest裝飾器
@pytest.fixture
:用于定義夾具(fixture),夾具是一種可以在測試用例中重復使用的資源或數(shù)據(jù),例如數(shù)據(jù)庫連接、臨時文件、模擬對象等。
對固件驅(qū)動。1. 主要用于準備測試所需的數(shù)據(jù)、對象、環(huán)境等,并在測試結(jié)束后進行清理操作,以確保測試之間不會相互影響。2. 通過將常見的測試準備和清理邏輯封裝到 fixture 中,您可以在多個測試用例中重復使用,從而避免重復編寫相同的代碼。3. fixture 可以用于管理外部資源,如數(shù)據(jù)庫連接、文件句柄等,以確保資源在測試完成后被釋放。
@pytest.mark.parametrize
:用于參數(shù)化測試,允許你通過多個參數(shù)組合運行同一個測試用例,以減少重復的測試代碼。
對數(shù)據(jù)驅(qū)動:@pytest.mark.parametrize(參數(shù)名,參數(shù)值-列表或者元組),數(shù)據(jù)中有多少值就會執(zhí)行多少次。用于在一個測試用例中多次運行,每次使用不同的參數(shù),即使用不同的輸入數(shù)據(jù)運行相同的測試邏輯
@pytest.mark.skip
和 @pytest.mark.skipif
:用于跳過指定的測試用例,前者是無條件跳過,后者可以根據(jù)條件來決定是否跳過。
@pytest.mark.xfail
:用于標記預期失敗的測試用例,即使測試用例失敗了,也不會導致整個測試過程失敗。
@pytest.mark.parametrize
:用于參數(shù)化測試,讓你可以為測試用例指定多組參數(shù),使得同一個測試用例可以多次運行。
@pytest.mark.timeout
:用于為測試用例設置最大運行時間,如果測試用例運行時間超過指定時間,將會被中斷。
@pytest.mark.parametrize
:用于將標記應用于測試用例,例如自定義標記,用于組織測試用例。
@pytest.mark.usefixtures
:用于在測試函數(shù)中自動使用指定的夾具,不需要在參數(shù)列表中指定。
@pytest.mark.filterwarnings
:用于過濾特定類型的警告,以便在測試運行期間不顯示特定的警告信息。
@pytest.mark.raises
:用于斷言某個異常被正確地引發(fā),用于測試代碼中是否拋出了預期的異常。
2.2.3 斷言、allure測試報告
??還需要安裝allure,才能通過os模塊調(diào)用,這里僅放一個基礎使用例子,在該系列的后續(xù)文章**自動化測試(四)**中細講。
2.2.4 接口關(guān)聯(lián)、封裝改進
接口關(guān)聯(lián)場景:在測試中,一個系統(tǒng)通常會被分解成多個子系統(tǒng)或模塊,這些子系統(tǒng)之間需要通過接口進行數(shù)據(jù)傳遞和交互。比如test1中驗證了能夠獲得tokens,test2需要使用test1的tokens。
方法一:對于流水線測試,中間數(shù)據(jù)傳輸比較少的話,可以在 pytest 的 fixture 中使用 yield 語句來在 fixture 的生命周期內(nèi)傳遞參數(shù),并確保 yield 生成的數(shù)據(jù)被另外一個測試用例以函數(shù)名稱傳輸?shù)姆绞讲东@。
方法二:用文件、數(shù)據(jù)庫保存,常用yaml文件。用文件或者數(shù)據(jù)庫統(tǒng)一管理中間變量。
common\yaml_uitl.py文件
# 提前構(gòu)建一個yaml文件
import yaml
import os
def read_yaml(key):
# 使用 with 會自動管理文件的打開和關(guān)閉
with open(os.getcwd() + "/extract.yaml", encoding="utf-8") as f:
value = yaml.load(stream=f, Loader=yaml.FullLoader) # 自動將yaml結(jié)構(gòu)體
print(value)
return value[key]
def write_yaml(data):
# 理論上還需要檢測yaml中是否已經(jīng)存在對應的數(shù)據(jù),如果存在需要改mode
with open(os.getcwd() + "/extract.yaml", encoding="utf-8", mode='a') as f:
yaml.dump(data, stream=f, allow_unicode=True)
if __name__ == "__main__":
print(read_yaml("employee"))
write_yaml({"employer": {"name": "Jerry"}})
print(read_yaml("employer"))
一般在conftest文件中設置clear_yaml函數(shù)。接口關(guān)聯(lián)時使用yaml_util直接寫入、讀取json數(shù)據(jù)即可。
YAML 文件人類易讀性比Json好,可以和json之間靈活轉(zhuǎn)換(load后就是json格式)
- 編寫配置文件
- 測試用例接口關(guān)聯(lián)
# 特殊字符可以使用單引號或雙引號括起來
employee:
name: Mark
age: 28
status: null # 空值可以表示為 null 或 ~
projects:
- Project A # - 表示列表中的元素
- Project B
contact: # 聯(lián)系方式
email: mark@example.com
phone: 123-456-7890
description: | # | 表示多行字符串
This is a multiline
string with preserved line breaks.employer:
employer:
name: Jerry
YAML動態(tài)傳參(熱加載)
熱加載:讓YAML能夠調(diào)用外部函數(shù)
方法:${fuction_name(parms)}
2.3 pytest接口封裝(統(tǒng)一請求封裝)
?將數(shù)量很多的用例封裝為一個方法。場景:
- 統(tǒng)計數(shù)據(jù)
- 異常處理
- 日志監(jiān)控
eg1:以處理數(shù)據(jù)為例,將待翻譯的內(nèi)容封裝成GoogleTranslate.py中的google_translator類。
eg2:以日志監(jiān)控為例,封裝后在SendRequest類方法中打印日志即可,因為所有的用例中都會調(diào)用SendRequest類方法。同時自建的類只初始化一次session對象(能夠自動關(guān)聯(lián)cookie,所有請求都在一個通話里面),而google_translator類with requests.Session() as s,或者request方法源碼也是先from . import sessions然后with sessions.Session() as session,cookie都只用了一次
為什么可以requests.Session(),而不需要requests.sessions.Session()?
??requests 庫在設計時采用了適當?shù)哪K導入機制和命名空間。這樣的設計使得庫的使用更加便捷和一致。當你使用 import requests 導入 requests 模塊時,你實際上導入了 requests 包中的 init.py 模塊。然后,requests 包內(nèi)的各個子模塊和類都會在 requests 命名空間下變得可用。
文章來源:http://www.zghlxwxcb.cn/news/detail-692045.html
參考
b站2023年課程p1-p9文章來源地址http://www.zghlxwxcb.cn/news/detail-692045.html
到了這里,關(guān)于自動化測試(三):接口自動化pytest測試框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!