AssertJ

AssertJ_初探斷言的日常

黃若雯 2020/11/25 08:00:00
1457

AssertJ是什麼

AssertJ 是一個編寫斷言的套件庫、JAVA 流式斷言器。什麼是流式,常見的斷言器一條斷言語句只能對實際值斷言一個校驗點,而流式斷言器,支援一條斷言語句對實際值同時斷言多個校驗點。

AssertJ 為編寫斷言帶來了流暢寫法(fluent),有用過Java 8的應該會知道類似的流暢或鍊式寫法,並且語法跟自然語言相近,對於編寫測試時力求容易閱讀及維護這之上提供了相當大的改進。而且透過IDE的代碼自動補全功能,使得編寫斷言更加容易。

AssertJ的特點

–可讀性高

–流式驗證

更直覺的判斷方法

可自定義斷言

為什麼需要AssertJ

在設計自動化cases時,遵守的核心原則是3A(Arrange-> Actor ->Assert)原則; 斷言工具的強大直接影響到用例的執行效率。

AssertJ的基本運行原理

「Assertions」是AssertJ的主要操作類,Assertions提供了靜態的斷言方法- assertThatAssertions以「重載」的方法針對不同的類型提供不同版本的assertThat方法。

「assertThat」 表達式針對了不同的參數類型提供了對應的後續操作,使斷言表達式使用起來像類型內生的表達式;assertThat支持了所有基本類型,如int、double、string、Path、InputStream、Map及Iterable。

例如針對boolean類型assertThat方法如下:

assertThat方法返回BooleanAssert對象,BooleanAssert提供了許多針對boolean類型的斷言方法。同理,int類型返回IntegerAssert對象,File類型返回FileAssert對象。所有assertThat方法返回對象類型都繼承AbstractAssert抽象類。

AbstractAssert」實現了Assert接口,是AssertJ框架的核心,代表斷言操作的抽象。AbstractAssert中定義了一系列通用方法,不同類型通過繼承AbstractAssert實現自身的Assert類并提供各自類型的相關操作。

AbstractObjectAssert Object 的斷言抽象類
AbstractComparableAssert 基本數據類型的斷言抽象類,如int、long、double、float、char
AbstractArrayAssert 數組類型的斷言抽象類,如BooleanArray、ByteArray、IntArray
AbstractIterableAssert 迭代器類型斷言抽象類

 

動手試做AssertJ

AssertJ 加入 pom.xml

AssertJ的基本用法

1. assertThat(actual) // 我斷言(執行實際結果)

2..isEqualTo(expected) // 會等於(預期結果)

使用3A編寫測試案例:驗證 8+10=18

1. 先建立一個Calculator類別。

2. Arrange初始化,建立Calculator物件,準備方法參數number1, number2,以及預期結果。

3. Act調用calculator的add方法。

4. Assert驗證結果。

5. 執行test run,可以看到測試案例如果符合預期則綠燈通過,反之,可透過修改number2 驗證是否改出現紅燈。

  –綠燈通過。

  

  –紅燈不通過。

  

鏈式校驗 Chaining of assertions

日期驗證 AssertJ vs JUnit Assert

  AssertJ對於日期驗證更直覺,不須再物件自己呼叫方法,直接使用AssertJ提供的日期判斷即可。

驗證List

  直接使用Lambda搭配Prediction的方式撰寫。

   – 情境一:綠燈。

   

  – 情境二:將List的"cat"改為"fish",呈現紅燈以及清楚顯示驗證錯誤訊息。

  

Conclusion

AssertJ 提供了流式判斷以外,還針對了不同型別的物件做特殊的判斷API(日期/Collection),讓使用者可以單純使用AssertJ就能快速及流暢地寫完驗證,不需撰寫過多冗長的判斷式及迴圈。也提供了豐富的斷言集合,錯誤訊息非常精確。此篇簡單介紹了一些AssertJ常用的用法,AssertJ還有提供很多驗證方式等著大家探索。

 

參考資料來源

AssertJ 比基本斷言更好用的流式驗證(https://medium.com/bucketing/java-test-4-%E5%96%AE%E5%85%83%E6%B8%AC%E8%A9%A6-assertj-%E6%AF%94%E5%9F%BA%E6%9C%AC%E6%96%B7%E8%A8%80%E6%9B%B4%E5%A5%BD%E7%94%A8%E7%9A%84%E6%B5%81%E5%BC%8F%E9%A9%97%E8%AD%89-3bec4864e0f7)

AssertJ入門與用3A原則寫測試案例(https://ithelp.ithome.com.tw/articles/10193175)

AssertJ源碼初探(https://www.twblogs.net/a/5b8ea4cf2b7177188346a61a?lang=zh-cn)

Testing with AssertJ assertions - Tutorial(https://www.vogella.com/tutorials/AssertJ/article.html)

 

 

黃若雯