junit test suite filtering test cases
In deze zelfstudie wordt besproken wat een JUnit-testsuite is, hoe u een testsuite maakt en testcases filtert in JUnit 4 versus JUnit 5:
In onze vorige zelfstudie hebben we geleerd hoe u bepaalde testcases kunt overslaan tijdens de uitvoering. We hebben ook geleerd over verschillende annotaties die in JUnit 4 en JUnit 5 worden gebruikt om dit te doen.
In deze tutorial leren we:
- Wat is een testsuite?
- Hoe maken we een testsuite door meerdere testcases in een groep te plaatsen en de suite uit te voeren met de JUnitCore-klasse?
Bezoek hier voor de exclusieve JUnit Training Tutorial Series.
Wat je leert:
- JUnit Test Suite
- Testsuite filteren - JUnit 4 versus JUnit 5
- Gevolgtrekking
JUnit Test Suite
JUnit 4: @RunWith, @SuiteClasses Annotaties
De tutorial Meerdere manieren om JUnit-tests uit te voeren geïllustreerd hoe u een testsuite maakt in JUnit 4.
De annotaties @Rennen met en @SuiteClasses heeft ons geholpen een testsuite te maken door meerdere JUnit-testklassen te groeperen. Vervolgens riep een runner-bestand met de klasse JUnitCore.runclasses () de uitvoering van de gemaakte testsuite op.
Raadpleeg de genoemde sectie voor alle minutieuze details over de workflow, samen met de feitelijke code voor JUnit 4.
JUnit 5: @RunWith, @SelectClasses, @SelectPackages Annotaties
Het creëren van een testsuite in JUnit 5 is vrij gelijkaardig aan wat we hebben in JUnit 4. Dus, waar is dan het verschil?
# 1) In JUnit 4 , we hebben Suite.class die als parameter wordt doorgegeven aan @Run Met annotatie om het maken van een testsuite te ondersteunen, terwijl JUnit 5 gebruikt dezelfde @RunWith-annotatie maar met de invoerparameter als JUnitPlatform.class in plaats van Suite. Klasse
Dus de regel code in JUnit 5 ziet eruit als @RunWith (JUnitPlatform.class). Dit is de annotatie die bij uw subproject JUnit Platform wordt geleverd.
#twee) In JUnit 4 , we gebruiken @SuiteClasses om meerdere JUnit-klassen te groeperen, gescheiden door een komma in JUnit 5 wij hebben:
- De annotatie @SelectClasses dat is gelijk aan @SuiteClasses in JUnit 4 om meerdere JUnit-klassen te groeperen.
- @SelectPackages annotatie wordt gebruikt om meerdere tests uit het pakket / de pakketten te groeperen. U moet een string-array-waarde invoeren die het pakket vertegenwoordigt dat u wilt opnemen.
Met andere woorden,
- Als u testgevallen uit één pakket wilt groeperen, kunt u dat met JUnit 5 doen.
- Of als u testgevallen uit meerdere pakketten wilt groeperen, ondersteunt JUnit 5 u dat ook. Een opmerking om hier te onthouden is dat de tests onder alle subpakketten van het genoemde pakket ook standaard in de testsuite worden opgenomen.
JUnit 5: verschillende scenario's / voorbeelden
Een testsuite maken waarin meerdere testklassen zijn gegroepeerd
Het fragment van de code wordt hieronder weergegeven:
Een testsuite maken voor een enkel pakket
Het fragment van de code wordt hieronder weergegeven:
Notitie
- Zeggen demo.tests pakket heeft een subpakket demo.tests.subtests.
- De code @SelectPackages ({'demo.tests'}) zal alle tests onder het subpakket ook opnemen in de testsuite; standaard.
- Als je het had gezegd @SelectPackages ({'demo.tests.subtests'}) , de testcases onder het subpakket demo.tests.subtests wordt alleen in de testsuite opgenomen, terwijl de tests uit het bovenliggende pakket, d.w.z. demo.tests zou niet worden opgenomen.
Een testsuite maken voor meerdere pakketten
Het codefragment voor het maken van een testsuite voor meerdere pakketten gescheiden door een komma in JUnit 5 - ziet eruit als hieronder:
Testsuite filteren - JUnit 4 versus JUnit 5
Soms moeten we testgevallen eruit filteren en een bepaalde reeks tests uitvoeren, afhankelijk van onze behoeften. Er kan bijvoorbeeld een reeks tests worden geïdentificeerd voor regressietests, een afzonderlijke set voor het testen van eenheden en een afzonderlijke reeks testcases voor rooktesten.
We moeten testcases uitsluiten of opnemen in bepaalde pakketten, klassen of categorieën. Het filteren of taggen van de tests uit een enkel pakket is de enige optie met JUnit4.
In vergelijking met JUnit 4 wordt JUnit 5 geleverd met een goede set functies ter ondersteuning van deze behoefte om uw testgevallen te filteren uit het enkele pakket of uit meerdere pakketten en subpakketten volgens uw veranderende vereisten.
JUnit 4 - @Category, @IncludeCategory, @ExcludeCategory
De testcases in JUnit 4 kunnen worden onderverdeeld in verschillende categorieën. Deze categorieën kunnen worden uitgesloten of opgenomen tijdens het uitvoeren van uw testsuite. De annotaties @Category, @IncludeCategory en @ExcludeCategory worden ondersteund vanaf JUnit 4.12 en hoger.
Stappen op hoog niveau om de filters te maken op basis van de categorie of categorieën zijn als volgt:
# 1) Maak een markeringsinterface die een rol speelt in de categorie.
#twee) Annoteer de testmethoden van de klassen die in de SuiteClasses moeten worden opgenomen met @Categorie en de categorienaam.
# 3) Gebruik annotatie in het testsuite-bestand @IncludeCategory met de categorienaam om de tests op te nemen die tot een specifieke categorie behoren.
# 4) Gebruik annotatie in het testsuite-bestand @ExcludeCategory met de categorienaam om ze uit te sluiten.
# 5) De @Category-annotatie kan ook op testniveau of klassenniveau worden gebruikt. Als de annotatie op testniveau wordt toegepast, wordt die specifieke test getagd met de gegeven categorie, terwijl als de annotatie op klassenniveau is, alle tests binnen de klasse worden getagd met de gegeven categorie.
Laten we wat meer details bekijken om de praktische implementatie van het categoriseren van de tests en het filteren voor uitvoering te begrijpen:
Stap 1:
We beginnen met het maken van een marker interface dat zal de rol spelen van een categorie voor testmethoden. Hier maken we een categorie met de naam Hoofdstuk toets De code is heel simpel. Raadpleeg de onderstaande code.
Code voor UnitTest.java
Stap 2:
We zullen de categorie markeren bij de testmethode niveau in de klas JUnitTestCase1.java Om de testcase junitMethod1 () toe te voegen aan de categorie UnitTest, moeten we de testmethode annoteren met @Category (UnitTest.class)
Hiermee wordt de testmethode toegevoegd aan de categorie UnitTest. De andere testmethoden (indien aanwezig) worden niet aan de categorie getagd, tenzij de methoden zijn geannoteerd met een categorie.
Om @Category-annotatie in onze code te laten werken, moeten we het pakket importeren org.junit.experimental.categories.Category
Het codefragment van JUnitTestCase1.java:
Als alternatief kan een testmethode ook tot meerdere categorieën behoren Bijv. @Category (UnitTest.class, SmokeTest.class)
Stap 3:
Ik zou nu de categorie markeren op klasniveau in de klas JUnitTestCase2.java Dezelfde instructie die in de vorige stap op het testmethode-niveau is toegevoegd, wordt ook in het huidige klassenbestand toegevoegd.
Merk op dat we hier de verklaring op klasniveau zullen toevoegen. Als u dit doet, behoren alle testmethoden in het bestand tot het Hoofdstuk toets Categorie.
Het codefragment van JUnitTestCase2.java:
Stap 4:
bubble sort implementatie c ++
Nu onze vereiste testcases zijn gecategoriseerd in de categorie UnitTest, zullen we nu zien hoe we ze aan de testsuite kunnen toevoegen door ze uit te filteren op basis van de categorie. We zullen bepaalde codewijzigingen aanbrengen in het JUnitTestSuite.class om dit aan te tonen.
- Categories.class wordt als parameter doorgegeven aan de @RunWith-annotatie.
- @ Suite.SuiteClasses neemt de reeks testklassen.
- De annotatie @ Categories.IncludeCategory heeft UnitTest.class nodig als parameter.
- Deze verklaring helpt ons om de hele suite te filteren en alleen die testcases uit te voeren uit de suite die tot de categorie behoort.
- Categories.class heeft pakket nodig org.junit.experimental.categories.Categories worden geïmporteerd.
Het codefragment voor JunitTestSuite.java
De annotatie @ Categories.IncludeCategory kan ook worden geschreven als @IncludeCategory. U kunt ook meerdere interfaces (categorieën) maken en de klasse- / testmethoden annoteren met meerdere categorieën gescheiden door een komma. Het onderstaande voorbeeld filtert de tests uit die behoren tot categorie - Categorie1 en Categorie2.
Voorbeeld: @IncludeCategory ({Category1.class, Category2.class})
Soortgelijke regels gelden @ Categories.ExcludeCategory @ExcludeCategory om de testmethoden in de categorie of categorieën uit te sluiten tijdens de testrun.
JUnit 5 - @IncludeTags, @ExcludeTags, @IncludePackages, @ExcludePackages, @IncludeClassNamePatterns, @ExcludeClassNamePatterns
JUnit 5 wordt geleverd met meerdere benaderingen voor het organiseren en filteren van de testgevallen.
JUnit 5 - @IncludeTags, @ExcludeTags
# 1) Net als JUnit 4 heeft @IncludeCategory en @ExcludeCategory annotaties om het filteren van testgevallen voor uitvoering te ondersteunen.
#twee) JUnit 5 heeft @IncludeTags en @ExcludeTags annotaties om hetzelfde doel te bereiken.
# 3) JUnit 4 verwijst naar de testgevallen die in een specifieke categorie moeten worden georganiseerd, terwijl JUnit 5 verwijst naar het taggen van de testgevallen met een specifieke tag om het filteren van de testgevallen voor uitvoering mogelijk te maken.
Stappen op hoog niveau om de filters te maken op basis van de tags zijn als volgt:
- Annoteer de testmethoden van de pakketten die in de @SelectPackages moeten worden opgenomen met @Label en de door de gebruiker gedefinieerde tagnaam. Een klasse kan verschillende tags hebben voor verschillende testmethoden.
- U kunt @Tag ook op klasniveau annoteren, zodat alle tests in de klas worden getagd.
- Gebruik annotatie in het testsuite-bestand @IncludeTags met de tagnaam om de tests op te nemen die bij een specifieke tag horen.
- Gebruik annotatie in het testsuite-bestand @ExcludeTags met de tagnaam om ze uit de testsuite uit te sluiten.
Laten we nu een gedetailleerde illustratie hebben van hoe u filteren praktisch kunt implementeren in JUnit 5.
Stap 1 : We taggen een testmethode in JUnit5TestCase1.java naar de tagnaam 'Regressie'
Het codefragment van JUnit5TestCase1.java:
Stap 2 : We taggen een testmethode in JUnit5TestCase2.java naar de tagnaam “SmokeTest”.
Het codefragment van JUnit5TestCase2.java:
Stap 3: Nu de testmethoden zijn getagd, zullen we nu JUnit5TestSuite.java bijwerken om geschikte filters op tags toe te voegen voor de tests. De onderstaande code bevat alle tests die zijn getagd als ‘Regressie’ en sluit alle tests uit die zijn getagd als ‘SmokeTest’.
Het codefragment van JUnit5TestSuite.java:
JUnit 5 - @IncludePackages, @ExcludePackages
We weten al dat wanneer we een pakketnaam doorgeven in het @SelectPackages annotatie, worden de tests in de subpakketten van het pakket ook toegevoegd aan de testsuite.
Er kunnen bepaalde subpakketten zijn die we in onze testsuite willen opnemen, terwijl een paar andere subpakketten die we niet willen of mogelijk niet relevant zijn om in onze suite te worden opgenomen.
Dit wordt mogelijk gemaakt door de annotaties @IncludePackages en @ExcludePackages in JUnit 5.
Laten we aannemen dat we een pakket ‘demo.tests’ hebben met drie subpakketten, d.w.z. subpakket 1, subpakket 2 en subpakket 3 met zijn testklassen in elk van de onderstaande pakketten.
Laten we eens kijken naar een codefragment van JUnit5TestSuite.java om te visualiseren hoe u een pakket kunt opnemen en uitsluiten.
Scenario 1: Pas filter toe om alleen testgevallen uit subpakket1 op te nemen.
De onderstaande code bevat alle tests van alle JUnit-klassen in het pakket demo.tests.subpackage1, maar sluit alle tests direct onder het pakket demo.test en die onder het pakket subpackage2 en subpackage3 uit.
Het codefragment van JUnit5TestSuite.java:
Scenario # 2: Pas filter toe om testgevallen alleen uit het pakketdeelpakket uit te sluiten 3.
De onderstaande code sluit alle tests uit van de JUnit-klassen in het pakket - demo.tests.subpackage3, maar de suite bevat alle tests direct onder het pakket demo.test en die onder het pakket subpackage1 en subpackage2.
Het codefragment van JUnit5TestSuite.java:
JUnit 5 - @IncludeClassNamePatterns, @ExcludeClassNamePatterns
Wanneer u bepaalde klassen wilt opnemen of uitsluiten die overeenkomen met een specifieke reguliere expressie uit het pakket, worden de annotaties IncludeClassNamePatterns en ExcludeClassnamePatterns kan worden gebruikt in het klassenbestand van de testsuite.
Laten we nu de illustratie bekijken via de code-update in JUnit5TestSuite.java
Scenario 1:
De onderstaande code bevat klassen die eindigen op ‘Ctests’ uit het pakket demo.tests
Scenario # 2:
We zullen nu die klassen uitsluiten die initiëren met ‘STest’ uit het pakket demo.tests
Scenario # 3:
Meerdere reguliere expressies kunnen ook worden doorgegeven als filtercriteria. De onderstaande code vermeldt twee verschillende reguliere expressies, gescheiden door de ‘ OF ”Operator. De spleetbalk | is hier de OR-operator.
gratis video-downloaders voor Windows 10
De code filtert klassen uit initiëren met Test Test.*) of einde met Tests (*. Tests?) en neemt die klassen op in de testsuite als annotatie @IncludeClassNamePatterns wordt gebruikt.
Notitie: Als de volledig gekwalificeerde klassenaam overeenkomt met ten minste één patroon, wordt de klasse opgehaald volgens de annotatie @IncludeClassNamePatterns of @ExcludeClassNamePatterns.
@RunWith (JUnitPlatform.class)
@SelectPackages ({'demo.tests'})
@IncludeClassNamePatterns (. * Tests?) $ ”)
Veelgestelde vragen over JUnit-filtertestcases
Hier is een vraag die je misschien al een hele tijd bij je hebt.
V # 1) Wat is het verschil tussen het uitschakelen / negeren van een test en het filteren van een test? Kunnen beide functies niet hetzelfde doel dienen als het overslaan van testcases tijdens de uitvoering?
Antwoord: De vraag is inderdaad echt en is het beantwoorden waard.
- Met de filtertestfunctie kunt u ook uitsluiten omvatten tests afhankelijk van de getagde categorie. Terwijl u met uitschakelen alleen kunt beslissen over het uitsluiten en niet opnemen van tests voor uitvoering.
- Het uitfilteren van de testcases is een soort testcase die voorwaardelijk wordt overgeslagen, terwijl deze in het geval van genegeerde tests zonder voorwaarden worden overgeslagen.
- Een ander significant verschil tussen de twee is dat wanneer u de testcases uitvoert met tests die zijn geannoteerd met @Ignore of @Disabled, de genegeerde tests worden weergegeven in de testresultaten onder de OVERSLAAN tellen
- Wanneer u de uitgefilterde tests uitvoert, verschijnen ze helemaal niet in het testresultaat.
Gevolgtrekking
In deze tutorial hebben we geleerd hoe we tests kunnen uitfilteren door een categorie / tag aan de tests toe te voegen.
We hebben in JUnit 4 geleerd dat we @Category, @IncludeCategory en @ExcludeCategory hebben om de testgevallen te filteren, terwijl JUnit 5 @IncludeTags en @ExcludeTags heeft om hetzelfde te doen.
Bovendien heeft JUnit 5 extra filteropties met behulp van annotaties @IncludePackages, @ExcludePackages, en ook annotaties om klassen op te nemen of uit te sluiten met behulp van klassenaampatronen. Hoe meer we ontdekken; we beseffen dat er nog veel meer te ontdekken valt.
Bekijk hier de eenvoudige JUnit-trainingsserie.
Aanbevolen literatuur
- JUnit Negeer testgeval: JUnit 4 @Ignore Vs JUnit 5 @Disabled
- JUnit-tests: hoe u JUnit-testcases schrijft met voorbeelden
- Lijst met JUnit-annotaties: JUnit 4 versus JUnit 5
- JUnit-zelfstudie voor beginners - Wat is JUnit-testen
- Wat is een JUnit-testopstelling: zelfstudie met JUnit 4-voorbeelden
- Meerdere manieren om JUnit-tests uit te voeren
- Download, installeer en configureer JUnit in Eclipse
- Inleiding tot JUnit Framework en het gebruik ervan in Selenium Script - Selenium Tutorial # 11