Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Integration testing with TestСontainers and JUn...
Search
Nikolay Kuznetsov
December 09, 2019
Programming
0
170
Integration testing with TestСontainers and JUnit 5
Nikolay Kuznetsov
December 09, 2019
Tweet
Share
More Decks by Nikolay Kuznetsov
See All by Nikolay Kuznetsov
Integration testing with TestСontainers-Go
nikolayk812
0
130
Integration testing with TestContainers-Go
nikolayk812
0
270
TestContainers + JUnit 5 = elegant integration and e2e tests for microservices
nikolayk812
2
360
Integration and end-to-end testing with TestСontainers
nikolayk812
0
120
Integration and end-to-end testing with TestСontainers
nikolayk812
0
29
Other Decks in Programming
See All in Programming
Fundamentals of Software Engineering In the Age of AI
therealdanvega
2
290
AI 開発合宿を通して得た学び
niftycorp
PRO
0
160
モダンOBSプラグイン開発
umireon
0
170
安いハードウェアでVulkan
fadis
0
750
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
2.6k
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
8.3k
AHC061解説
shun_pi
0
410
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
170
[SF Ruby Feb'26] The Silicon Heel
palkan
0
120
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
240
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
1.1k
How to stabilize UI tests using XCTest
akkeylab
0
140
Featured
See All Featured
Designing for Timeless Needs
cassininazir
0
170
Bash Introduction
62gerente
615
210k
BBQ
matthewcrist
89
10k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
490
How to train your dragon (web standard)
notwaldorf
97
6.6k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
300
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
160
Rails Girls Zürich Keynote
gr2m
96
14k
Why Our Code Smells
bkeepers
PRO
340
58k
Building Adaptive Systems
keathley
44
3k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Accessibility Awareness
sabderemane
0
84
Transcript
Integration testing with TestСontainers and JUnit 5 Nikolay Kuznetsov @nikolayk812
Helsinki JUG Zalando 9 December 2019
About me • Go developer at Zalando Wardrobe • 6+
years of Java experience • Conference speaker: ◦ Voxxed Days Cluj, Container Days Hamburg • TestContainers-Go contributor
Why integration testing?
2 unit tests, 0 integration tests
Basic integration test
Trade-offs Test Runtime
Integration testing evolution • In-memory mocking • Local DBs •
Vagrant • Docker / Docker Compose • Docker API
Docker advantages • 100% compatible database • Same version as
production • Empty or known state
Docker architecture
How to start a container for test? • Shell scripts
• Maven plugin • Docker Compose • Docker API • MiniKube, Kubernetes
Shell scripts
Maven plugins github.com/fabric8io/docker-maven-plugin
Docker Compose
Docker API docs.docker.com/engine/api/latest
Exec example
None
TestContainers flavors
TestContainers Java • github.com/testcontainers/testcontainers-java • Wraps docker-java library • Docker
environment discovery • Host port randomization • Containers clean up on JVM shutdown • Readiness waiting strategies
As simple as var redis = new GenericContainer("redis:5.0.6") .withExposedPorts(6379); var
postgres = new PostgreSQLContainer();
Docker environment discovery
Talking to Docker via UDS • curl --unix-socket /var/run/docker.sock http:/localhost/containers/json
• curl --unix-socket /var/run/docker.sock http:/localhost/networks
Host port randomization • To prevent port conflicts • Enables
parallel builds • API to get a host port
Containers cleanup https://github.com/testcontainers/moby-ryuk
Waiting strategies • Host port • HTTP • Log message
• Docker healthcheck • Combined / Custom
Host port waiting strategy • Default: at first exposed port
with timeout of 60s • Both from outside and inside container
Internal port check
HTTP waiting strategy • Status & response body predicate
Demo setup User Service
Demo scenario User Service INSERT INTO SELECT FROM
Demo github.com/nikolayk812/hjug-tc-demo
Demo recap • JUnit 5 Extension API • TestContainer modules
JUnit 5 extension points • Life-cycle callbacks • Conditional execution
• Parameter resolution • Exception handling
JUnit 5 extension logic • Implement interface(s) from o.j.j.api.extension package
◦ i.e. BeforeEachCallback, ExecutionCondition • Register with @ExtendsWith annotation • See @Testcontainers for reference
TestContainers modules • Preconfigured, optimized for testing • Wrappers on
top of GenericContainer class • 14 databases • MockServer, LocalStack, Kafka, ToxiProxy
Demo-2: setup User Service
Demo-2: Docker network User Service user-alias: 8083 postgres-alias: 5432 localhost:
32812
Demo-2: scenario User Service POST /users GET /user/<id>
Demo-2 github.com/nikolayk812/hjug-tc-demo
Demo-2: recap • Docker network and alias
Why end-to-end testing? • Business flows across multiple services •
Regression, when ◦ + new service ◦ - legacy service
Some cluster Spring Cloud Kubernetes
E2E strategies • Against a deployed cluster • Against on-demand
in memory cluster
Deployed cluster cons • Replace a service with a newer
version => instability • Temporary service name => non-discoverable • Unexpected databases states ◦ Care to clear data after the test?
On-demand cluster cons • Time to start all containers •
Memory + CPU • How actually to create it?
On-demand Kubernetes for E2E?
YAGNI
On-demand cluster TC approach • Each service started by TestContainers
• Shared Docker network • Functional tests • Unless testing Kubernetes manifests
E2E setup User Service Item Service
Hints • Host port forwarding Testcontainers.exposeHostPorts() • Fixed host port
(for remote debugging) GenericContainer.addFixedExposedPort() • Reusable containers github.com/testcontainers/testcontainers-java/issues/781
Takeaways • https://testcontainers.org • Balance between flexibility, speed and features
• Works on Mac, Linux, Windows • Great for integration tests! • Possible to use for end-to-end tests
Thank you! @nikolayk812 nikolayk812 nikolayk812