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
TestContainers - integration testing without the hassle
Search
Sergei Egorov
November 16, 2016
Programming
1
350
TestContainers - integration testing without the hassle
Presented @ TopConf Tallinn
Sergei Egorov
November 16, 2016
Tweet
Share
More Decks by Sergei Egorov
See All by Sergei Egorov
SnowOne 2020: Jabel – retrofitting Java Compiler by instrumenting it!
bsideup
1
270
JUGBB2020: Testcontainers - Past, Present, Future
bsideup
1
170
Presentation: Reactive: Do. Or do not. There is no try.
bsideup
1
980
Devoxx MA: Testcontainers deep dive
bsideup
1
110
Jokerconf 2019: Testcontainers: a year-in-review
bsideup
1
270
GeekOut 2019: Don’t be Homer Simpson with your Reactor!
bsideup
0
560
DevClub Tallinn: How to Make Your OSS Project Successful
bsideup
1
450
Pivotal Toronto 2019: Don’t be Homer Simpson with your Reactor!
bsideup
0
55
GeeCON 2019: Testcontainers: a year-in-review
bsideup
1
2.2k
Other Decks in Programming
See All in Programming
OpenAPIを中心に考えるAPI開発入門 / Introduction to API Development with a Focus on OpenAPI
seike460
PRO
2
110
受託開発でGitLab CI を活用していく
xiombatsg
1
270
Front-end application development, Symfony-style(s)
dunglas
2
1.9k
SwiftUI Performance 不要なViewの再描画と更新を抑える
bigamitiongit
1
160
What We Can Learn From OSS
inouehi
0
400
9年開発を牽引して見えてきた、共通化すべきものと個別でつくるもの ~プログラム言語~
shinout
1
640
Elm Form Validation
bkuhlmann
0
500
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
Doctrine ORMでValue Objectを扱う方法4選 #phpstudy / 4 ways to handle Value Objects with Doctrine ORM
77web
4
110
データアナリストが行うDatabricksを活用したETLの自動化事例
shinoa
0
250
try! Swift Tokyo 2024 参加報告 / try! Swift Tokyo 2024 Report
hironytic
0
170
try! Swift Tokyo 初参加報告LT
hinakko2
0
190
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1355
200k
Debugging Ruby Performance
tmm1
70
11k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
1
1.3k
Thoughts on Productivity
jonyablonski
57
3.8k
Facilitating Awesome Meetings
lara
41
5.6k
Gamification - CAS2011
davidbonilla
76
4.6k
What's in a price? How to price your products and services
michaelherold
237
11k
Clear Off the Table
cherdarchuk
83
310k
Unsuck your backbone
ammeep
662
57k
Building a Modern Day E-commerce SEO Strategy
aleyda
16
6.3k
Designing the Hi-DPI Web
ddemaree
276
33k
Testing 201, or: Great Expectations
jmmastey
27
6.3k
Transcript
TestContainers Integration testing without the hassle Sergei @bsideup Egorov
Integration testing Why it matters?
Verify how your software product will behave in real-world conditions
Isolated from other system components to avoid false negatives
Real: databases, file systems, network interfaces, …
Grey box testing - we know some inner details, but
mostly use public APIs
None
Unit testing • Simulation tests are green, yay! • Everything
is mocked • DB is written by others, why should I test it?
Integration testing https://commons.wikimedia.org/wiki/File:Cd4007.jpg • Jeez, how did it passed the
Unit testing? • Is it a smoke? @#$%! YES IT IS! • Who knew that 100w soldering gun was a bit too powerful for it?
System testing https://commons.wikimedia.org/wiki/File:UART_8250_Microchip.jpg • Takes a lot of time to
solder • “Oh no, the power bus is too far away from my microchip!” • Interference between the components
Production
Integration testing Real-world, but isolated testing Spot the issues before
the real environment Can be run during the development You have to start real databases Should be cross-platform Slower than Unit testing Pros Cons
Obvious solution
None
Abstraction layer
CI friendly
Cross-platform
Docker Compose FTW! redis: image: redis ports: - "6379:6379" postgres:
image: postgres ports: - "5432:5432" elasticsearch: image: elasticsearch:5.0.0 ports: - "9200:9200"
But…
No ports randomization redis: image: redis ports: - "6379:6379" postgres:
image: postgres ports: - "5432:5432" elasticsearch: image: elasticsearch:5.0.0 ports: - "9200:9200"
Fighting with Docker environment
There is no place like
There is no place like Except Docker Machine
Can we improve that?
None
Remove the database
Remove the database
None
As simple as PostgreSQLContainer postgresql = new PostgreSQLContainer() GenericContainer
redis = new GenericContainer("redis:3") .withExposedPorts(6379)
TestContainers • https://github.com/testcontainers/testcontainers-java • OSS project by Richard North, supported
by ZeroTurnaround • Declarative Docker Java API wrapper • JUnit rules, can be used with other frameworks like TestNG, Cucumber, etc…
How it works • Wraps https://github.com/docker-java/docker-java • Docker environment discovery
• Will start docker-machine if it’s not started yet • Docker for Mac support • Containers cleanup on JVM shutdown
Use case #1: testing of microservices • REST service •
Java, Spring Boot • Redis and PostgreSQL • Calls some other micro-services
Demo
Use case #2: Docker as Selenium driver • Selenium/Selenide tests
• No need to install Chrome/Firefox/etc • CI friendly
Demo
Use case #3: Java agent testing • Test different Java
versions • Simplify I/O testing • The actual reason why ZeroTurnaround decided to use TestContainers :)
Demo