单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试
單元測(cè)試junit參數(shù)
大多數(shù)人都知道單元測(cè)試的重要性和好處,以及為什么要在進(jìn)行的項(xiàng)目中使用它們。 而且,大多數(shù)人不喜歡在他們從事的項(xiàng)目中編寫單元測(cè)試。 TDD的人當(dāng)然處于另一面,但根據(jù)我的經(jīng)驗(yàn),他們?cè)贗T行業(yè)中是少數(shù)派。
說到我,我和大多數(shù)人在一起:-)。 我知道進(jìn)行單元測(cè)試的好處,以及如何提高代碼和項(xiàng)目的質(zhì)量。 我知道為什么要投資他們,但是我對(duì)編寫單元測(cè)試并不滿意,這不是讓我徹夜難眠的原因。 我更喜歡創(chuàng)建出色的軟件并解決復(fù)雜的問題,然后編寫單元測(cè)試。 這就是為什么我一直在尋找可以幫助我獲得更多,更好的單元測(cè)試的東西,而這方面的工作卻少了很多,因?yàn)樽詈竽鷳?yīng)該在項(xiàng)目中進(jìn)行單元測(cè)試。
Junit Params是可以幫助您以更少的時(shí)間編寫更好的單元測(cè)試的事情之一。
您為什么要關(guān)心Junit Params?
讓我們想象一下,我們有一個(gè)簡(jiǎn)單的類Person,它具有名字和姓氏。 業(yè)務(wù)要求是,姓氏和名字不能為null或空字符串。
我們可以結(jié)束一些與此類相似的課程
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ù)期工作,并且考慮到所有極端情況。
我們當(dāng)然希望使用單元測(cè)試來涵蓋所有可能性,但是如果您考慮一下,我們將有很多重復(fù)的代碼,在這些代碼中,我們會(huì)測(cè)試所有可能性的名字,然后是姓氏,然后是所有組合,依此類推我們要涵蓋所有邊緣情況。 在這個(gè)簡(jiǎn)單的類中,我們將在單元測(cè)試中得到更多的代碼,然后在業(yè)務(wù)邏輯中得到更多的代碼。
讓我們看看JUnit Params如何幫助我們。
初始化設(shè)置
為了使用Junit Params,您只需像添加其他任何庫(kù)一樣添加依賴項(xiàng)
<dependency> <groupId>pl.pragmatists</groupId> <artifactId>JUnitParams</artifactId> <version> 1.1 . 1 </version> <scope>test</scope> </dependency>之后,我們可以在單元測(cè)試中開始使用JUnit Params
使用JUnit參數(shù)進(jìn)行JUnit測(cè)試
現(xiàn)在讓我們使用JUnit Params編寫一些單元測(cè)試。
創(chuàng)建簡(jiǎn)單的測(cè)試類PersonTest并添加@RunWith( JUnitParamsRunner.class )
@RunWith (JUnitParamsRunner. class ) public class PersonTest { ....... }現(xiàn)在,我們可以編寫簡(jiǎn)單的單元測(cè)試來驗(yàn)證我們的類。 讓我們先檢查一下是否一切都很好,如果我們將null用作名字
@Test (expected = RuntimeException. class ) public void fistNameNull() { Person p = new Person( null , "dummyLast" ); }關(guān)于JUnit Params的偉大之處在于,我們?nèi)匀豢梢跃帉憳?biāo)準(zhǔn)的單元測(cè)試,并將它們與JUnit Params結(jié)合起來。
為了在此單元測(cè)試中利用JUnit參數(shù),我只需要添加具有適當(dāng)值的@Parameters ,然后它將看起來像這樣
@Test (expected = RuntimeException. class ) @Parameters ({ "" , " " , " " , " " }) public void fistNameParamaters(String param) { Person p = new Person(param, "dummyLast" ); }使用此代碼,我進(jìn)行了4個(gè)單元測(cè)試,以驗(yàn)證代碼中的值“”,“”,“”,“”和“”。
這已經(jīng)顯示了JUnit參數(shù)是多么有用,因?yàn)槟痪帉懥艘粋€(gè)單元測(cè)試,并且它將針對(duì)您參數(shù)的所有不同可能性執(zhí)行該測(cè)試。
將參數(shù)傳遞給多個(gè)輸入?yún)?shù)
如果我們要傳遞輸入值(名字和姓氏)的參數(shù),會(huì)發(fā)生什么情況。 在這種情況下,我們會(huì)做這樣的事情
@Test (expected = RuntimeException. class ) @Parameters ({ " " , " " , // firstName, lastName " " , "" , " " , " " , " " , " " }) public void fistNameLastNameParamaters(String first, String last) { Person p = new Person(first, last); }由于有兩個(gè)輸入?yún)?shù),因此提供的值將一分為二并用作輸入。
如您所見,為多個(gè)參數(shù)提供輸入非常容易,盡管通過這種方式我們需要提供要測(cè)試的所有組合。
以用戶友好的方式將參數(shù)傳遞給多個(gè)輸入?yún)?shù)
如果說老實(shí)話,盡管上面的測(cè)試對(duì)于多個(gè)輸入?yún)?shù)可以很好地工作,但是它不是非常用戶友好的。 讓我們?cè)谙乱粋€(gè)示例中修復(fù)該問題
@Test (expected = RuntimeException. class ) @Parameters ({ " | " , " |" , " | " , " | " }) public void fistNameLastNameParamaters2(String first, String last) { Person p = new Person(first, last); }現(xiàn)在,可以更清楚地知道在每次迭代中哪個(gè)值將用于哪個(gè)輸入?yún)?shù)。
使用非字符串值作為輸入?yún)?shù)
到目前為止,所有參數(shù)都是字符串。 如果我們的輸入?yún)?shù)不是String或容易從String轉(zhuǎn)換為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
單元測(cè)試junit參數(shù)
總結(jié)
以上是生活随笔為你收集整理的单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 铠侠宣布推出“符合 5.1 版规范”的下
 - 下一篇: 工信部:1-8 月我国软件业务收入 75