Въведение в Jukito

1. Общ преглед

Jukito е комбинираната мощ на JUnit, Guice и Mockito - използва се за опростяване на тестването на множество реализации на един и същ интерфейс.

В тази статия ще видим как авторите са успели да комбинират тези три библиотеки, за да ни помогнат да намалим много шаблонни кодове, правейки нашите тестове гъвкави и лесни.

2. Настройка

Първо ще добавим следната зависимост към нашия проект:

 org.jukito jukito 1.5 test 

Можем да намерим най-новата версия в Maven Central.

3. Различни изпълнения на интерфейс

За да започнем да разбираме силата на Jukito, ще определим прост интерфейс на калкулатора с метод Add :

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

И ще приложим следния интерфейс:

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

Имаме нужда и от друго изпълнение:

public class ScientificCalculator extends SimpleCalculator { }

Сега, нека използваме Jukito, за да тестваме и двете ни реализации:

@RunWith(JukitoRunner.class) public class CalculatorTest { public static class Module extends JukitoModule { @Override protected void configureTest() { bindMany(Calculator.class, SimpleCalculator.class, ScientificCalculator.class); } } @Test public void givenTwoNumbers_WhenAdd_ThenSumBoth(@All Calculator calc) { double result = calc.add(1, 1); assertEquals(2, result, .1); } }

В този пример можем да видим JukitoModule , който се свързва във всички посочени реализации.

В @All анотацията взема всички автомати на същия интерфейс, направено от JukitoModule и минава теста с всички различни имплементации инжектират по време на изпълнение .

Ако изпълним тестове, можем да видим, че наистина се изпълняват два теста вместо един:

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

4. Декартовият продукт

Нека сега добавим прост вложен клас за различни комбинации от тестове за нашия метод Add :

public static class AdditionTest { int a; int b; int expected; // standard constructors/getters }

Това ще разшири броя на тестовете, които можем да изпълним, но първо трябва да добавим допълнителни обвързвания в нашия метод configureTest :

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

И накрая добавяме още един тест към нашия пакет:

@Test public void givenTwoNumbers_WhenAdd_ThenSumBoth( @All Calculator calc, @All AdditionTest addTest) { double result = calc.add(addTest.a, addTest.b); assertEquals(addTest.expected, result, .1); }

Сега на @All анотацията ще произведе декартово произведение на различните комбинации между различните приложения на калкулатор интерфейс и AdditionTest инстанции.

Можем да разгледаме увеличения брой тестове, които сега произвежда:

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

Трябва да помним, че броят на тестовите изпълнения се увеличава драстично за декартовите продукти.

Времето за изпълнение на всички тестове ще нараства линейно с броя на изпълненията. i: e .: тестов метод с три параметъра с @All анотация и четири обвързвания на параметър ще бъде изпълнен 4 x 4 x 4 = 64 пъти.

Наличието на пет обвързвания за един и същ метод на тестване ще доведе до 5 х 5 х 5 = 125 екзекуции.

5. Групиране по имена

Последната характеристика, която ще обсъдим, е групирането по име:

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

Тук добавихме някои именовани екземпляри от целочисления клас към нашия метод configureTest , за да покажем какво може да се направи с тези групи.

Сега нека добавим още няколко теста:

@Test public void givenEvenNumbers_whenPrint_thenOutput(@All("even") Integer i) { System.out.println("even " + i); } @Test public void givenOddNumbers_whenPrint_thenOutput(@All("odd") Integer i) { System.out.println("odd " + i); }

Горният пример ще отпечата шестте низа „четно 2“, „четно 4“, „четно 6“, „нечетно 1“, „нечетно 3“, „нечетно 5“.

Имайте предвид, че редът им не е гарантиран по време на изпълнение.

6. Заключение

В този бърз урок разгледахме как Jukito позволява използването на цял набор от тестове, като предоставим точно достатъчно комбинации от тестови случаи.

Пълният пример може да бъде намерен в GitHub.