Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component...

238
Тестируем и плачем Вместе со Spring Boot Test

Transcript of Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component...

Page 1: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тестируем и плачемВместе со Spring Boot Test

Page 2: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@tolkv

@lavcraft

Page 3: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@jekaborisov

@jeka1978

Page 4: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

В программеТестирование живого приложения● Старые подходы

○ @ContextConfiguration○ @ContextHierarchy && @DirtiesContext○ @ActiveProfiles

● Что нового нам приготовил Spring Boot?○ @SpringBootTest○ @TestConfiguration○ @MockBean && @SpyBean && @*Beans○ @DataJpaTest○ @MvcTest

● Кэширование spring контекстов● Шкала тестов

Page 5: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Немного теории

Page 6: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Шкала Тестов

UnitComponent Test

Microservice TestSystem Test

➯ ➯➯ ➯

Page 7: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Шкала Тестов

UnitComponent Test

Microservice TestSystem Test

➯ ➯➯ ➯

Page 8: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Unit/Component тесты. Для чего?

Page 9: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Unit/Component тесты. Для чего?

Page 10: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Unit/Component тесты. Для чего?

Ваши тестыТут

Page 11: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Unit/Component тесты. Для чего?

Тестыуменьшают неопределённость

Page 12: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Есть два типа тестов

Простой Сложный

Page 13: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Есть два типа тестовКакой сам выберешь

Простой Сложный

Page 14: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Есть два типа тестовКакой сам выберешь, а какой разработчику оставишь?

Простой Сложный

Page 15: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Когда пишут тесты?

Page 16: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Когда пишут тесты?

1. Требование заказчика

Page 17: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Когда пишут тесты?

1. Требование заказчика2. Культура

Page 18: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Когда пишут тесты?

1. Требование заказчика2. Культура Перед кодом

Page 19: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Когда пишут тесты?

1. Требование заказчика2. Культура Перед кодом

Вместе кодом

Page 20: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Когда пишут тесты?

1. Требование заказчика2. Культура Перед кодом

Вместе кодом

После кода

Page 21: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

UnitComponent Test

Про какие тесты будем говорить?

➯ ➯Перед кодом

Вместе кодом

После кода

Page 22: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

UnitComponent Test

➯ ➯

Про какие тесты будем говорить?

Перед кодом

Вместе кодом

После кода

Page 23: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Начнём

Page 24: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

router

joker

jbaruch-assistant

Default AnswersDatabase

Joker Resolver$tokens.joker

JBaruch Resolver

...

$tokens.jbaruch

Дано

Page 25: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

ДаноЧат поддержки тестировщиков

assistant

joker-assistant

jbaruch-assistant

Queue

мыweb

rest

rest

rest

Default AnswersDatabase

Page 26: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Эксперты

Page 27: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Эксперты

Page 28: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Demo

Page 29: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

ДаноЧат поддержки тестировщиков

assistant

joker-assistant

jbaruch-assistant

Queue

мыweb

rest

rest

rest

Default AnswersDatabase

Page 30: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши
Page 31: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши
Page 32: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши
Page 33: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

А давайте тестировать

Page 34: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

А давайте тестировать

У кого спросить? [joker/jbaruch]

router

joker

jbaruch-assistant

Default AnswersDatabase

Joker Resolver$tokens.joker

JBaruch Resolver

...

$tokens.jbaruch

Page 35: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

DemoJokerWordsFrequencyResolverTest

Page 36: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

А давайте тестировать. Тест #11. Пишем JokerWordsFrequencyResolverTest.

Page 37: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Demo

Page 38: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Кого тестируем@Componentpublic class JokerWordsFrequencyResolver extends AbstractWordsFreqResolver {

@Value("${tokens.joker}") private String answers;

public JokerWordsFrequencyResolver(WordsComposer wordsComposer) { super(wordsComposer); }

@Override public QuestionType getQuestionType() { return JOKER; }}

Page 39: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5

public class JokerWordsFrequencyResolverTest { @Test public void name() throws Exception { JokerWordsFrequencyResolver jokerWordsFrequencyResolver = new JokerWordsFrequencyResolver(

... ) ); jokerWordsFrequencyResolver.setAnswers( "objects");

int match = jokerWordsFrequencyResolver.match( Question.builder().body("objects ...").build());

assertThat(match, equalTo(1)); }}

Page 40: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5

public class JokerWordsFrequencyResolverTest { @Test public void name() throws Exception { JokerWordsFrequencyResolver jokerWordsFrequencyResolver = new JokerWordsFrequencyResolver( new WordsComposer( ... ) ); jokerWordsFrequencyResolver.setAnswers( "objects");

int match = jokerWordsFrequencyResolver.match( Question.builder().body("objects ...").build());

assertThat(match, equalTo(1)); }}

Page 41: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5

public class JokerWordsFrequencyResolverTest { @Test public void name() throws Exception { JokerWordsFrequencyResolver jokerWordsFrequencyResolver = new JokerWordsFrequencyResolver( new WordsComposer( new GarbageProperties() ) ); jokerWordsFrequencyResolver.setAnswers( "objects");

int match = jokerWordsFrequencyResolver.match( Question.builder().body("objects ...").build());

assertThat(match, equalTo(1)); }}

Page 42: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1

public class JokerWordsFrequencyResolverTest { @Test public void name() throws Exception { JokerWordsFrequencyResolver jokerWordsFrequencyResolver = new JokerWordsFrequencyResolver( new WordsComposer( new GarbageProperties() ) ); jokerWordsFrequencyResolver.setAnswers( "objects");

int match = jokerWordsFrequencyResolver.match( Question.builder().body("objects ...").build());

assertThat(match, equalTo(1)); }}

Page 43: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1

public class JokerWordsFrequencyResolverTest { @Test public void name() throws Exception { JokerWordsFrequencyResolver jokerWordsFrequencyResolver = new JokerWordsFrequencyResolver( new WordsComposer( new GarbageProperties() ) ); jokerWordsFrequencyResolver.setAnswers( "objects");

int match = jokerWordsFrequencyResolver.match( Question.builder().body("objects ...").build());

assertThat(match, equalTo(1)); }}

Page 44: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Результат

java.lang.NullPointerExceptionat … .(WordsComposer.java:48)

Page 45: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Not Passed

Page 46: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

WordsComposer:48

garbageProperties.getGarbage()

.contains(s.toLowerCase())

NullPointerException

Page 47: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

WordsComposer:48

@Value("${garbage}")void setGarbage(String[] garbage) {

Запчасти Spring

Page 48: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

А давайте тестировать. Тест #11. Пишем JokerWordsFrequencyResolverTest.2. Как ни крути, но нужен более “интеграционный тест”

Page 49: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Шкала Тестов

Unit

Page 50: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Шкала Тестов

UnitComponent Test

➯ ➯

Page 51: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

UnitComponent Test

➯ ➯

Про какие тесты будем говорить?

Перед кодом

Вместе кодом

После кода

Page 52: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

UnitComponent Test

➯ ➯

Про какие тесты будем говорить?

Перед кодом

Вместе кодом

После кода

Page 53: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

UnitComponent Test

➯ ➯

Про какие тесты будем говорить?

Перед кодом

Вместе кодом

После кода@Value("${garbage}")void setGarbage(String[] garbage) {

Инициализируется Spring`ом

Page 54: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Ещё немного теории

Page 55: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Page 56: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Page 57: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Page 58: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Кино про супергероев

Page 59: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Кино про супергероев

Page 60: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Кино про супергероев

Page 61: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Кино про супергероев

IoC

Page 62: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

ФабрикаГероев

IoC, DI, Spring и друзья

Кино про супергероев

IoC

Page 63: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

IoC для инверсии поведения

Page 64: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

public class СуперЗлодейТест {

@Before public void setUp() throws Exception {

... }

}

Тоже инверсия контроля

IoC для инверсии поведения

Page 65: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

public class СъемочнаяПлощадка { public static void main(String[] args) { Киношка съёмка = new Киношка().снимать();

съёмка.герой.бить(); съёмка.злодей.страдать(); съёмка.злодей.бить(); съёмка.герой.страдать(); съёмка.герой.страдать(); }}

Page 66: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

public class СъемочнаяПлощадка { public static void main(String[] args) { Киношка съёмка = new Киношка().снимать();

съёмка.герой.бить(); съёмка.злодей.страдать(); съёмка.злодей.бить(); съёмка.герой.страдать(); съёмка.герой.страдать(); }}

NullPointerException

Page 67: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

public class Киношка { СуперГерой герой; СуперЗлодей злодей;

public Киношка снимать() { return new Киношка(); }}

Page 68: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзьяpublic class СуперГерой implements Герой { private СуперЗлодей вражина;

@Override public void бить() { вражина.бить(); }}

public class СуперЗлодей implements Герой { private СуперГерой вражина;

@Override public void бить() { вражина.страдать(); }}

Кто проставляет?

Page 69: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

public class ФабрикаГероев { public Object родить() { if (new Random().nextBoolean()) { return new СуперГерой(); } return new СуперЗлодей(); }}

IoC, DI, Spring и друзья

Page 70: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

public class ФабрикаГероев { public Object родить() { if (new Random().nextBoolean()) { return new СуперГерой(); } return new СуперЗлодей(); }}

IoC, DI, Spring и друзья

Page 71: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Spring

Page 72: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

Spring

● @Autowired● @Component/@Service● @Configuration

Page 73: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

@Componentpublic class Киношка { @Autowired СуперГерой герой; @Autowired СуперЗлодей злодей;

public static Киношка снимать() { return new Киношка(); }}

Spring

● @Autowired● @Component/@Service● @Configuration

Page 74: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

@Componentpublic class Киношка { @Autowired СуперГерой герой; @Autowired СуперЗлодей злодей;

public static Киношка снимать() { return new Киношка(); }}

Spring

● @Autowired● @Component/@Service● @Configuration

Page 75: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

IoC, DI, Spring и друзья

@Componentpublic class СуперГерой implements Герой { @Autowired СуперЗлодей вражина;

@Override public void бить() { вражина.бить(); }}

Spring

● @Autowired● @Component/@Service● @Configuration

Page 76: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Demo

Page 77: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5@RunWith(SpringRunner.class)@ContextConfiguration (classes = JokerWordsFrequencyResolverTestConfig. class)public class JokerWordsFrequencyResolverTest {

@Autowired JokerWordsFrequencyResolver jokerWordsFrequencyResolver;

@Test public void name() throws Exception { jokerWordsFrequencyResolver.setAnswers("objects");

int match = jokerWordsFrequencyResolver.match( Question.builder().body("objects ...").build());

assertThat(match, equalTo(1)); }}

Page 78: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5

@Configurationpublic class JokerWordsFrequencyResolverTestConfig {

@Bean public JokerWordsFrequencyResolver jokerWordsFrequencyResolver( WordsComposer wordsComposer) { return new JokerWordsFrequencyResolver(wordsComposer); }

}

Page 79: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5

@Configurationpublic class JokerWordsFrequencyResolverTestConfig {

@Bean public JokerWordsFrequencyResolver jokerWordsFrequencyResolver( WordsComposer wordsComposer) { return new JokerWordsFrequencyResolver(wordsComposer); }

}

Page 80: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5@Configuration@ComponentScan("com.conference.spring.test.common")public class JokerWordsFrequencyResolverTestConfig {

@Bean public JokerWordsFrequencyResolver jokerWordsFrequencyResolver( WordsComposer wordsComposer) { return new JokerWordsFrequencyResolver(wordsComposer); }

}

Page 81: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5@Configuration@ComponentScan("com.conference.spring.test.common")public class JokerWordsFrequencyResolverTestConfig {

@Bean public JokerWordsFrequencyResolver jokerWordsFrequencyResolver( WordsComposer wordsComposer) { return new JokerWordsFrequencyResolver(wordsComposer); }

}

Page 82: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тест №1.5@RunWith(SpringRunner.class)@ContextConfiguration (classes = JokerWordsFrequencyResolverTestConfig. class)public class JokerWordsFrequencyResolverTest {

@Autowired JokerWordsFrequencyResolver jokerWordsFrequencyResolver;

@Test public void name() throws Exception { jokerWordsFrequencyResolver.setAnswers("objects");

int match = jokerWordsFrequencyResolver.match( Question.builder().body("objects ...").build());

assertThat(match, equalTo(1)); }}

Page 83: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Passed

Page 84: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Ещё немного теории

Page 85: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

SpringRunner

/** * @author Sam Brannen * @since 4.3 * @see SpringJUnit4ClassRunner */public final class SpringRunner extends SpringJUnit4ClassRunner

Page 86: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

SpringRunner & SpringJUnit4ClassRunner

/** * @author Sam Brannen * @author Juergen Hoeller * ... */public class SpringJUnit4ClassRunner extends BlockJUnit4ClassRunner

Page 87: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

/** * {@code SpringExtension} integrates the <em>Spring TestContext … </em> * into JUnit 5's <em>Jupiter</em> programming model. ... * @author Sam Brannen * @since 5.0 */public class SpringExtension implements BeforeAllCallback, … {

SpringExtension — Junit5

Page 88: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

SpringExtension — Junit5

@SpringJUnitConfig@SpringJUnitWebConfig

Page 89: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Пишем TextBasedQuestionTypeResolverTest

А давайте тестировать. Тест #2

Page 90: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Шкала Тестов

UnitComponent Test

➯ ➯

Page 91: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Пишем TextBasedQuestionTypeResolverTest2. Вручную создаем три бина для тестирования

TextBasedQuestionTypeResolver на примере Барух vs Джокер кейса

А давайте тестировать. Тест #2

Page 92: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

DemoTextBasedQuestionTypeResolverTest

Page 93: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@RunWith(SpringRunner.class)@ContextConfiguration (classes = TextBasedQuestionTypeResolverTestConfig. class)public class TextBasedQuestionTypeResolverTest { @Autowired TextBasedQuestionTypeResolver questionResolver;

@Test public void name() throws Exception { QuestionType groovy = questionResolver.resolveType(new Question("groovy")); QuestionType objects = questionResolver.resolveType(new Question("псих"));

assertThat(groovy, equalTo(JBARUCH)); assertThat(objects, equalTo(JOKER)); }}

Тест #2

Page 94: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configurationpublic class TextBasedQuestionTypeResolverTestConfig {

@Bean public TextBasedQuestionTypeResolver textBasedQuestionTypeResolver( List<WordsFrequencyResolver> c) { return new TextBasedQuestionTypeResolver(c); }

}

Тест #2

Page 95: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configurationpublic class TextBasedQuestionTypeResolverTestConfig {

@Bean public TextBasedQuestionTypeResolver textBasedQuestionTypeResolver( List<WordsFrequencyResolver> c) { return new TextBasedQuestionTypeResolver(c); }

@Bean public JokerWordsFrequencyResolver … { … }

@Bean public JBaruchWordsFrequencyResolver … { … }

}

Тест #2

Page 96: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configurationpublic class TextBasedQuestionTypeResolverTestConfig {

@Bean public TextBasedQuestionTypeResolver textBasedQuestionTypeResolver( List<WordsFrequencyResolver> c) { return new TextBasedQuestionTypeResolver(c); }

@Bean public JokerWordsFrequencyResolver … { … }

@Bean public JBaruchWordsFrequencyResolver … { … }

}

Тест #2

Для них нужен WordsComposer@ComponentScan("com.conference.spring.test.common") ?

Page 97: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configurationpublic class TextBasedQuestionTypeResolverTestConfig {

@Bean public TextBasedQuestionTypeResolver textBasedQuestionTypeResolver( List<WordsFrequencyResolver> c) { return new TextBasedQuestionTypeResolver(c); }

@Bean public JokerWordsFrequencyResolver … { … }

@Bean public JBaruchWordsFrequencyResolver … { … }

}

Тест #2

Для них нужен WordsComposer@ComponentScan("com.conference.spring.test.common") ?

Page 98: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configuration@Import(CommonConfig.class)public class TextBasedQuestionTypeResolverTestConfig {

@Bean public TextBasedQuestionTypeResolver textBasedQuestionTypeResolver( List<WordsFrequencyResolver> c) { return new TextBasedQuestionTypeResolver(c); }

@Bean public JokerWordsFrequencyResolver … { … }

@Bean public JBaruchWordsFrequencyResolver … { … }

}

Тест #2

Page 99: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configuration@ComponentScan("com.conference.spring.test.common")public class CommonConfig {

}

Тест #2

Page 100: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Not Passed

Page 101: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

class JokerWordsFrequencyResolver@Value("${tokens.joker}")private String answers;

class JBaruchWordsFrequencyResolver@Value("${tokens.jbaruch}")private String answers;

Кто считывает?

Что случилось

Page 102: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Что случилосьclass JokerWordsFrequencyResolver

@Value("${tokens.joker}")private String answers;

class JBaruchWordsFrequencyResolver@Value("${tokens.jbaruch}")private String answers;

application.yml:tokens: jbaruch: npm leftpad artifactory groovy object *** joker: objects

Кто считывает?

Отсюда считываем

Page 103: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configuration@Import(CommonConfig.class)@PropertySource("classpath*:application.yml")public class TextBasedQuestionTypeResolverTestConfig {

@Bean public TextBasedQuestionTypeResolver textBasedQuestionTypeResolver( List<WordsFrequencyResolver> c) { return new TextBasedQuestionTypeResolver(c); }

@Bean public JokerWordsFrequencyResolver … { … }

@Bean public JBaruchWordsFrequencyResolver … { … }

}

Тест #2

Page 104: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configuration@Import(CommonConfig.class)@PropertySource("classpath*:application.yml")public class TextBasedQuestionTypeResolverTestConfig {

@Bean public TextBasedQuestionTypeResolver textBasedQuestionTypeResolver( List<WordsFrequencyResolver> c) { return new TextBasedQuestionTypeResolver(c); }

@Bean public JokerWordsFrequencyResolver … { … }

@Bean public JBaruchWordsFrequencyResolver … { … }

}

Тест #2

Page 105: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Not Passed

Page 106: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Пишем TextBasedQuestionTypeResolverTest2. Вручную создаем три бина для тестирования

TextBasedQuestionTypeResolver на примере Барух vs Егор кейса3. Все падает потому что не подтягивается application.yml4. @PropertySource …

А давайте тестировать. Тест #2

Page 107: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@ContextConfiguration(classes = ....class, initializers = YamlFileApplicationContextInitializer.class)public class OurTest { @Test public test(){... }}

А давайте тестировать. Тест #2

Page 108: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Spring Boot обновки

1. @SpringBootTest2. @TestConfiguration3. @MockBean && @SpyBean4. @DataJpaTest5. @MockMvcTest

Page 109: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Углубляемся в Spring. Тест #21. Применяем @SpringBootTest

Page 110: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Demo

Page 111: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@RunWith(SpringRunner.class)@ContextConfiguration (classes = TextBasedQuestionTypeResolverTestConfig. class)public class TextBasedQuestionTypeResolverTest { @Autowired TextBasedQuestionTypeResolver questionResolver;

@Test public void name() throws Exception { QuestionType groovy = questionResolver.resolveType(new Question("groovy")); QuestionType objects = questionResolver.resolveType(new Question("objects"));

assertThat(groovy, equalTo(JBARUCH)); assertThat(objects, equalTo(JOKER)); }}

Тест #2

Page 112: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@RunWith(SpringRunner.class)@SpringBootTestpublic class TextBasedQuestionTypeResolverTest { @Autowired TextBasedQuestionTypeResolver questionResolver;

@Test public void name() throws Exception { QuestionType groovy = questionResolver.resolveType(new Question("groovy")); QuestionType objects = questionResolver.resolveType(new Question("objects"));

assertThat(groovy, equalTo(JBARUCH)); assertThat(objects, equalTo(JOKER)); }}

Тест #2

Page 113: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Not Passed

Page 114: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@RunWith(SpringRunner.class)@SpringBootTest@ActiveProfiles("joker_vs_jbaruch")public class TextBasedQuestionTypeResolverTest { @Autowired TextBasedQuestionTypeResolver questionResolver;

@Test public void name() throws Exception { QuestionType groovy = questionResolver.resolveType(new Question("groovy")); QuestionType objects = questionResolver.resolveType(new Question("objects"));

assertThat(groovy, equalTo(JBARUCH)); assertThat(objects, equalTo(JOKER)); }}

Тест #2

Для подгрузкиapplication-joker_vs_jbaruch.yml

Page 115: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Passed

Page 116: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Углубляемся в Spring. Тест #21. Применяем @SpringBootTest2. Долго…3. @SpringBootTest(classes = ...class)

Page 117: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Углубляемся в Spring. Тест #21. Применяем @SpringBootTest2. Долго…3. @SpringBootTest(classes = ...class)4. Стало быстрее

Page 118: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Demo - но можно лучше

Page 119: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configuration@ComponentScan("com.conference.spring.test.common")public class CommonConfig {

@PostConstruct public void init() { System.out.println("Only once " + CommonConfig.class); }

}

Тест #2

Page 120: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Запустим тест №1 и №2 за раз

Page 121: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Only once…

only once…

only once

Page 122: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Only once…

only once…

only once

Дважды...

Page 123: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Углубляемся в Spring. Тест #21. Применяем @SpringBootTest2. Долго…3. @SpringBootTest(classes = ...class)4. Стало быстрее5. С кэшированием конфигураций – еще быстрее

Page 124: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Углубляемся в Spring. Тест #2@ContextHierarchy({ @ContextConfiguration(classes=WordsCommonConfiguration.class), @ContextConfiguration(classes= ...class)})

Page 125: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Demo

Page 126: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@SpringBootTest@ContextHierarchy({ @ContextConfiguration(classes = TextBasedQuestionTypeResolverTestConfig.class), @ContextConfiguration(classes = CommonConfig.class)})@ActiveProfiles("joker_vs_jbaruch")@RunWith(SpringRunner.class)public class TextBasedQuestionTypeResolverTest {...

Page 127: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Запустим тест №1 и №2 за раз

Page 128: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Only once…

only once…

only once…

only once…

only once

Четыре раза...

Page 129: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши
Page 130: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@Configuration@Import(CommonConfig.class)public class JokerWordsFrequencyResolverTestConfig {

@Configuration@Import(CommonConfig.class)public class TextBasedQuestionTypeResolverTestConfig {

Page 131: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Убираем @Import(CommonConfig.class)

Page 132: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Not Passed

Page 133: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши
Page 134: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Не найден spring bean WordsComposer

Page 135: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Углубляемся в Spring. Тест #2@ContextHierarchy({ @ContextConfiguration(classes=WordsCommonConfiguration.class), @ContextConfiguration(classes= ...class)})

Порядок важен! Т.к другая конфигурация использует бины из WordsCommonConfiguration

Page 136: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Меняем порядок в @ContextHierarchy

@SpringBootTest@ContextHierarchy({ @ContextConfiguration(classes = CommonConfig.class), @ContextConfiguration(classes = TextBasedQuestionTypeResolverTestConfig.class) })@ActiveProfiles("joker_vs_jbaruch")@RunWith(SpringRunner.class)public class TextBasedQuestionTypeResolverTest {...

CommonConfig теперь первый

Page 137: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Passed

Page 138: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Only once…

only once…

only once

Дважды...

Page 139: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Сделали круг

Page 140: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Опять не закешировалось. Тест #2

Page 141: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Правила кэширования контекстов. Тест #2

@SpringBootTest – должен быть везде@Import – должен быть нигде@ActiveProfiles – один на всехSpringBootTest.properties – должны быть одинаковые

Page 142: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Правила кэширования контекстов. Тест #2

@SpringBootTest – должен быть везде@Import – должен быть нигде@ActiveProfiles – один на всехSpringBootTest.properties – должны быть одинаковые

Page 143: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Правила кэширования контекстов. Тест #2

@SpringBootTest – должен быть везде@Import – должен быть нигде@ActiveProfiles – один на всехSpringBootTest.properties – должны быть одинаковые

Порядок важен!Любая перестановка – cache miss

Page 144: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Правила кэширования контекстов. Тест #2

@SpringBootTest(properties={"a=b","b=a"})@SpringBootTest(properties={"b=a","a=b"})

Page 145: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Правила кэширования контекстов. Тест #2

@SpringBootTest(properties={"a=b","b=a"})@SpringBootTest(properties={"b=a","a=b"})

Кэш не сработает

Page 146: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Правила кэширования контекстов. Тест #2

@SpringBootTest – должен быть везде@Import – должен быть нигде@ActiveProfiles – один на всехSpringBootTest.properties – должны быть одинаковые

Page 147: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Хрупкий кэш

Все может привести к потере кэша

Page 148: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Пользуемся силойlogging.level.org.springframework.test.context.cache=debug

Page 149: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Б – безопасность@SpringBootTest@ActiveProfiles("joker_vs_jbaruch")public abstract class ResolversAbstractCommonConfiguration {

}

Page 150: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Only once…

only once

Один!...

Page 151: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

А если наоборот? (как не кэшировать)

Page 152: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

А если наоборот? (как не кэшировать)@DirtiesContext(...)

Page 153: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

А если наоборот? (как не кэшировать)@DirtiesContext(...)

methodMode() default MethodMode.AFTER_METHODclassMode() default ClassMode.AFTER_CLASS...

Page 154: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Проверим наши знания. Тест #31. протестируем AnswerCacheServiceJPABackend

Page 155: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

DemoAnswerCacheServiceJPABackend

Page 156: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Что тестируем@Service@RequiredArgsConstructorpublic class AnswerCacheServiceJPABackend implements AnswerCacheService { private final QuestionRepository questionRepository; private final AnswersRepository answersRepository;

@Override public Answer find(Question question) { … }

}

Page 157: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Что тестируем@Service@RequiredArgsConstructorpublic class AnswerCacheServiceJPABackend implements AnswerCacheService { private final QuestionRepository questionRepository; private final AnswersRepository answersRepository;

@Override public Answer find(Question question) { … }

}

Page 158: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Что тестируем@Service@RequiredArgsConstructorpublic class AnswerCacheServiceJPABackend implements AnswerCacheService { private final QuestionRepository questionRepository; private final AnswersRepository answersRepository;

@Override public Answer find(Question question) { … }

}

Page 159: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Spring Boot обновки

1. @SpringBootTest2. @MockBean && @SpyBean3. @TestConfiguration4. @DataJpaTest5. @MockMvcTest

Page 160: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как тестируем@RunWith(SpringRunner.class)@SpringBootTest(classes = AnswerCacheServiceJPABackendTestConfig.class)public class AnswerCacheServiceJPABackendTest { @Autowired AnswerCacheService answerCacheService;

@MockBean AnswersRepository answersRepository; @MockBean QuestionRepository questionRepository;

@Test public void should_not_fail() throws Exception { … test … }}

Page 161: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как тестируем@RunWith(SpringRunner.class)@SpringBootTest(classes = AnswerCacheServiceJPABackendTestConfig.class)public class AnswerCacheServiceJPABackendTest { @Autowired AnswerCacheService answerCacheService;

@MockBean AnswersRepository answersRepository; @MockBean QuestionRepository questionRepository;

@Test public void should_not_fail() throws Exception { … test … }}

Page 162: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как тестируем@RunWith(SpringRunner.class)@SpringBootTest(classes = AnswerCacheServiceJPABackendTestConfig.class)public class AnswerCacheServiceJPABackendTest { @Autowired AnswerCacheService answerCacheService;

@MockBean AnswersRepository answersRepository; @MockBean QuestionRepository questionRepository;

@Test public void should_not_fail() throws Exception { … test … }}

Page 163: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как тестируем – Конфигурация@Configurationpublic class AnswerCacheServiceJPABackendTestConfig { @Bean public AnswerCacheServiceJPABackend answerCacheServiceJpaBackend(

QuestionRepository qR, AnswersRepository aR) {

return new AnswerCacheServiceJPABackend(qR, aR); }

}

Page 164: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как тестируем – сам тест

@Test public void should_not_fail() throws Exception { Mockito.doThrow(new RuntimeException("Database is down")) .when(questionRepository) .findFirstByText(Matchers.anyString());

Answer answer = answerCacheService.find(Question.builder().build());

assertNull(answer);

}}

Наш @MockBean

Page 165: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Passed

Page 166: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Синергия с Mockito1. @MockBean/@SpyBean2. @PostConstruct для настройки3. @Bean для настройки конкретных моков

Page 167: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Запустим все тесты

Все ли хорошо?

Page 168: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Not Passed

Page 169: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Запустим все тесты2. DeveloperAssistantApplicationTests.contextLoad падает

Все ли хорошо?

Стандартный тест на запуск контекст см start.spring.io

Page 170: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Почему упалДва бина одного типа в контексте

● answerCacheServiceJPABackend● answerCacheServiceJpaBackend

Page 171: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Почему упалДва бина одного типа в контексте

● answerCacheServiceJPABackend● answerCacheServiceJpaBackend

Page 172: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как Spring называет бины?почему имена бинов разные

Page 173: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Запустим все тесты2. DeveloperAssistantApplicationTests.contextLoad падает3. Загрузил бины из другого теста!

Все ли хорошо?

Page 174: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши
Page 175: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Spring Boot обновки

1. @SpringBootTest2. @MockBean && @SpyBean3. @TestConfiguration4. @DataJpaTest5. @MockMvcTest

Page 176: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Запустим все тесты2. DeveloperAssistantApplicationTests.contextLoad падает3. Загрузил бины из другого теста!4. @TestConfiguration!

Все ли хорошо?

Page 177: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Не сканируется @SpringBootTest2. Не сканируется другими конфигурациями и тестами3. Не прерывает процесс сканирования @SpringBootTest

@TestConfiguration

Page 178: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Запустим все тесты2. DeveloperAssistantApplicationTests.contextLoad падает3. Загрузил бины из другого теста!4. @TestConfiguration!5. DeveloperAssistantApplicationTests.contextLoad работает

Все ли хорошо?

Page 179: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Почему упалДва бина одного типа в контексте

● answerCacheServiceJPABackend● answerCacheServiceJpaBackend

Page 180: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Почему упалДва бина одного типа в контексте

● answerCacheServiceJPABackend● answerCacheServiceJpaBackend

Опять двадцать пять!

Page 181: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Запустим все тесты2. DeveloperAssistantApplicationTests.contextLoad падает3. Загрузил бины из другого теста!4. @TestConfiguration!5. DeveloperAssistantApplicationTests.contextLoad работает6. А AnswerCacheServiceJPABackendTest перестал7. Загрузил бины из другого теста!

Все ли хорошо?

Page 182: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Spring Заговор

Page 183: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1.

Как @SpringBootTest сканирует пакеты

Page 184: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования1. @SpringBootTest сканирование2. @SpringBootApplication (@ComponentScan)

Page 185: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования1. @SpringBootTest сканирование2. @SpringBootApplication (@ComponentScan)

Вверх

Page 186: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования1. @SpringBootTest сканирование2. @SpringBootApplication (@ComponentScan) Вниз

Вверх

Page 187: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@SpringBootTest

Два процесса сканирования

Page 188: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@SpringBootTest

Два процесса сканирования

Page 189: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@SpringBootTest

Два процесса сканирования

Page 190: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования

@SpringBootTest

Page 191: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования

@SpringBootTest

test classpath extends main classpath

Page 192: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши
Page 193: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования

@SpringBootTest

@SpringBootApplication

src/main будет так же просканирован*

test classpath extends main classpath

Page 194: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования

@SpringBootTest

@SpringBootApplication

src/main будет так же просканирован*

test classpath extends main classpath

Page 195: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования

@SpringBootTest

@SpringBootApplication

src/main будет так же просканирован*

test classpath extends main classpath

Page 196: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования

@SpringBootTest

@SpringBootApplication

src/main будет так же просканирован*

test classpath extends main classpath

Page 197: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Два процесса сканирования

@SpringBootTest

@SpringBootApplication

src/main будет так же просканирован*

test classpath extends main classpath

Page 198: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тоже и сsrc/main/**

Page 199: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как чинить@SpringBootApplication@EnableFeignClients@EnableConfigurationProperties(AssistantProperties.class)public class DeveloperAssistantApplication {

public static void main(String[] args) { SpringApplication.run(DeveloperAssistantApplication.class, args);}

}

Page 200: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как чинить@SpringBootApplication@EnableFeignClients@EnableConfigurationProperties(AssistantProperties.class)public class DeveloperAssistantApplication {

public static void main(String[] args) { SpringApplication.run(DeveloperAssistantApplication.class, args);}

}

Page 201: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как чинить@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public @interface SpringBootApplication {

Page 202: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как чинить@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public @interface SpringBootApplication {

Page 203: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Как чинить/** * @author Phillip Webb * @since 1.4.0 */@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Configurationpublic @interface SpringBootConfiguration {

}

Page 204: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Запустим все тесты2. DeveloperAssistantApplicationTests.contextLoad падает3. Загрузил бины из другого теста!4. @TestConfiguration!5. DeveloperAssistantApplicationTests.contextLoad работает6. А AnswerCacheServiceJPABackendTest перестал7. Загрузил бины из другого теста!8. @SpringBootConfiguration остановит сканирование

Все ли хорошо?

Page 205: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@SpringBootConfigurationpublic class StopConfiguration {

}

В нужном пакете!

Чиним

Page 206: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@SpringBootConfiguration

Нужный пакет для остановки

Page 207: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Component Tests

Page 208: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Spring Boot обновки

1. @SpringBootTest2. @TestConfiguration3. @MockBean && @SpyBean4. @DataJpaTest5. @MockMvcTest

Page 209: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@DataJpaTest

1. сканирует все репозитории

Page 210: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@DataJpaTest

1. сканирует все репозитории2. конфигурирует EntityManager3. загружает другие конфигурации

Page 211: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. сканирует все репозитории2. конфигурирует EntityManager3. загружает другие конфигурации4. фильтрует все не относящееся к Data/JPA

Применим знания

@DataJpaTest

Page 212: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тестируем DefaultAssistantJpaBackendTest1. @DataJpaTest не загружает компоненты Spring*

Page 213: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тестируем DefaultAssistantJpaBackendTest1. @DataJpaTest не загружает компоненты Spring*2. Делаем конфигурацию, загружаем недостающее

Page 214: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тестируем DefaultAssistantJpaBackendTest1. @DataJpaTest не загружает компоненты Spring2. Делаем конфигурацию, загружаем недостающее3. Ничего не работает, из за @SpringBootConfiguration

Page 215: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Тестируем DefaultAssistantJpaBackendTest1. @DataJpaTest не загружает компоненты Spring*2. Делаем конфигурацию, загружаем недостающее3. Ничего не работает, из за @SpringBootConfiguration4. Переносим в новый package – все @*Test тесты должны быть

изолированы

Page 216: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@WebMvcTest

1. Не грузит компоненты спринга

Page 217: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@WebMvcTest

1. Не грузит компоненты спринга2. Грузит только то что относится к Web

Page 218: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

@WebMvcTest

1. Не грузит компоненты спринга2. Грузит только то что относится к Web3. Сразу изолируем в отдельный пакет

Получаем суперспособность:

@AutowiredMockMvc mockMvc;

Page 219: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Где настраивать @MockBean1. В @*Configuration –

если мок нужен на этапе создания контекста2. В тесте (@Before/setup/etc)

если мок нужен только на этапе выполнения теста

Page 220: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Что же делает @SpringBootTest1. Без classes

a. сканирует со своего пакета “вверх” в поисках @SpringBootConfigurationi. игнорирует остальных

b. падает если не находит или находит несколько в одном пакете

2. classes=~@Configurationa. поднимет только указанные конфигурации

3. classes=~@TestConfigurationa. поднимет указанный контекст и продолжит сканирование. см пункт 1

Page 221: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Зачем нужен @SpringBootTest1. Полный тест на весь контекст2. Изменение properties3. Тесты с определенным скоупом – пакет/конфигурация/автоскан

Page 222: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Зачем нужен @TestConfiguration1. Если нужно не прерывать сканирование @SpringBootTest2. Изолированные тесты (игнорируется при сканировании)

Page 223: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Зачем нужен @SpringBootConfiguration1. Прерывать сканирование инициированное @SpringBootTest

Page 224: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Есть два типа тестовКакой сам выберешь, а какой разработчику оставишь?

Простой Сложный

Page 225: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Простой Сложный

Понятный

Есть два типа тестовКакой сам выберешь, а какой разработчику оставишь?

Page 226: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Не боимся залезать в кишки приложения2. Spring Boot богат на инструменты для тестирования3. Но вносит свои ограничения – структура тестов

Выводы

Page 227: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Шкала Тестов

UnitComponent Test

Microservice TestSystem Test

➯ ➯➯ ➯ Следующий доклад

Page 228: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Unit Component Microservice

Что нужно Junit/Mockito @ContextConfiguration @SpringBootTest

Кто управляет new Spring Spring Boot

Page 229: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

QA

229

Page 230: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. @ComponentScan > @TestConfiguration > @Configuratin! @ComponentScan находит даже @TestConfiguration

2. @DataJpaTest > @SpringBootTest3. @DataJpaTest и @WebMvcTest должны быть в отдельных пакетах

Если есть сомнения – смотри автора! Juergen Hoeller*

Дополнительно

Page 231: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

Замечания1. Spring для Unit тестирования может быть быстрым

Page 232: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Spring для Unit тестирования может быть быстрым2. Кэш контекстов – хрупкая штука

Замечания

Page 233: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Spring для Unit тестирования может быть быстрым2. Кэш контекстов – хрупкая штука3. Для тестов – только @TestConfiguration

Замечания

Page 234: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Spring для Unit тестирования может быть быстрым2. Кэш контекстов – хрупкая штука3. Для тестов – только @TestConfiguration4. Изолировать группы тестов с помощью

Замечания

Page 235: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Spring для Unit тестирования может быть быстрым2. Кэш контекстов – хрупкая штука3. Для тестов – только @TestConfiguration4. Изолировать группы тестов с помощью

a. выделения в пакетыb. @SpringBootConfiguration

Замечания

Page 236: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Spring для Unit тестирования может быть быстрым2. Кэш контекстов – хрупкая штука3. Для тестов – только @TestConfiguration4. Изолировать группы тестов с помощью

a. выделения в пакеты (особенно для @*Test)b. @SpringBootConfiguration

5. SpringBootTest надо в основном использоватьдля микросервис тестов

Замечания

Page 237: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Spring для Unit тестирования может быть быстрым2. Кэш контекстов – хрупкая штука3. Для тестов – только @TestConfiguration4. Изолировать группы тестов с помощью

a. выделения в пакетыb. @SpringBootConfiguration

5. SpringBootTest надо в основном использоватьдля микросервис тестов

6. Если есть DirtiesContext – стоит задуматься :)

Дополнительно

Page 238: Тестируем и плачем · Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Unit/Component тесты. Для чего? Ваши

1. Demo Source with Spring Boot 2.1 and Gradle — https://github.com/lavcraft/spring-boot-curse

2. Old Demo Source with Spring Boot 1.5 and Maven — https://github.com/lavcraft/conference-test-with-spring-boot-test

3. Spring Test Reference Guide4. Spring Boot Test Reference Guide5. Spring 1.4 Test Improvements6. Custom Test Slice with Spring Boot

Ссылки