基於Python語言Hamcrest斷言的使用


轉自:https://blog.csdn.net/dou_being/article/details/105344001

 

 

我們通常熟悉的斷言是assert()系列的斷言,但有的時候也不能滿足我們的需求,所以有了更強大的斷言Hamcrest。

一、Hamcrest簡介

Hamcrest源於Java,支持多種語言,是用於編寫匹配器對象的框架,可以更靈活的定義“匹配”規則。Hamcrest 斷言,基於更靈活的 Matchers 斷言方式。

二、Hamcrest安裝

可以使用常用的python打包工具來安裝Hamcrest,也可以在pycharm中安裝,下面以在pycharm中安裝為例。

1.打開pycharm--》Preferences--》Project Interpreter 

2.在搜索框中搜索“hamcrest”,選擇第一個“PyHamcrest”,然后點擊安裝。

 

三、Hamcrest示例Demo


from hamcrest import *
import unittest


class HamcrestTest(unittest.TestCase):
def testEquals(self):
theString = 'Hello Hamcrest'
myString = 'Hello Hamcrest'
assert_that(theString, equal_to(myString))


if __name__ == '__main__':
unittest.main()
 

關於Hamcrest斷言的更多使用,可以參考官網文檔:https://github.com/hamcrest/PyHamcrest。

 

Hamcres API

在python中pyHamcrest屬於第三方庫,使用時需要安裝。

Hamcrest在python中提供的API:

對象

  • equal_to - 匹配相等對象
  • has_length - 長度匹配 len()
  • has_property - 匹配給定名稱的屬性值
  • has_properties - 匹配具有所給定屬性的對象
  • has_string - 匹配字符串 str()
  • instance_of - 匹配對象類型
  • none, not_none - 匹配none或not none
  • same_instance - 匹配相同的對象
  • calling, raises - 封裝一個方法調用並斷言它引發異常

數字

  • close_to - 匹配接近給定的數字值
  • greater_than, greater_than_or_equal_to, less_than, less_than_or_equal_to - 匹配數字順序

文本

  • contains_string - 匹配部分字符串
  • ends_with - 匹配字符串的結尾
  • equal_to_ignoring_case - 匹配完整的字符串但忽略大小寫
  • equal_to_ignoring_whitespace - 匹配完整的字符串,但忽略多余的空格
  • matches_regexp - 使用正則表達式匹配字符串
  • starts_with - 匹配字符串的開頭
  • string_contains_in_order - 按相對順序匹配字符串的各個部分

邏輯

  • all_of - 如果所有匹配器都匹配才匹配,像Java里的&&
  • any_of - - 如果任何匹配器匹配就匹配,像Java里的||
  • anything - 匹配任何東西,如果不關心特定值則在復合匹配器中很有用
  • is_not, not_ -如果包裝的匹配器不匹配器時匹配,反之亦然

序列

  • contains - 完全匹配整個序列
  • contains_inanyorder - 以任何順序匹配整個序列
  • has_item - 只要給定項目在序列中出現則匹配
  • has_items - 如果所有給定項以任意順序出現在序列中則匹配
  • is_in - 在給定順序中如果給定項出現則匹配
  • only_contains - 在給定順序中如果序列的項目出現則匹配
  • empty - 如果序列為空則匹配

字典

  • has_entries - 匹配具有鍵值對列表的字典
  • has_entry - 匹配包含鍵值對的字典
  • has_key - 使用鍵匹配字典
  • has_value - 使用值匹配字典

裝飾器

  • calling - 在延遲中封裝一個可調用對象,在后續的調用行為中匹配
  • raises - 確保延遲調用可以按預期方式引發
  • described_as - 添加一個定制的失敗表述裝飾器
  • is_ - 改進可讀性裝飾器

這些匹配器中的許多參數不僅接受匹配值,還接受另一個匹配器,因此可以組合匹配器以提高靈活性。 例如,only_contains(less_than(5))將匹配每個小於5項目的任何序列。

 

from hamcrest import *

#數字類型
print(0.1*0.1)   #0.010000000000000002
print(assert_that(0.1 * 0.1, close_to(0.01,0.000000000000001)))  #close_to(預期比較的值,數字所對應的值之間最大差值被認為是接近的)
print(assert_that(0.1 * 0.1, greater_than(0.01))) #大於
print(assert_that(0.1 * 0.1, greater_than_or_equal_to(0.01)))  #大於或等於
print(assert_that(0.1 * 0.1, less_than(0.02))) #小於
print(assert_that(0.1 * 0.1, less_than_or_equal_to(0.02)))  #小於或等於

#邏輯
print('***********邏輯*********')
print(assert_that(["a", "b", "c"],all_of(has_items("b", "a"),has_items("c", "a")))) #如果所有匹配器都匹配才匹配,匹配上
print(assert_that(["a", "b", "c"],any_of(has_items("d", "a"),has_items("c", "a")))) #有一個匹配上,就是匹配上
print(assert_that(["a", "b", "c"],is_not("a")))  #如果包裝的匹配器不匹配器時匹配,反之亦然
print(assert_that(["a", "b", "c"],is_not(equal_to("a")))) #如果包裝的匹配器不匹配器時匹配,反之亦然
print(assert_that(["a", "b", "c"],not_(["a", "b"])))  #如果包裝的匹配器不匹配器時匹配,反之亦然
print(assert_that(["a", "b", "c"],anything(1)))  #匹配任何東西,如果不關心特定值則在復合匹配器中很有用

返回結果:

0.010000000000000002
None
None
None
None
None
***********邏輯*********
None
None
None
None
None
None

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM