Testcontainers for Real Integration Tests

A presentation at SwanseaCon in September 2018 in Swansea, UK by Philipp Krenn

Slide 1

Slide 1

Philipp Krenn @xeraa Real Integrat- ion Tests with

Slide 2

Slide 2

Developer

Slide 3

Slide 3

Tests

Slide 4

Slide 4

Slide 5

Slide 5

Slide 6

Slide 6

But the unit tests passed, so... https://twitter.com/Aaronius/status/ 933497253347463168

Slide 7

Slide 7

Slide 8

Slide 8

Slide 9

Slide 9

Slide 10

Slide 10

Slide 11

Slide 11

Ok — we need Interation Tests

Slide 12

Slide 12

Mocks

Slide 13

Slide 13

Mockito, EasyMock, JMock,...

Slide 14

Slide 14

Slide 15

Slide 15

Ich mock mir die Welt widdewidde wie sie mir gefällt

Slide 16

Slide 16

! Unit tests, systems not under your control ! Test real datastore

Slide 17

Slide 17

In-Memory

Slide 18

Slide 18

H2, HSQLDB, Apache Derby,...

Slide 19

Slide 19

Slide 20

Slide 20

Embedded Elasticsearch unsupported in 5.0+ https://www.elastic.co/blog/elasticsearch-the-server

Slide 21

Slide 21

! Often good enough ! Test real datastore, supported systems

Slide 22

Slide 22

Actual Datastore

Slide 23

Slide 23

Local installation Docker container Cloud

Slide 24

Slide 24

Demo

Slide 25

Slide 25

! "Good old approach" ! External dependency, parallelization

Slide 26

Slide 26

In-Process

Slide 27

Slide 27

embedded-elasticsearch https://github.com/allegro/embedded-elasticsearch

Slide 28

Slide 28

Demo

Slide 29

Slide 29

Customization & Mappings .withPlugin("analysis-stempel") .withIndex("cars", IndexSettings.builder() .withType("car", getSystemResourceAsStream("car-mapping.json"))

Slide 30

Slide 30

! IDE support, customization, custom lifecycle ! Custom integration

Slide 31

Slide 31

More embedded datastores https://github.com/flapdoodle-oss/ de.flapdoodle.embed.process

Slide 32

Slide 32

Build Tool

Slide 33

Slide 33

docker-maven-plugin http://dmp.fabric8.io

Slide 34

Slide 34

Build a custom image: docker:build Run container: docker:start & docker:stop

Slide 35

Slide 35

Dockerfile or Docker assembly <build> <from>java:8</from> <assembly> <descriptor>docker-assembly.xml</descriptor> </assembly> <cmd> <shell>java -jar /maven/service.jar</shell> </cmd> </build>

Slide 36

Slide 36

Demo

Slide 37

Slide 37

maven-failsafe-plugin https://maven.apache.org/surefire/maven-failsafe-plugin/

Slide 38

Slide 38

! Standard or custom Docker image ! One instance for all tests, no IDE support

Slide 39

Slide 39

Testcontainers

Slide 40

Slide 40

Testcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases [...] that can run in a Docker container.

Slide 41

Slide 41

Dependency @ClassRule public static GenericContainer redis = new GenericContainer("redis:3.0.2") .withExposedPorts(6379);

Slide 42

Slide 42

Slide 43

Slide 43

testcontainers-javamodule-elasticsearch https://github.com/dadoonet/testcontainers-java-moduleelasticsearch

Slide 44

Slide 44

Work in Progress https://github.com/testcontainers/testcontainers-java/pull/ 826

Slide 45

Slide 45

Demo

Slide 46

Slide 46

Todo Set (randomized) port

Slide 47

Slide 47

! IDE support, customization, custom lifecycle ! Custom integration

Slide 48

Slide 48

Slide 49

Slide 49

Containerized CI? Sidecar Or embedded approach

Slide 50

Slide 50

Conclusion

Slide 51

Slide 51

Why Integration Tests

Slide 52

Slide 52

Why not Mocking In-Memory Actual Datastore

Slide 53

Slide 53

How In-Process Build Tool Testcontainers

Slide 54

Slide 54

Code https://github.com/xeraa/integration-test-demo

Slide 55

Slide 55

Questions? Philipp Krenn @xeraa