基于pytest的服務端http請求的自動化測試框架?

1、引言

我有一個朋友是做 Python 自動化測試的。前幾天他告訴我去參加一個大廠面試被刷了。

我問他是有沒有總結被刷下來的原因。他說面試官問了一些 pytest 單元測試框架相關的知識,包括什么插件系統和用力篩選。但是他所在的公司用的技術是基于 unittest 的,沒有用過 pytest。

我跟他說你可以和技術面試官說明,在實際過程當中你沒有使用過 pytest,但是你可以后面再學。這哥們說:我就是這樣跟面試官說的,但是面試官告訴我 pytest 現在已經是行業里面的主流,還在堅持用 unittest 說明我的技術已經過時了,沒有跟上現在測試領域的發展。

實際上他在面試之前已經了解過 pytest 的一些基礎用法,但是網上的一些資料,都是停留在用法和一些知識點的講解,沒有深入到 pytest 內部運行和一些高級特性。所以被問到的時候,自己臨時抱佛腳的一些知識都沒有用上。

后面我給這位朋友補習了一些關于 Python 的高級特性。現在我連同基礎部分的內容一起貼出來,希望對 Python 自動化測試的一些朋友有所幫助。

2、為什么用單元測試框架?

首先我要說明一下什么是單元測試框架?

unittest 和 pytest 都是單元測試框架。單元測試指的是在編程過程當中形成的對函數或者是類下面的方法進行測試的一個過程。

在不使用任何框架的前提下,其實也是可以進行單元測試的。比如我們可以通過 if 判斷
、異常處理或者是其他的流程控制來表示測試是否通過。

def add(a, b):return a + bdef test_add():ret = add(3, 4)if ret == 7:print("add 函數的測試通過")else:print("add 函數的測試失敗")

如果要運行這個用例,需要手工調用 test_add 這個函數:

test_add()

接下來,使用 python 運行這個文件,就能得到測試結果:

python test_add.py

雖然說上面我們通過 if 判斷,對一個函數進行了測試,而且得到了測試結果,但是流程是比較復雜的:

  • 首先我們需要人工去判斷結果,
  • 第 2 我們需要通過 Python 去運行模塊。
  • 第 3,我們還需要顯性的去調用 test_add 這個函數。

這還只是在我們只測試了一個函數的情況下,當需要測試的函數或者類越來越多的時候,這個過程會越來越復雜。

而使用單元測試框架,可以極大的簡化我們對單元測試的過程,使用單元測試框架以后,框架會幫我們自動去收集用例、運行用例、生成報告。


?

3、pytest 的基礎使用

上面的測試代碼使用 pytest 編寫,可以這樣寫。

def add(a, b):return a + bdef test_add():assert 7 == add(3,4)

寫完測試用例以后,我們只需要在目錄下輸入 pytest 指令,就可以自動運行用例,而且呢結果會直接顯示在命令行的下方。

上面講的是單元測試過程,也就是說對某個函數或者是類下面的方法進行測試,有的人可能會不理解。在實際工作過程當中很少進行單元測試啊,測試人員做的更多的是接口測試,UI 測試,pytest 怎么用呢?

實際上不管是接口測試還是 UI 測試,都是可以使用 pytest。當你進行接口測試的時候,你只需要把訪問接口的過程封裝成一個 Python 函數。

def visit_api():print("訪問接口,得到結果...")return responsedef test_api():assert expected_response == visit_api()

當你進行 Web 測試的時候,你只需要操作瀏覽器的過程封裝成一個函數?

def browser_method():print("點點點")return ui_responsedef test_web():assert expected_response == browser_method()

在這種情況下。接口訪問和 Web 操作都是以函數形式存在的,我們直接去測試這個 Python 函數,也是一個單元測試的過程。

因為 pytest 是一個第三方的框架,所以我們先要安裝。安裝方式非常簡單,只需要通過 pip 這個包管理工具安裝就可以了。

pip install -U pytest

安裝完成以后,我們可以向使用上面的那個例子一樣:

  • 第 1 步:定義一個測試函數,這個測試函數通常會調用被測函數。
  • 第 2 步:使用 assert 斷言,assert 后面可以跟任意的 Python 條件表達式。
assert 4 < 5assert "yuze" in "yuze wang"assert isinstance(6, int)

測試用例函數有 2 個注意事項:

  • 函數名稱以 test_ 開頭;
  • 保存測試用例的文件以 test_*.py 的形式或者 *_test.py 的形式。

例行用了以后呢,在命令行當中會顯示 4 個部分的內容:

  • 第 1 個部分,測試用例和通過的結果,
  • 第 2 個部分,失敗用例回溯信息,
  • 第 3 個部分,輸出捕獲信息,
  • 第 4 個部分,總結信息。

在拍 test 當中通過的測試用例,不會有特別詳細的結果,但是這是失敗的測試用例默認會有非常詳細的結果,而且會幫你捕獲錯誤原因。?

?現在我也找了很多測試的朋友,做了一個分享技術的交流群,共享了很多我們收集的技術文檔和視頻教程。
如果你不想再體驗自學時找不到資源,沒人解答問題,堅持幾天便放棄的感受
可以加入我們一起交流。而且還有很多在自動化,性能,安全,測試開發等等方面有一定建樹的技術大牛
分享他們的經驗,還會分享很多直播講座和技術沙龍
可以免費學習!劃重點!開源的!!!
qq群號:485187702【暗號:csdn11】

4、測試夾具(Fixture)是什么?

在測試過程當中,有時你需要提前給你的測試用例去準備一個運行環境。這個測試環境通常來說被稱為測試夾具(Fixture),又被稱為固定裝置、測試固件等。

作者:小溪流
鏈接:https://www.zhihu.com/question/50182320/answer/2293584521
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
?

  • 當你要測試一個電器的時候,你需要提供不同的輸入電壓電流的環境,
  • 當你測試一臺電腦網絡的時候,必須要提供網絡環境,
  • 當你要測試一個手機游戲能否被安裝時,你需要提供一臺手機環境,
  • 當你要測試一個軟件能否登錄的時候,你需要準備用戶名和密碼這樣的用戶環境,
  • 當你要測試一個數據庫能否操作的時候,需要提供數據庫的連接環境。

現在我們來舉一個夾具的例子,我們需要測試一個注冊的函數。這個注冊函數提供兩個參數,第 1 個參數是手機號,第 2 個參數是密碼。注冊函數的邏輯就是對手機號碼和密碼進行校驗,如果通過校驗表示注冊成功,如果不通過表示注冊失敗。

def is_mobile(number: str):if re.search(r"^1[3-9][0-9]{9}$", number):return Truereturn Falsedef register(mobile, password):if is_mobile(mobile) and len(password) >= 6:return "success"return "fail"def test_register():assert "success" == register("13177778888", "123456")

這個測試用例并沒有什么問題,但是它存在優化的空間。一個優化的空間是每個手機號碼都是我們手工生成的,當需要編寫多組數據測試時,會有一點費時間。現在我們可以編寫一個函數,自動生成一個手機號碼,當我有多組數據需要測試的時候,我只需要重復調用生成手機號碼的函數,就可以獲取測試數據。這個生成手機號碼的函數呢,就是一個夾具。

def gen_a_mobile():"""隨機生成 13 開頭的手機號碼。"""random_num = "".join([str(random.randint(1,9)) for i in range(9)])return "".join(["13", random_num])

pytest 提供了一種叫做依賴注入的機制,當一個函數被聲明為夾具的時候,可以在測試函數中傳入這個夾具的名稱,pytest 會自動調用它。

import randomimport pytest@pytest.fixturedef gen_a_mobile():"""隨機生成 13 開頭的手機號碼。"""random_num = "".join([str(random.randint(1,9)) for i in range(9)])return "".join(["13", random_num])def test_register(gen_a_mobile):assert "success" == register(gen_a_mobile, "123456")

pytest 當中的夾具系統非常非常的靈活,后面如果有時間的我專門寫文章跟大家講解夾具系統。

5、數據驅動和參數化

現在我們編寫的函數和測試用例是 1 對 1 的關系,也就是說,當你想測試某個功能場景的時候,你必須要去編寫一個對應的測試函數。當測試的場景越來越多,測試數據越來越復雜的情況下,需要編寫更多的測心率函數,而這些函數的邏輯基本上是重復的。

?

在 pytest 當中可以使用參數化這種測試手段,簡化編寫用例函數的過程。我們并不需要為每一組測試數據單獨去編寫一個測試函數,而是采取多種數據共用一個函數的方式。如果測試操作幾乎一致,可以重復使用這一個函數進行測試。

import pytestcases = [(1, 2, 3),("hello", "world", "hello world"),(1, "world", "1world")]@pytest.mark.parametrize("a,b,expected", cases)def test_add(a, b, expected):assert expected == add(a, b)

在這個例子當中,cases 這個變量存儲了三組測試用例的數據,每一組測試數據用一個元組表示,元組的第 1 個元素代表 a,第 2 個元素代表 B,第 3 個元素代表預期結果。

@pytest.mark.parametrize("a,b,expected", cases) 這一行代碼的意思是說,每一次從 cases 變量當中取出一組測試數據。分別用 a、b 、expected 三個變量接收,然后我們把這三個變量名作為函數的參數傳遞到 test_add 當中,就實現了參數化的過程。

當使用這一種參數化的手段進行測試的時候,測試數據和測試函數是多對一的關系,對于多組測試數據,我們只需要去編寫一個測試函數,極大的提升了代碼編寫效率。

6、測試報告和插件

最后我們來說一下測試報告。pytest 當中的測試報告,通常是以插件的形式生成的,如果你想生成一個 HTML 格式的測試報告,可以先安裝 pytest-html 這個插件。

pip install pytest-html

接下來你需要在運行用例的時候,在 pytest 命令后面加上 --html=<測試報告名稱>.html

pytest --html=report.html

當運行完用例以后,你可以在當前目錄下找到一個 report.html 的文件,打開就可以查看測試報告了。

pytest 之所以成為主流,有很多的原因,其中最重要的一個原因是因為其強大的插件系統。任何一個程序員,只要遵循一些簡單的規范,就可以輕易的編寫插件。后面我們再跟大家深入去研究 pytest 當中的夾具系統,插件系統和鉤子函數這些特性。?

最后感謝每一個認真閱讀我文章的人,看著粉絲一路的上漲和關注,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走!?希望能幫助到你!【100%無套路免費領取】

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

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

相關文章

Sentinel與SpringBoot整合

好的&#xff0c;以下是一個簡單的Spring Cloud整合Sentinel的代碼示例&#xff1a; 首先&#xff0c;在pom.xml中添加以下依賴&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…

swift-基礎

print區別 print(1,2,3, separator: "-", terminator: "\n")//表示用-來分割//1-2-3 //terminator表示用\n作為終止符 var a "a",b "b" print(a b) //ab print("\(a)前面是a變量\(b)后面是b變量")變量 var name "…

Win10系統無法登錄Xbox live的四種解決方法

在Win10系統中&#xff0c;用戶可以登錄Xbox live平臺&#xff0c;暢玩自己喜歡的游戲。但是&#xff0c;有用戶卻遇到了無法登錄Xbox live的問題。接下來小編給大家詳細介紹四種簡單的解決方法&#xff0c;解決后用戶在Win10電腦上就能成功登錄上Xbox live平臺。 Win10系統無法…

Linux編程 文件操作 creat open

文件描述符 文件描述符在形式上是一個非負整數。實際上&#xff0c;它是一個索引值&#xff0c;指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時&#xff0c;內核向進程返回一個文件描述符。 啟動一個進程之后&#xff0c;…

SquareCTF-2023 Web Writeups

官方wp&#xff1a;CTFtime.org / Square CTF 2023 tasks and writeups sandbox Description&#xff1a; I “made” “a” “python” “sandbox” “”“” nc 184.72.87.9 8008 先nc連上看看&#xff0c;只允許一個單詞&#xff0c;空格之后的直接無效了。 flag就在當…

(C)一些題2

1.在 C 語言中&#xff08;以 16位 PC 機為例&#xff09;,5種基本數據類型的存儲空間長度的順序為&#xff08;&#xff09; A . char < int < long int <float < double B . char int < long int<float <double C . char < int < long int …

inux應用開發基礎知識——串口應用編程(十一)

前言&#xff1a; 在Linux系統中&#xff0c;串口設備以文件的形式存在&#xff0c;通常位于/dev目錄下&#xff0c;如ttyS0、ttyUSB0等。這些設備文件可以用于讀取和寫入數據。要使用串口設備&#xff0c;需要打開相應的設備文件。在打開串口時&#xff0c;可以使用O_RDWR選項…

哈夫曼樹你需要了解一下

哈夫曼樹介紹哈夫曼數特點哈夫曼應用場景哈夫曼構建過程哈夫曼樹示例拓展 哈夫曼樹介紹 哈夫曼樹&#xff08;Huffman Tree&#xff09;是一種特殊的二叉樹&#xff0c;也被稱為最優二叉樹。在計算機科學中&#xff0c;它是由權值作為葉子節點構造出來的一種二叉樹。哈夫曼樹的…

05 取樣器(BeanShell和JSR223 Sampler)

一、取樣器作用 1、取樣器可以理解為Jmeter的橋梁&#xff0c;或者是Jmeter的加工廠&#xff1b; 2、Jmeter使用過程中&#xff0c;經常有些數據不能直接使用&#xff0c;需要加工后才能使用&#xff1b;這樣就用到了取樣器&#xff1b;但是這里存在問題&#xff0c;Jmeter中的…

Differences between package.json and pnpm-lock.yaml

1.pnpm-lock.yaml 是pnpm包管理工具生成的確保依賴包的版本在所有的環境里面都相同對依賴包的任何操作都會更新在該文件中&#xff0c;因此&#xff0c;需要確保提交到代碼倉庫中。包含了解析的依賴項和版本號。如下圖&#xff1a; 2.package.json 列出應用所需的依賴和元數…

批量修改文件名

原理&#xff1a; 利用 bat 的 REN 舊名字 新名字 命令 第一步&#xff1a; 【CtrlA】選中所有文件&#xff0c;按下【Shift】鍵右鍵任一文件夾彈出窗口選擇【復制為路徑】 第二步&#xff1a; 使用Excel技巧構造出 REN 舊名字 新名字 第三步&#xff1a; 用拼接好的命令…

【黑馬甄選離線數倉day01_項目介紹與環境準備】

1. 行業背景 1.1 電商發展歷史 電商1.0: 初創階段20世紀90年代&#xff0c;電商行業剛剛興起&#xff0c;主要以B2C模式為主&#xff0c;如亞馬遜、eBay等 ? 電商2.0: 發展階段21世紀初&#xff0c;電商行業進入了快速發展階段&#xff0c;出現了淘寶、京東等大型電商平臺&a…

(swjtu西南交大)數據庫實驗(數據庫需求分析):音樂軟件數據管理系統

實驗內容&#xff1a; 數據庫需求分析&#xff1a;各用戶組需求描述&#xff0c;繪出數據流圖&#xff08;詳細案例參見教材p333~p337&#xff0c;陶宏才&#xff0c;數據庫原理及設計&#xff0c;第三版&#xff09;&#xff1b; 一、選題背景 近年來&#xff0c;“聽歌”逐…

Ajax入門-Express框架介紹和基本使用

電腦實在忒垃圾了&#xff0c;出現問題耗費了至少一刻鐘time&#xff0c;然后才搞出來正常的效果&#xff1b; 效果鎮樓 另外重新安裝了VScode軟件&#xff0c;原來的老是報錯&#xff0c;bug。。&#xff1b; 2個必要的安裝命令&#xff1b; 然后建立必要的文件夾和文件&…

雷軍:我的程序人生路

今天有朋友發給我一篇我在20年前在BBS上寫的帖子。那還是1996年&#xff0c;我們通過電話線撥號連接到西點BBS上飆帖子玩的年代。那是一個互聯網混沌初開的年代&#xff0c;那是一個BBS和Email幾乎主宰了全部互聯網的年代&#xff0c;那是一個青春的理想和熱血沸騰的年代。 我…

新能源車將突破2000萬輛,漢威科技為電池安全保駕護航

近年來&#xff0c;我國新能源汽車銷量持續突破新高。據中汽協數據&#xff0c;1~10月&#xff0c;國內新能源汽車銷量達728萬輛&#xff0c;同比增長37.8%&#xff0c;市場占有率達到30.4%。隨著第四季度車市傳統旺季的到來&#xff0c;新能源消費需求將進一步釋放&#xff0c…

Python小灰灰

系列文章 序號文章目錄直達鏈接表白系列1浪漫520表白代碼https://want595.blog.csdn.net/article/details/1306668812滿屏表白代碼https://want595.blog.csdn.net/article/details/1297945183跳動的愛心https://want595.blog.csdn.net/article/details/1295031234漂浮愛心htt…

【軟件工程師從0到1】- 封裝 (知識匯總)

前言 介紹&#xff1a;大家好啊&#xff0c;我是hitzaki辰。 社區&#xff1a;&#xff08;完全免費、歡迎加入&#xff09;日常打卡、學習交流、資源共享的知識星球。 自媒體&#xff1a;我會在b站/抖音更新視頻講解 或 一些純技術外的分享&#xff0c;賬號同名&#xff1a;hi…

藍橋等考C++組別八級005

第一部分:選擇題 1、C++ L8 (15分) 以下關于break的說法正確的是( )。 A. 只有循環結構里面才可以使用break語句。 B. 程序運行到break語句的時候會暫停,直到用戶按下任意鍵才會繼續執行。 C. 嵌套循環的內層循環里面遇到break的時候,整個嵌套循環結構會立即停止,…

Jenkins擴展篇-流水線腳本語法

JenkinsFile可以通過兩種語法來聲明流水線結構&#xff0c;一種是聲明式語法&#xff0c;另一種是腳本式語法。 腳本式語法以Groovy語言為基礎&#xff0c;語法結構同Groovy相同。 由于Groovy學習不適合所有初學者&#xff0c;所以Jenkins團隊為編寫Jenkins流水線提供一種更簡…