Richtige Integration-Tests mit Testcontainern

A presentation at Java Forum Nord in September 2018 in Hanover, Germany by Philipp Krenn

Slide 1

Slide 1

Philipp Krenn @xeraa Integration- Tests mit

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

Integration 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

Embedded

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

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 35

Slide 35

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

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

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

Slide 41

Slide 41

Docker Compose integration @ClassRule public static DockerComposeContainer environment = new DockerComposeContainer(new File("src/test/resources/compose.yml")) .withExposedService("elasticsearch_1", ELASTICSEARCH_PORT, Wait.forHttp("/").forStatusCode(200));

Slide 42

Slide 42

Demo

Slide 43

Slide 43

! IDE support, customization, custom lifecycle ! Version definition, fixed config

Slide 44

Slide 44

Cleanup: Moby Ryuk https://github.com/testcontainers/moby-ryuk

Slide 45

Slide 45

[Ryuk] drops a Death Note, a notebook that allows the user to kill anyone simply by knowing their name and face https://en.wikipedia.org/wiki/Ryuk_(Death_Note)

Slide 46

Slide 46

Slide 47

Slide 47

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

Slide 48

Slide 48

Work in progress https://github.com/testcontainers/testcontainers-java/pull/ 826 Set (randomized) port

Slide 49

Slide 49

Demo

Slide 50

Slide 50

More languages Scala, Go, .net , JavaScript * * Early development *

Slide 51

Slide 51

Selenium 2 / Webdriver VNC screen recording

Slide 52

Slide 52

! IDE support, customization, custom lifecycle ! Custom integration

Slide 53

Slide 53

Slide 54

Slide 54

Docker in Docker Or sidecar

Slide 55

Slide 55

$ docker run -it --rm -v $PWD:$PWD -w $PWD -v /var/run/docker.sock:/var/run/docker.sock maven:3 mvn --projects parent,4_testcontainers-custom test $ docker ps -a

Slide 56

Slide 56

Conclusion

Slide 57

Slide 57

Why Integration Tests

Slide 58

Slide 58

Why not Mocking In-Memory Actual Datastore

Slide 59

Slide 59

How In-Process Build Tool Testcontainers

Slide 60

Slide 60

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

Slide 61

Slide 61

Questions? Philipp Krenn @xeraa