使用Junit参数在更短的时间内编写更好的单元测试
大多數(shù)人都知道單元測試的重要性和好處,以及為什么要在進行的項目中使用它們。 而且,大多數(shù)人不喜歡在他們從事的項目中編寫單元測試。 TDD的人當然處于另一面,但根據(jù)我的經(jīng)驗,他們在IT行業(yè)中是少數(shù)派。
說到我,我和大多數(shù)人在一起:-)。 我知道為什么進行單元測試會很好,以及如何提高代碼和項目的質(zhì)量。 我知道您為什么應該投資于它們,但是我對編寫單元測試并不滿意,這不是讓我徹夜難眠的原因。 我更喜歡創(chuàng)建出色的軟件并解決復雜的問題,然后編寫單元測試。 這就是為什么我一直在尋找可以幫助我獲得更多,更好的單元測試的東西,而這方面的工作卻少了很多,因為最后您應該在項目中進行單元測試。
Junit Params是可以幫助您以更少的時間編寫更好的單元測試的那些事情之一。
您為什么要關心Junit Params?
讓我們想象一下,我們有一個簡單的類Person,它具有名字和姓氏。 業(yè)務要求是,姓氏和名字不能為null或空字符串。
我們可以結束與這一課類似的課
public class Person { private final String firstName; private final String lastName; public Person(String first, String last) { if (first == null || first.trim().isEmpty() || last == null || last.trim().isEmpty() ) { throw new RuntimeException( "bad input" ); } this .firstName = first; this .lastName = last; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } }下一步是確保代碼按預期工作,并且考慮了所有極端情況。
我們當然希望使用單元測試來涵蓋所有可能性,但是如果您考慮一下,我們將有很多重復的代碼,在這些代碼中,我們會測試所有可能性的名字,然后是姓氏,然后是所有組合,依此類推我們要涵蓋所有邊緣情況。 在這個簡單的類中,我們將在單元測試中得到更多的代碼,然后在業(yè)務邏輯中得到更多的代碼。
讓我們看看JUnit Params如何幫助我們。
初始化設定
為了使用Junit Params,您只需像添加其他任何庫一樣添加依賴項
<dependency> <groupId>pl.pragmatists</groupId> <artifactId>JUnitParams</artifactId> <version> 1.1 . 1 </version> <scope>test</scope> </dependency>之后,我們可以開始在單元測試中使用JUnit Params
使用JUnit參數(shù)進行JUnit測試
現(xiàn)在讓我們使用JUnit Params編寫一些單元測試。
創(chuàng)建簡單的測試類PersonTest并添加@RunWith( JUnitParamsRunner.class )
@RunWith (JUnitParamsRunner. class ) public class PersonTest { ....... }現(xiàn)在,我們可以編寫簡單的單元測試來驗證我們的類。 讓我們先檢查一下是否一切都很好,如果我們將null用作名字
@Test (expected = RuntimeException. class ) public void fistNameNull() { Person p = new Person( null , "dummyLast" ); }關于JUnit Params的偉大之處在于,我們?nèi)匀豢梢跃帉憳藴实膯卧獪y試,并將其與JUnit Params結合使用。
為了在此單元測試中利用JUnit參數(shù),我只需要添加具有適當值的@Parameters ,然后它將看起來像這樣
@Test (expected = RuntimeException. class ) @Parameters ({ "" , " " , " " , " " }) public void fistNameParamaters(String param) { Person p = new Person(param, "dummyLast" ); }使用此代碼,我進行了4個單元測試,以驗證代碼中的值“”,“”,“”,“”和“”。
這已經(jīng)顯示了JUnit參數(shù)是多么有用,因為您只編寫了一個單元測試,并且它將針對您參數(shù)的所有不同可能性執(zhí)行該測試。
將參數(shù)傳遞給多個輸入?yún)?shù)
如果我們要傳遞輸入值(名字和姓氏)的參數(shù),會發(fā)生什么情況。 在這種情況下,我們會做這樣的事情
@Test (expected = RuntimeException. class ) @Parameters ({ " " , " " , // firstName, lastName " " , "" , " " , " " , " " , " " }) public void fistNameLastNameParamaters(String first, String last) { Person p = new Person(first, last); }由于有兩個輸入?yún)?shù),因此將提供的值一分為二并用作輸入。
如您所見,為多個參數(shù)提供輸入非常容易,盡管通過這種方式,我們需要提供要測試的所有組合。
以用戶友好的方式將參數(shù)傳遞給多個輸入?yún)?shù)
如果說老實話,盡管上面的測試對于多個輸入?yún)?shù)可以很好地工作,但是它不是非常用戶友好的。 讓我們在下一個示例中修復該問題
@Test (expected = RuntimeException. class ) @Parameters ({ " | " , " |" , " | " , " | " }) public void fistNameLastNameParamaters2(String first, String last) { Person p = new Person(first, last); }現(xiàn)在,可以更清楚地知道每次迭代中哪個值將用于哪個輸入?yún)?shù)。
使用非字符串值作為輸入?yún)?shù)
到目前為止,所有參數(shù)都是字符串。 如果我們的輸入?yún)?shù)不是String或容易從String轉換為String的東西,例如null值,該怎么辦。
在這種情況下,我們可以使用命名參數(shù)
@Test (expected = RuntimeException. class ) @Parameters (named = "emptyStrings" ) public void namedParamaters(String first, String last) { Person p = new Person(first, last); } @NamedParameters ( "emptyStrings" ) private Object[] emptyStrings() { return new Object[]{ new Object[]{ null , "" }, new Object[]{ "" , null }, new Object[]{ " " , " " }, new Object[]{ " " , " " } }; }參考
這篇文章中提到的代碼示例可以在此網(wǎng)址上找到
- https://github.com/vladimir-dejanovic/junit-params-blog-examples
翻譯自: https://www.javacodegeeks.com/2019/02/writing-unit-tests-time-junit-parameters.html
總結
以上是生活随笔為你收集整理的使用Junit参数在更短的时间内编写更好的单元测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 边锋三国杀安卓版体验服(边锋三国杀安卓版
- 下一篇: 超强ddos攻击器(最强ddos攻击能抗