Introductie tot Jukito

1. Overzicht

Jukito is de gecombineerde kracht van JUnit, Guice en Mockito - gebruikt om het testen van meerdere implementaties van dezelfde interface te vereenvoudigen.

In dit artikel gaan we zien hoe auteurs erin geslaagd zijn om deze drie bibliotheken te combineren om ons te helpen veel standaardcode te verminderen, waardoor onze tests flexibel en gemakkelijk zijn.

2. Installatie

Eerst voegen we de volgende afhankelijkheid toe aan ons project:

 org.jukito jukito 1.5 test 

We kunnen de nieuwste versie vinden op Maven Central.

3. Verschillende implementaties van een interface

Om de kracht van Jukito te begrijpen, gaan we een eenvoudig definiëren Rekenmachine interface met een Toevoegen methode:

openbare interface Calculator {public double add (double a, double b); }

En we gaan de volgende interface implementeren:

public class SimpleCalculator implementeert Calculator {@Override public double add (double a, double b) {return a + b; }}

We hebben ook een andere implementatie nodig:

openbare klasse ScientificCalculator breidt SimpleCalculator uit {}

Laten we nu Jukito gebruiken om onze beide implementaties te testen:

@RunWith (JukitoRunner.class) openbare klasse CalculatorTest {openbare statische klasse Module breidt JukitoModule uit {@Override beschermde leegte configureTest () {bindMany (Calculator.class, SimpleCalculator.class, ScientificCalculator.class); }} @Test openbare leegte gegevenTwoNumbers_WhenAdd_ThenSumBoth (@All Calculator calc) {dubbel resultaat = calc.add (1, 1); assertEquals (2, resultaat, .1); }}

In dit voorbeeld zien we een JukitoModule, dat draden in alle gespecificeerde implementaties.

De @Alle annotatie neemt alle bindingen van dezelfde interface die door de JukitoModule en voert de test uit met alle verschillende implementaties die tijdens runtime zijn geïnjecteerd.

Als we tests uitvoeren, kunnen we zien dat er inderdaad twee tests worden uitgevoerd in plaats van één:

Uitgevoerde tests: 2, fouten: 0, fouten: 0, overgeslagen: 0

4. Het cartesiaanse product

Laten we nu een eenvoudige geneste klasse toevoegen voor verschillende combinaties van tests voor onze Toevoegen methode:

openbare statische klasse AdditionTest {int a; int b; int verwacht; // standard constructors / getters}

Dit vergroot het aantal tests dat we kunnen uitvoeren, maar eerst moeten we extra bindingen toevoegen aan onze configureTest methode:

bindManyInstances (AdditionTest.class, nieuwe AdditionTest (1, 1, 2), nieuwe AdditionTest (10, 10, 20), nieuwe AdditionTest (18, 24, 42));

En tot slot voegen we nog een test toe aan onze suite:

@Test openbare ongeldige gegevenTwoNumbers_WhenAdd_ThenSumBoth (@All Calculator calc, @All AdditionTest addTest) {dubbel resultaat = calc.add (addTest.a, addTest.b); assertEquals (addTest.expected, result, .1); }

Nu de @Alle annotatie gaat het Cartesiaanse product produceren van de verschillende combinaties tussen de verschillende implementaties van de Rekenmachine interface en de AdditionTest gevallen.

We kunnen kijken naar het toegenomen aantal tests dat het nu produceert:

Uitgevoerde tests: 8, fouten: 0, fouten: 0, overgeslagen: 0

We moeten niet vergeten dat het aantal testuitvoeringen drastisch toeneemt voor Cartesiaanse producten.

De uitvoeringstijd van alle tests zal lineair toenemen met het aantal uitvoeringen. i: e .: een testmethode met drie parameters met een @Alle annotatie en vier bindingen per parameter worden 4 x 4 x 4 = 64 keer uitgevoerd.

Het hebben van vijf bindingen voor dezelfde testmethode leidt tot 5 x 5 x 5 = 125 uitvoeringen.

5. Groeperen op naam

De laatste functie die we zullen bespreken, is de groepering op naam:

bindManyNamedInstances (Integer.class, "even", 2, 4, 6); bindManyNamedInstances (Integer.class, "odd", 1, 3, 5);

Hier hebben we enkele benoemde instanties van de integer-klasse toegevoegd aan onze configureTest methode, om te laten zien wat er met deze groepen kan worden gedaan.

Laten we nu nog wat tests toevoegen:

@Test openbare leegte gegevenEvenNumbers_whenPrint_thenOutput (@All ("even") Geheel getal i) {System.out.println ("even" + i); } @Test openbare ongeldige gegevenOddNumbers_whenPrint_thenOutput (@All ("oneven") Geheel getal i) {System.out.println ("oneven" + i); }

In het bovenstaande voorbeeld worden de zes strings "even 2", "even 4", "even 6", "oneven 1", "oneven 3", "oneven 5" afgedrukt.

Houd er rekening mee dat de volgorde hiervan niet gegarandeerd is tijdens runtime.

6. Conclusie

In deze korte tutorial hebben we bekeken hoe Jukito het gebruik van een hele testsuite mogelijk maakt, door net genoeg combinaties van testcases te bieden.

Het volledige voorbeeld is te vinden op GitHub.