python代碼測試 vim_用 Hypothesis 快速測試你的 Python 代碼

點擊上方“Python編程時光”,選擇“加為星標”第一時間關注Python技術干貨!

117bc6fd2c3485a4b278b5e4f0051046.png

介紹

無論你使用哪種編程語言或框架,測試都非常重要。Hypothesis是 Python 的一個高級測試庫。它允許編寫測試用例時參數化,然后生成使測試失敗的簡單易懂的測試數據。可以用更少的工作在代碼中發現更多的bug。該測試庫覆蓋了大多數情況,并且確實可以幫助你查找代碼中的錯誤。

這篇文章為展示了如何使用Hypothesis在Python中進行測試,并提供了一些示例。

我們如何區分測試?

在我們開始進行基于屬性的測試之前,我們需要知道測試的一般區別。有不同的分組測試方法,兩種最常見的方法基于測試方法和測試級別。讓我們從大多數人已經聽說的測試級別開始。本質上,存在四個測試級別(盡管人們可能也知道或定義其他級別):

  • 單元測試
  • 集成測試
  • 系統測試
  • 端到端測試

不同測試級別側重專注于不同的事物。單元測試側重于軟件的特定部分或功能。這可以是單個功能或功能的一部分。相反,集成測試側重于通過軟件組件的接口進行協作。系統測試甚至更進一步,可以測試整個系統。

現在,我們將看看存在的各種各樣的測試方法。

最常見和已知的是靜態和動態測試。所謂靜態測試(static testing)就是不實際運行被測軟件,而只是靜態地檢查程序代碼、界面或文檔中可能存在的錯誤的過程。如果軟件或其部分實際執行,我們稱之為動態測試。編寫單元測試和集成測試屬于動態測試。

另一種常見的方法是盒式方法。基本上,它可以分為白盒測試和黑盒測試(以及灰盒測試作為兩者的混合)。白盒測試可驗證程序的內部結構或工作情況。黑盒測試與之相反,在黑盒測試中,應用程序被視為黑盒,并且對其交互進行測試。這意味著在不了解內部實現的情況下測試功能。

什么是基于屬性的測試?

現在,我們快速了解了如何區分測試,您可能會問:什么是基于屬性的測試?

基于屬性的測試技術( Property-based testing),是指編寫對你的代碼來說為真的邏輯語句(即“屬性”),然后使用自動化工具來生成測試輸入(一般來說,是指某種特定類型的隨機生成輸入數據),并觀察程序接受該輸入時屬性是否保持不變。如果某個輸入違反了某一條屬性,則用戶證明程序存在一處錯誤,并找到一個能夠演示該錯誤的便捷示例。

使用Hypothesis進行基于屬性的測試

讓我們舉一個簡單的例子。假設您有兩個函數crement()decrement()。一個示例實現可能如下所示:

#?increment_decrement.py

def?increment(number:?int)?->?int:
????return?number?+?1


def?decrement(number:?int)?->?int:
????return?number?-?1

您可能會為兩者編寫單元測試代碼,如下所示:

#?test_increment_decrement_pytest.py

from?increment_decrement?import?decrement
from?increment_decrement?import?increment

def?test_increment():
????x?=?5
????expected?=?6
????actual?=?increment(x)
????assert?actual?==?expected


def?test_decrement():
????x?=?5
????expected?=?4
????actual?=?decrement(x)
????assert?actual?==?expected

注意:測試代碼是使用pytest框架編寫的。

當然,您可以編寫更多的測試腳本來測試具有不同值的兩個函數,甚至可以對測試進行參數化。但是,最后您將使用預定義的值來測試這兩個功能。

使用基于屬性的測試庫(例如Hypothesis )編寫測試是不同的。在這里,您可以指定要測試的類型以及軟件的工作方式或行為方式。然后該庫根據指定的類型生成隨機值來進行實際測試功能。

讓我們看看如何使用Hypothesis來測試我們的兩個功能。

#?test_increment_decrement_hypothesis.py

from?hypothesis?import?given
import?hypothesis.strategies?as?st

from?increment_decrement?import?decrement
from?increment_decrement?import?increment


@given(st.integers())
def?test_increment(x):
????expected?=?x?+?1
????actual?=?increment(x)
????assert?actual?==?expected


@given(st.integers())
def?test_decrement(x):
????expected?=?x?-?1
????actual?=?decrement(x)
????assert?actual?==?expected

如您所見,這兩個測試腳本都有一個參數xx的值是由Hypothesis使用integers()方法生成的。Hypothesis提供了各種方法。本質上,這些方法對應于內置類型或其他結構,并生成與給定類型匹配的隨機數據。

聽起來不錯,不是嗎?但是,如果我們想測試具有特定值的函數以確保它也可以使用該值怎么辦?Hypothesis提供了一個@example()裝飾器,您可以在其中定義一個值,即使該值不屬于隨機生成的測試數據集,也可以將該值傳遞給相應的函數。

讓我們舉個簡單的例子:

#?div.py

def?div(dividend:?int,?divisor:?int)?->?int:
????return?dividend?//?divisor

我們定義了一個函數div(),該函數接受一個除數和一個被除數并返回兩者的商。請注意,這兩個參數都是整型數據,因此結果也應該是整型數據,我們使用Python的//運算符執行整數除法。

為了測試div()函數,我們創建了一個新的測試文件test_div.py并編寫了一個名為test_div()的測試腳本。

#?test_div.py

from?hypothesis?import?example
from?hypothesis?import?given
import?hypothesis.strategies?as?st

from?div?import?div


@given(dividend=st.integers(),?divisor=st.integers())
def?test_div(dividend,?divisor):
????if?divisor?==?0:
????????expected?=?-1
????else:
????????expected?=?dividend?//?divisor
????actual?=?div(dividend,?divisor)
????assert?actual?==?expected

同樣,我們使用Hypothesisintegers()方法生成除數和被除數的值。我們編寫的測試腳本可能通過也可能不會通過,具體取決于執行時Hypothesis產生的值。為了確保始終將值0傳遞給div()函數,我們將@example(1,0)添加到test_div()函數。因此,即使div()不在隨機生成的數據集中,也至少會用除數的值0調用一次。

如果我們按原樣運行測試腳本,則test_div()將始終失敗。因此,讓我們修改div()函數來處理這種情況并使測試通過:

#?div.py

def?div(dividend:?int,?divisor:?int)?->?int:
????if?divisor?==?0:
????????return?-1
????return?dividend?//?divisor

概要

本文主要講了什么是基于屬性的測試以及為什么有用。此外,您快速瀏覽了Hypothesis庫,該庫使您可以編寫基于屬性的測試并與pytest測試一起執行。

文末福利

明哥整理了?21 張 Python 代碼速查表,每一張都是國外的大師總結的,非常實用 ~

d12338f8b848ae8f9afe20366060d31d.png

還有?2 張高清的?PyCharm 快捷鍵一覽圖,一張?Windows?,一張?Mac,放在桌面上,需要的時候打開一查,非常方便。。

01dd155ab72a9b16f4f5603545527fd0.png

怎么獲取呢?

3c0c4828ed3e2f58cb1e9a9431b1e1b5.png

添加明哥微信,備注 "速查表" 和 "快捷鍵" 獲取

- EOF -

推薦閱讀??點擊標題可跳轉

求你了,別再用?print?調試代碼了

GitHub 捍衛開發者!重新上架 7.2 萬星開源項目 youtube-dl

使用 Python 打印漂亮的表格,這兩項基本功你可會?

別這樣直接運行Python命令,否則電腦等于“裸奔”

5 個 Git 工作流,改善你的開發流程

8 個 Jupyter Notebook Tips,隱藏得太深了

用 Python 讀取資源文件?這個技巧保你漲姿勢

26a929eec0e5fa01be87ada32e463ef9.png

覺得本文對你有幫助?請分享給更多人

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

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

相關文章

Mac 下 CMake 的配置與使用

文章目錄安裝與配置編譯單個源文件編譯前的準備開始編譯編譯多個源文件多個源文件在同一目錄下多個源文件在不同目錄下math 目錄下的 CMakeLists.txt根目錄的 CMakeLists.txtoption 選項導入外部庫本地導入(find_package)外部導入(FetchConte…

五軸編程_沙井萬豐數控數控編程五軸編程那個軟件好用

沙井萬豐數控數控編程五軸編程那個軟件好用設計需要掌握很高很全面的知識和技能,模具做的好,產品質量好,模具結構合理,生產效率高,工廠效益好。正因如此,模具技術工在外打工的工資都非常的高。少則每月幾千…

Linux學習:第二章-Linux安裝

一虛擬機使用 VMware主要特點: 1、不需要分區或重新開機就能在同一臺PC上使用兩種以上的操作系統 2、本機系統可以與虛擬機系統網絡通信 3、可以設定并且隨時修改虛擬機操作系統的硬件環境 二安裝方式 圖形安裝:直接回車 字符安裝:linux tex…

keil3如何放大字體_國潮海報不會做?送你國風字體+圖案筆刷+PSD素材+包裝樣機...

有很多朋友都問帶魚,國潮風的海報到底應該怎么做呢?首先你要知道什么是國潮風:國潮風就是現代文化和古代文化的碰撞,是年輕人的態度!那么應該如何構圖如何設計呢?如何配色如何搭配字體呢?這些方…

Google 開源項目風格指南學習筆記——C++篇

文章目錄前言0. 縮寫名詞解釋1. 頭文件1.1. Self-contained 頭文件1.2. 頭文件保護1.3. 前置聲明1.4 內聯函數1.5. #include 的路徑及順序2. 作用域2.1. 命名空間2.2. 非成員函數、靜態成員函數和全局函數2.3. 局部變量2.4. 靜態和全局變量3. 類3.1. 構造函數的職責3.2. 隱式類…

hiveserver2啟動不起來_給愛車配個充電寶,70邁汽車應急啟動電源,讓你遠離搭電小廣告...

說到汽車應急啟動其實我有切身的痛,在哈爾濱零下35的嚴冬,晚上帶著女神吃完飯,高高興興地吃完以后一上車,發現電瓶被凍沒電了,天知道當時有多尷尬。馬上叫了保險公司過來給搭電,結果在飯店從晚上8點一直等到…

Windows 下 VS 配置 OpenGL 環境

文章目錄前言獲取 GLFW打開 VS前言 感謝B站同學搬運YouTube上的教學視頻。 獲取 GLFW 從官網上下載GLFW macOS下64位二進制文件 打開 VS 新建解決方案 OpenGL test,并在解決方案中新建文件夾 Dependencies: 從下載好的 glfw 文件夾中找到最新版鏈接…

ubuntu 網卡雙網口 配置_無線網卡m2 ngff keya keye、minipcie接口改轉多口有線網卡實現軟路...

小型主板及筆記本中的無線網卡m2ngffkeyakeye接口(CNVI除外)通過m2ngffkeyae轉接pcie1x轉接板,或者無線網卡的minipcie接口,通過minipcie轉接pcie1x轉接板可以改裝有線網卡板卡,來實現軟路由功能。m2ngffkeyae轉接pcie…

OpenGL | 通過繪制一個三角形來入門 OpenGL 圖形渲染管線

文章目錄前言什么是 OpenGl ?回顧openGL 的 Object顯存結構工作階段通過頂點緩沖對象將頂點數據初始化至緩沖中標準化設備坐標頂點緩沖對象 VBOglGenBuffersglBindBufferglBufferData建立了一個頂點和一個片段著色器著色器是什么?為什么需要使用著色器&a…

javascript特效_如何在網頁添加鼠標點擊特效

經常有同學問我怎么做到的,本論壇屬于DZ當然用的是插件啦。偶然在網上找到一個關于wordpress的特效代碼,分享給大家。WordPress 添加鼠標點擊特效實際上這種教程在網上搜索一下有一大堆,已經是各大博主玩爛的東西了。不過既然給自己的博客加上…

Android |雙鎖單例模式中使用Context如何避免內存泄露的 Warning 提示

文章目錄問題解決方法拓展問題 在Android開發中,經常會將工具類以單例模式的方法實現,而工具類中又總不可避免的用到 Context ,例如: public class MySingleton {private static volatile MySingleton instance;private final C…

android nio debug模式正常 release包crash_Flutter包大小治理上的探索與實踐

Flutter作為一種全新的響應式、跨平臺、高性能的移動開發框架,在性能、穩定性和多端體驗一致上都有著較好的表現,自開源以來,已經受到越來越多開發者的喜愛。但是,Flutter的引入往往帶來包體積的增大,給很多研發團隊帶…

Linux學習:第三章-Linux常用命令-1

提示符: [rootlocalhost ~]# [登錄用戶名主機名 當前所在目錄]提示符 ~家目錄 /root /home/aa 提示符: #超級用戶 $普通用戶 一 linux命令的格式1、命令 [選項] [參數]lslist顯示目錄下內容 ①命令名稱:ls 命令英文原意:list 命令…

Leetcode每日一題:使括號有效的最少添加(括號匹配)

文章目錄題目解析貪心趣解題目 只有滿足下面幾點之一,括號字符串才是有效的: 它是一個空字符串,或者它可以被寫成 AB (A 與 B 連接), 其中 A 和 B 都是有效字符串,或者它可以被寫作 (A),其中 …

yolov5搭建環境_Yolov5環境配置和訓練私有數據,YOLOv5,以及,私人

1.使用anaconda安裝python3.8的環境conda create -n yolo5 python3.8#anaconda下載地址: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/2.安裝pytorch1.6 torchvision0.7conda install pytorch1.6 torchvision0.7 cudatoolkit10.13.安裝相關包pip install opencv-py…

sam格式的結構和意義_各種格式的練字本,對寫字真有幫助嗎

圖片來源于筆勢通各種格式的練字本現在越來越多,目的主要是便于學生把握好筆畫的位置和布局,從而把整個字的結構處理好,常見的有米字格,回宮格等。這些練字本對于初學者來說肯定是有幫助的,特別是低年級學生。當然隨著…

硬件結構圖_那曲地表水電子除垢儀結構圖

那曲地表水電子除垢儀結構圖水處理設備也應斷電停止使用,系統長期停止運行或季節性停止運行,在系統停止運行前,在水中投加適量緩蝕劑,并采取滿水濕保護的措施,以減小腐蝕,保護系統。開啟進水閥檢查無誤后電…

dtm文件生成等高線 lisp_南方cass如何用圖面高程點生成等高線

展開全部1、首先點擊cass菜單欄中的等高線菜單下的建立DTM,彈出對話框。可以有兩種方式建32313133353236313431303231363533e58685e5aeb931333431356665立DTM,由數據文件生成或者由圖面高程點生成,第一種直接在對話框中選擇相應的數據文件&am…

postgresql興建用戶_PostgreSQL 12.2, 11.7, 10.12, 9.6.17, 9.5.21, 和 9.

### **譯者:朱君鵬**### **發表于2020年2月13日 作者:PostgreSQL全球開發小組**#### 全球開發小組已發布的更新涵蓋所有支持的版本,包括12.2,11.7,10.12,9.6.17,9.5.21和9.4.26。該版本修正了一…

Linux學習:第三章-Linux常用命令-2

一文件操作命令 1)創建空文件或修改文件時間 touch文件名 命令名稱:touch 命令所在路徑:/bin/touch 執行權限:所有用戶 2)刪除 rm-rf文件名 -r刪除目錄 -f強制 命令名稱:rm 命令英文原意:remove…