Pytest框架實戰二

??在Pytest框架實戰一中詳細地介紹了Pytest測試框架在參數化以及Fixture函數在API測試領域的實戰案例以及具體的應用。本文章接著上個文章的內容繼續闡述Pytest測試框架優秀的特性以及在自動化測試領域的實戰。

conftest.py

? ? ? ?在上一篇文章中闡述到Fixture函數的特性,第一是函數的返回值,第二是測試固件的特性。但是在實際的工作里面會有非常多的Fixture函數,那么怎么合理的安排更加友好呢?建議把公共的部分剝離出來統一的管理和調用,而非公共的部分就使用常規的函數來處理就可以了。在API自動化測試中公共的部分主要是認證授權的機制,也就是登錄成功后返回的TOKEN在后續的請求中需要帶上這個TOKEN才能夠獲取服務端的認可客戶端才能夠獲取資源信息。在Pytest測試框架中可以把Fixture函數分離到conftest.py的文件中,這個文件它的特性具體如下。

  • 它是一個模塊,但是這個模塊不需要導入就可以使用里面的Fixture函數

  • 在目錄結構的設計上,conftest.py文件建議在項目的第一層級目錄結構中

  • conftest.py就是用來分離公共的Fixture函數

結合第一篇文章的案例,下來把登錄認證授權代碼分離到conftest.py文件中,這樣測試模塊使用的時候直接調用它就可以了,分離到conftest.py模塊里面的代碼如下。


#!/usr/bin/python3
#coding:utf-8
# author:wuyaimport  pytest
import  requests
import json@pytest.fixture()
def access_token():r=requests.post(url='http://47.95.142.233:8000/login/auth/',json={"username":"13484545195","password":"asd888"})return r.json().get('token',None)@pytest.fixture()
def headers(access_token):return {'Authorization':'JWT {token}'.format(token=access_token)}

如上是把登錄認證授權的代碼分離到conftest.py的文件中,下來在測試模塊里面直接調用就可以了,涉及到的測試模塊的代碼如下:


#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:wuyaimport pytest
import  requests
import  jsondef writeID(prodctID):json.dump(str(prodctID),open('prodctID','w'))def getID():return int(json.load(open('prodctID')))def addProduct(headers):r=requests.post(url='http://47.95.142.233:8000/interface/product/',json={"name":"測試數據","product_type":"WEB","version":"1.0","master":"無涯","description":"測試"},headers=headers)writeID(prodctID=r.json()['id'])return rdef delProduct(headers):r=requests.delete(url='http://47.95.142.233:8000/interface/product/{productID}/'.format(productID=getID()),headers=headers)return r@pytest.fixture()
def init(headers):addProduct(headers)yielddelProduct(headers)def test_so_product(init,headers):'''產品搜索驗證'''r=requests.get(url='http://47.95.142.233:8000/interface/products?name=測試數據',headers=headers)

如上可以看到init()函數也是Fixture函數,但是并沒有分離到conftest.py文件中,理由主要是init()函數它是基于業務需求而編寫的Fixture函數但是并不是公共的Fixture函數,在后面隨著編寫測試用例越來越多的情況下,這種基于業務的Fixture函數會特別多。如上的代碼執行后的結果信息如下圖所示。

圖片

在企業級的API自動化測試框架中,完全的可以把conftest.py應用進去,特別是登錄認證授權的這部分特性功能。

命令行解釋器

? ? ? ?在微服務架構的產品中存在一個特性就是使用不同的租戶來登錄系統,訪問的業務形態都是一樣的,但是在底層會針對數據做隔離。正因為如此,所以就會有眾多的集群模式來滿足底層的計算能力。那么這樣在編寫的測試用例上,就需要更多的靈活性,這個靈活性主要指的是不能把登錄的賬戶和密碼寫死,要滿足不同的集群驗證模式,那么也就意味著登錄的用戶是可以自定義的,但是這個自定義的用戶必須是系統已被訂閱的租戶。這樣設計的優勢就是可以滿足不同集群驗證產品的特性以及定時輪訓檢測不同集群的底層計算能力和系統的穩定性。使用這部分可以使用Pytest測試框架的命令行解釋權完全能夠解決這部分,下面針對之前的代碼進行改造,把登錄系統的賬戶與密碼完全的自定義化,改造后的代碼如下。


#!/usr/bin/python3
#coding:utf-8
# author:wuyaimport  pytest
import  requests
import jsondef pytest_addoption(parser):'''添加pytest的自定義命令行參數'''parser.addoption('--username',action='store',default='13484545195',help='myoption: type1 or pyte2')parser.addoption('--password',action='store',default='asd888',help='myoption: type1 or pyte2')@pytest.fixture()
def username(request):return request.config.getoption('--username')@pytest.fixture()
def password(request):return request.config.getoption('--password')@pytest.fixture()
def access_token(username,password):r=requests.post(url='http://47.95.142.233:8000/login/auth/',json={"username":username,"password":password})return r.json().get('token',None)@pytest.fixture()
def headers(access_token):return {'Authorization':'JWT {token}'.format(token=access_token)}

在如上的代碼中,完全的把登錄的賬戶與密碼分離了出來,這樣就可以滿足上面說的針對不同的集群以及集群規模化的驗證模式,而且在上面也使用了默認的模式,也就是說執行的時候可以指定自定義的賬戶與密碼,如下執行的方式是指定了賬戶與密碼(自定義但是必須是指定的賬戶密碼是系統的用戶)


pytest -v  -s test_login.py --username=13588545195 --password=asd888

執行后的結果信息如下所示。

圖片

也可以執行的時候使用默認命令行指定的賬戶與密碼,執行以及執行結果如圖所示。

圖片

如上所示,使用Pytest的命令行解釋器的特性,可以很輕松的解決了執行過程中隨意的制定自定義的變量。

pytest.ini

在Pytest框架中,使用conftest.py是為了更好地分離Fixture函數,這樣能夠達到Fixture函數的共享機制,從而能夠在各個模塊以及測試函數里面調用,從而減少重復代碼的數量。一般而言編寫的測試類都是以Test開頭,編寫的測試函數都是以test開頭,而所有的測試模塊在test的包下,以及執行的過程中為了輸出詳細的信息以及打印輸出的信息,在執行的時候都會帶上-v與-s的命令,當然還有其他的信息。這些都是完全可以分離到pytest.ini的文件中,由它進行統一的管理。pytest.ini地工程的第一層級的位置,如下內容是pytest.ini文件內容。


[pytest]
#指定執?時候的默認信息
addopts= -v -s --driver Chrome --html=report.html  --reruns 3
#注冊標記
markers=login:執?標記為login的測試函數register:執?標記為register的測試函數
#指定Pytest的最低版本號
minversion=3.0
#指定忽略執??錄
norecursedirs=.pytest_cache
#指定測試?錄
testpaths=test
#指定測試模塊搜索的規則
python_files=test_*
#指定測試類搜索的規則
python_classes=Test*
#指定測試函數搜索規則
python_functions=test_*

如上種指定了測試目錄以及測試框架執行過程中測試的搜索規則。使用了pytest.ini的優勢是后續執行過程中就不需要帶上如-s這樣的命令以及指定執行的目錄。

tox.ini

tox.ini與pytest.ini是一樣的,不過使用tox.ini可以代替pytest.ini的配置文件,而且在tox.ini的配置文件里面可以指定多個不同解釋器的版本,這樣的優勢是在執行具體的測試用例的過程中就能夠兼顧到多個不同Python解釋器版本執行的情況。tox是一個命令行的工具,它允許測試在多種環境下執?,它的?作流程具體可以理解為:通過setup.py?件為待測程序創建源碼安裝包,這樣就會查看tox.ini中所有的環境設置。把所有pytest.ini的配置都移動到 tox.ini??,tox.ini文件內容如下。


[tox]
envlist = py3.5, py3.6, py3.7, py3.8, py3.9, py3.10, py3.11
skipsdist = True
indexserver =default = https://pypi.doubanio.com/simple
[testenv]
install_command = pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host irrors.aliyun.com {opts} {packages}
deps =-rrequirements.txt
commands = coverage erasepy.test --cov={toxinidir} -sx testcoverage html
setenv =PYTHONPATH = {toxinidir}/py3
[testenv:dev]
deps = pytest
commands = {posargs:py.test}
[pytest]
#指定執?時候的默認信息
addopts= -v -s
#注冊標記
markers=login:執?標記為login的測試函數register:執?標記為register的測試函數#指定Pytest的最低版本號
minversion=3.0
#指定忽略執?的?錄
norecursedirs=.pytest_cache
#指定測試?錄
testpaths=test
#指定測試模塊搜索的規則
python_files=test_demo.py
#指定測試類搜索的規則
python_classes=Test*
#指定測試函數搜索規則
python_functions=test_*

如上所示,指定了多個不同Python解釋器的版本。執行的命令直接就是tox,執行后就會執行指定目錄下所有的測試用例并且會在指定的Python解釋器版本中都會執行,執行結果如下圖。

圖片

在不管是UI的測試框架還是API的測試框架中,把Pytest測試框架的配置引入進去,這樣執行的時候就不需要刻意的指定被執行的目錄以及各種命令,更多的精力可以聚焦于測試場景的編寫以及代碼的封裝。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14795.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell循環

一、for循環 用法: for 變量 in 取值列表 do 命令序列 done 例1:打印1到10的數字列表 #!/bin/bashfor i in {1..10} do echo $i done 例2:#批量添加用戶,用戶名存放在users.txt文件中,每行一個,初始密碼均設為123456 #!/bin/bas…

KMP算法【C++】

KMP算法測試 KMP 算法詳解 根據解釋寫出對應的C代碼進行測試&#xff0c;也可以再整理成一個函數 #include <iostream> #include <vector>class KMP { private:std::string m_pat;//被匹配的字符串std::vector<std::vector<int>> m_dp;//狀態二維數組…

怎樣解決Redis高并發競爭Key難點?

Redis作為一種高性能的鍵值存儲系統&#xff0c;在現代分布式系統中發揮著重要作用。然而&#xff0c;高并發場景下對同一Key的操作可能引發競爭條件&#xff0c;給系統穩定性和數據一致性帶來挑戰。本文將探討如何解決這一問題&#xff0c;為讀者提供有效的應對策略。 1. Red…

【002】FlexBison實現原理

0. 前言 Flex和Bison是用于構建處理結構化輸入的程序的工具。它們最初是用于構建編譯器的工具&#xff0c;但它們已被證明在許多其他領域都很有用。 &#xfeff; 在第一章中&#xff0c;我們將首先看一點(但不是太多)它們背后的理論&#xff0c;然后我們將深入研究一些使用它…

Mysql和Postgresql創建用戶和授權命令

Mysql和Postgresql創建用戶和授權命令 MySQL/MariaDB/TiDB mysql -uroot -P3306 -p 輸入密碼&#xff1a;xxx create user user1% identified by xxx; grant all privileges on *.* to user1%; create user user2% identified by xxx; grant all privileges on *.* to user2%;…

Winform /C# 截圖當前窗體,指定區域,當前屏幕

1.當前窗體 public static Image CaptureControl(Control ctrl){System.Drawing.Bitmap bmp new System.Drawing.Bitmap(ctrl.Width, ctrl.Height);ctrl.DrawToBitmap(bmp, new Rectangle(0, 0, ctrl.Width, ctrl.Height));return bmp;}private void DownLoad(){string filePa…

java類中運行main方法時報錯:找不到或無法加載主類 XXX

運行main類報了這個錯 錯誤: 找不到或無法加載主類 XXX 經過好一番查證才找出了問題所在 原因是 maven項目的provided導致的&#xff0c;現在記錄一下。 將pom.xml中標注provided的注釋掉&#xff0c;就不報錯了。

ERROR [internal] load metadata for docker.io/library/node:20-alpine

docker編譯時報錯&#xff0c;除標題外&#xff0c;還報如下信息 ERROR: failed to solve: node:20-alpine: failed to resolve source metadata for docker.io/library/node:20-alpine: failed to do request: Head "https://registry-1.docker.io/v2/library/node/mani…

常用個人信息

目錄 常用聯系方式我的自動思維常用媒體專業相關康米相關黑歷史 常用聯系方式 QQ&#xff1a;2868679921 微信&#xff1a;Commieee 郵箱&#xff1a;sharvefoxmail.com 我的自動思維 常用媒體 嗶哩嗶哩 專業相關 博客 康米相關 QQ&#xff1a;1203361015 黑歷史 貼吧…

PyQt5學習系列之QMetaObject.connectSlotsByName

文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 學習記錄 QMetaObject.connectSlotsByName——自動將信號連接到槽&#xff08;函數&#xff09; 例如&#xff1a; from PyQt5.QtWidgets import QMainWindow, QPushButton from PyQt5.QtCore…

哪些類型的產品適合用3D形式展示?

隨著3D技術的蓬勃發展&#xff0c;眾多品牌和企業紛紛投身3D數字化浪潮&#xff0c;將產品打造成逼真的3D模型進行展示&#xff0c;消費者可以更加直觀地了解產品的特點和優勢&#xff0c;從而做出更明智的購買決策。 哪些產品適合3D交互展示&#xff1f; 產品3D交互展示具有直…

2024系統架構師--- 希賽模擬答案知識點

案例第一題&#xff1a; MVC架構包含&#xff1a;視圖、控制器、模型&#xff1b; 視圖&#xff08;View&#xff09;&#xff1a;視圖是用戶看到并與之交互的界面。視圖面向用戶顯示相關的數據&#xff0c;并能接收用戶的輸入數據&#xff0c;但是它并不能進行任何實際的業務…

深入探索微軟Edge:領略新一代瀏覽器的無限可能

深入探索微軟Edge&#xff1a;領略新一代瀏覽器的無限可能 在當今數字化時代&#xff0c;網絡瀏覽器已經成為我們日常生活中不可或缺的一部分。而隨著技術的不斷進步&#xff0c;瀏覽器的功能和性能也在不斷提升。微軟Edge作為微軟推出的全新一代瀏覽器&#xff0c;引領著瀏覽…

自己手寫一個字符串【C風格】

//字符串的常見操作 #include <iostream>#define MAX_SIZE 15 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status;//狀態類型 typedef char ElemType;//元素類型typedef ElemType String[MAX_SIZE 1];//第一個字節記錄長度//***tring是數…

c#自動生成缺陷圖像-添加新功能(可從xml直接提取目標數據,然后進行數據離線增強)--20240524

在進行深度學習時,數據集十分重要,尤其是負樣本數據。 故設計該軟件進行深度學習數據預處理,最大可能性獲取較多的模擬工業現場負樣本數據集。 該軟件基于VS2015、.NETFrameWork4.7.2、OpenCvSharp1.0.0.0、netstandard2.0.0.0、SunnyUI3.2.9.0、SunnyUI.Common3.2.9.0及Ope…

C盤磁盤空間不夠用,怎樣將d盤的空間劃分給c盤?

C盤磁盤空間不夠用&#xff0c;怎樣將d盤的空間劃分給c盤&#xff1f; 背景&#xff1a;win10系統下。C盤原有50G&#xff0c;如今只剩下8G&#xff0c;已經捉襟見肘了&#xff0c;想從D盤&#xff0c;割100G給C盤&#xff0c;以后軟件能直接裝C盤了。操作步驟如下&#xff1a…

2024年人文藝術與創新教育國際學術會議(ICHAIE 2024)

2024年人文藝術與創新教育國際學術會議&#xff08;ICHAIE 2024) 2024 International Conference on Humanities, Arts and Innovation Education 一、【會議簡介】 隨著全球化的推進和科技的迅猛發展&#xff0c;人文藝術與創新教育在培養未來人才方面扮演著越來越重要的角色…

溫故而知新-導航【面試復習】

溫故而知新-導航【面試復習】 前言版權溫故而知新-導航【面試復習】最后 前言 2024-5-18 00:01:31 以下內容源自《【溫故而知新】【面試復習】》 僅供學習交流使用 版權 禁止其他平臺發布時刪除以下此話 本文首次發布于CSDN平臺 作者是CSDN日星月云 博客主頁是https://jsss…

【深度學習】ONNX介紹

ONNX&#xff08;Open Neural Network Exchange&#xff09; ONNX 是一種用于表示深度學習模型的開放格式&#xff0c;使得不同深度學習框架&#xff08;如 PyTorch、TensorFlow、Caffe2 等&#xff09;之間的模型能夠相互交換。 需安裝&#xff1a; pip install --upgrade o…

docker 版 mysql 主從同步

docker 版 mysql 主從同步 1、環境2、搭建主服務器實例33062.1、命令2.3、進入/mydata/mysql-master/conf 目錄下新建 my.cnf2.4、修改完配置后重啟 master 實例2.5、進入 mysql-master 容器2.6、master 容器實例內創建數據同步用戶3、新建從服務實例 33083.1、命令3.2、進入/m…